Vue基础(二)

双向绑定

model变了,view跟着改变

v-bind指令,绑定属性值

【v-】开头的属性都是指令属性,是vue提供的特殊特性(vue自定义的标签)。它们会渲染DOM上应用特殊的响应式行为。

【v-bind】指的是绑定属性,将标签属性【title】的值与View Model的值绑定起来,不用写【{ {message}}】这种模板了。因为有时候需要将model的信息放到标签的属性中,这样使用【v-bind】属性更好。

注意!【{ {message}}】只是输出显示model中的数据message,而【v-bind:title=“message”】则可以将model中的数据message作为属性的值进行绑定。

  • 显示输出,使用【{ {message}}】
  • 作为属性值,使用属性【v-bind:title=“message”】进行绑定

例如:

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <span v-bind:title="message">
                停留在这里查看!
            </span>
        </div>


        <script>
            var vm1 = new Vue({
     
     
                el: "#app",
                data: {
     
     
                    message: "hello vue!"
                }
            })
        </script>
    </body>
</html>

在这里插入图片描述

前端除了绑定事件外,其余的逻辑就是判断与循环了,所以还有两个标签【v-if、v-else】【v-for】

注意!绑定标签中的下级标签仍具有作用域,所以需要一个外部div去绑定vm,在div内部进行相应的逻辑操作!

v-if、v-else-if、v-else指令判断值

有了这个vue标签属性就可以根据后台model的数据不同,显示不同的前台不同的信息。这一点更能体现出ViewModel是连接View与Model的桥梁!

值作为判断条件,是否显示标签

例如:

<html lang="en" xmlns:v-if="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <h1 v-if="flag">{
   
   {message}}</h1>
            <h1 v-else>{
   
   {fail}}</h1>
        </div>

        <script>
            var vm1 = new Vue({
     
     
                el: "#app",
                data: {
     
     
                    flag: true,
                    message: "hello,vue again",
                    fail: "No!I don't want see you!"
                }
            })
        </script>
        
    </body>
</html>

在这里插入图片描述
在这里,使用一个【div】去绑定【vm】,然后其标签的内部就可以使用【vue的属性】也可以使用【model的数据】了!

表达式作为判断条件,是否显示标签

<!DOCTYPE html>
<html lang="en" xmlns:v-if="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <h1 v-if="flag === false">{
   
   {message}}</h1>
            <h1 v-else>{
   
   {fail}}</h1>
        </div>

        <script>
            var vm1 = new Vue({
     
     
                el: "#app",
                data: {
     
     
                    flag: true,
                    message: "hello,vue again",
                    fail: "No!I don't want see you!"
                }
            })
        </script>   
    </body>
</html>

如果【model中的属性flag】绝对等于 false,那么输出【model中的属性message】。但是在这里model中的属性【flag】是 true,所以以上代码会输出【model中的属性fail】的值。
在这里插入图片描述

v-for指令迭代数据

<!DOCTYPE html>
<html lang="en" xmlns:v-for="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>

        <div id="app">
            <!-- "(item, index) in items"这样可以获取值与下标 -->
            <li v-for="item in items">
                {
   
   {item.message}}
            </li>
        </div>

        <script>
            var vm1 = new Vue({
     
     
                el: "#app",
                data: {
     
     
                    items: [
                        {
     
     message: "student1"},
                        {
     
     message: "student2"}
                    ]
                }
            })
        </script>
    </body>
</html>

遍历循环【model中的属性items】将【items中的数据输出】
在这里插入图片描述
注意!for迭代是循环有指令的那个标签!

v-on指令绑定事件

如果你不是用vue进行事件绑定,那么你需要写一个点击事件的函数,函数中修改标签的值(操作DOM元素)。操作DOM元素是很卡的。

所以Vue推出了自己的事件绑定【v-on】

v-on是vm的一个操作,当用户点击按钮后直接修改model的数据,model的数据改变了跟着view的显示数据也会改变。这都是vm在中间做桥梁的效果!

v-on直接操作数据

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <button v-on:click="num = num + 1">点我加一</button>
            <h1>{
   
   {num}}</h1>
        </div>


        <script>
            var vm1 = new Vue({
     
     
                el: "#app",
                data: {
     
     
                    num: 0
                }
            })
        </script>
        
    </body>
</html>

v-on通过回调函数操作数据

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <button v-on:click="addOne">点我加一</button>
            <h1>{
   
   {num}}</h1>
        </div>


        <script>
            var vm1 = new Vue({
     
     
                el: "#app",
                data: {
     
     
                    num: 0
                },
                methods: {
     
     
                    addOne: function () {
     
     
                        // this表示vm1对象
                        this.num += 1
                        console.log(this.num)
                    }
                }
            })
        </script>
        
    </body>
</html>

view变了,model跟着改变

业务场景:

假如有一个【input】标签,它的【placeholder】是【model】的数据。现在点击向【input】中输入数据,【model】中的数据需要跟着改变,在请求时发送【model】才有效!

v-model指令修改model中的数据

可捕捉input、textarea、radio、select标签的值

input:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <!-- 显示model中的数据 -->
            <h1>{
   
   {message}}</h1>
            <input type="text" v-model="message">
        </div>

        <script>
            var vm1 = new Vue({
     
     
                el: "#app",
                data: {
     
     
                    message: ""
                }
            })
        </script>
    </body>
</html>

textarea:

<body>
        <div id="app">
            <textarea cols="10" rows="10" v-model="message"></textarea>

            <p>
                {
   
   {message}}
            </p>
        </div>

        <script>
            var vm1 = new Vue({
     
     
                el: "#app",
                data: {
     
     
                    message: ""
                }
            })
        </script>
    </body>

redio:

<body>
        <div id="app">
            <input type="radio" name="sex" value="" v-model="message"><input type="radio" name="sex" value="" v-model="message"><p>
                {
   
   {message}}
            </p>
        </div>

        <script>
            var vm1 = new Vue({
     
     
                el: "#app",
                data: {
     
     
                    message: ""
                }
            })
        </script>
    </body>

select:

<body>
        <div id="app">
            <select name="sex" v-model="message">
                <option value=""></option>
                <option value=""></option>
                <option value="人妖">人妖</option>
            </select>

            <p>
                {
   
   {message}}
            </p>
        </div>

        <script>
            var vm1 = new Vue({
     
     
                el: "#app",
                data: {
     
     
                    message: ""
                }
            })
        </script>
    </body>

Vue组件

组件其实就相当于一个dom节点(一个dom节点可以含有多个子节点,这样将这个dom节点作为一个模板可以减少代码量)给抽出来成了一个组件(模板)了。

可以使用组件自定义标签

定义一个组件

例如:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <qiu></qiu>
            <qiu></qiu>
        </div>

        <script>
            Vue.component("qiu", {
     
     
                template: '<li>Hello</li>'
            })

            var vm1 = new Vue({
     
     
                el: "#app"
            })
        </script>
    </body>
</html>

这就是【.vue】文件中的【template】的原理

组件中使用model的数据

再难一些:组件循环访问【data】中的数据

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <qiu v-for="item in items" v-bind:q="item"></qiu>
        </div>

        <script>
            Vue.component("qiu", {
     
     
                props: ['q'],
                template: '<li>{
     
     {q}}</li>'
            })

            var vm1 = new Vue({
     
     
                el: "#app",
                data: {
     
     
                    items: ['1', '2', '3']
                }
            })
        </script>
    </body>
</html>

解释:组件是不能直接访问model中的数据的,它只能通过标签==【v-for】循环获取==,通过绑定【q】与【item】传入数据到【component】中的【props】(你可以理解为函数传值,item是实参,q是形参

就算data中不是列表只传入一个值,也需要props进行传值。这就是组件的一个使用方法!

猜你喜欢

转载自blog.csdn.net/qq_43477218/article/details/114892967