Vue.js系列(四):Vue基础指令及数据绑定!

Vue.js系列(四):Vue基础指令及数据绑定!


前言


注意本次用cdn形式引入js学习,有node.js的玩家可以用node.js。CDN下载地址:https://vuejs.org/js/vue.min.js以及Node.js:Vue系列: windows下npm安装vue

今天博主将为大家分享Vue.js系列(四):Vue基础指令及数据绑定!不喜勿喷,如有异议欢迎讨论!

有一个强大的地基才能写出健壮的程序!请先阅读博主关于:Windows10用npm安装Vue!


目标
    学习如何使用Vue
    学习Vue插值,表达式绑定数据和v-指令
    学习基础指令v-show和v-text
    学习数据绑定指令v-model及指令修饰符.number,.trim,.lazy
    学习条件判断指令v-if,v-else,v-else-if的使用
    学习循环指令v-for的使用
    学习动态绑定指令v-bind
    使用v-bind动态绑定class和style属性

1.1.1学习如何使用Vue
在html标签body结束标记之前使用script标签引入vue.js文件
<body>

        ...html代码

        <!-- 引入vue.js -->

        <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    </body>
    
在html中添加一个dom元素作为Vue实例的挂载目标.
    <body>

        <div id="app" class="app">

        </div>

        <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    </body>
创建Vue对象的实例
<body>

        <div id="app" class="app">

        </div>

        <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

        <script type="text/javascript">

            var app = new Vue({

              el: '#app',//可以是css选择器.例如: #app或.app

            });

        </script>

    </body>
我们已经成功创建了第一个Vue应用!
现在数据和DOM已经被建立了关联,所有东西都是响应式的。 

1.1.2 Vue插值及表达式绑定数据

插值

使用双大括号将数据编译成普通文本,并输出到插值的位置.

<body>

    <div id="app" class="app">

        {{msg}}

    </div>

    <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                msg:"hello vue!!!"

            }

        });

    </script>

</body>
  • 插值标签将会被替代为对应数据对象上 msg 属性的值。无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会更新。

  • 打开浏览器的调试工具.修改msg的值.页面上会随之一起更新.

  • Vue的数据绑定是数据驱动.即:当数据发生变化时会触发html页面更新,所有相关联绑定的值也会随之一起变化.

表达式

vue的数据绑定不仅限于简单的属性键值,VUE对所有的绑定,都支持JavaScript表达式绑定

<body>

    <div id="app" class="app">

        <!--绑定三元表达式-->

        {{ count > 0 ? 'yes' : 'no' }}

        <!--绑定一个计算-->

        {{ count + 1 }}

        <!--绑定函数-->

        {{ msg.toUpperCase() }}

    </div>

    <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                msg:"hello vue!!",

                count:0

            }

        });

    </script>

</body>

这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。 13 限制: 不能绑定 语句({{ var a = 1 }}) 逻辑判断({{ if(true){ return msg } }})


1.1.3 基础指令v-text和v-show

指令 (Directives) 是带有 v- 前缀的特殊特性,绑定在DOM标签上。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。

v-text指令

v-text 的效果完全等价于使用双大括号绑定的效果.

<body>

    <div id="app" class="app">

        <span v-text="msg"></span>

    </div>

    <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                msg:"使用v-text指令绑定数据.",

            }

        });

    </script>

</body>

使用v-text和{{ }}绑定的区别.

v-text是指令,只能绑定到dom标签上. {{ }}绑定可以放置在vue挂载目标节点内的任意位置,而不需要额外的dom标签.

v-show指令

<body>

    <div id="app" class="app">

        <span v-show="isShow">我是span标签,你看到我了吗?</span>

    </div>

    <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                isShow:true

            }

        });

    </script>

</body>

v-show指令将根据表达式isShow的值的真假来显示/隐藏元素。 v-show所绑定的元素始终会被渲染并保留在DOM中。v-show只是简单地切换元素的 CSS属性 display。


1.1.4 数据绑定指令v-model及指令修饰符

v-model 绑定数据

v-model 指令(它负责监听用户的输入事件以更新数据)在表单 及 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。

<body>

    <div id="app" class="app">

        <p v-show="isShow">我是p标签,你看到我了吗?</p>

        <label>

            <input name="isshow" type="checkbox" v-model="isShow" />

            显示/隐藏

        </label>

    </div>

    <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                isShow:true

            }

        });

    </script>

</body>

v-model.number修饰符

自动将用户的输入值转为数值类型.

<body>

    <div id="app" class="app">

        <input v-model.number="n" type="number">

        <span v-text="n"></span>

    </div>

    <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                n:1

            }

        });

    </script>
    
</body>

这通常很有用,因为即使在 type=“number” 时,HTML 输入元素的值也总会返回字符串。

v-model.trim修饰符

自动过滤用户输入的首尾空白字符

<body>

    <div id="app" class="app">

        <input v-model.trim="msg" type="text">

        <input v-model="msg2" type="text">

    </div>

    <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                msg:"hello",

                msg2:"hello2"

            }

        });

    </script>

</body>

v-model.lazy修饰符

在默认情况下,v-model 在每次 input (onInput)事件触发后将输入框的值与数据进行同步。你可以添加 lazy 修饰符,从而转变为使用 change (onChange)事件进行同步.

<body>

    <div id="app" class="app">

        <input v-model.lazy="msg" type="text">

    </div>

    <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                msg:"hello",

            }

        });

    </script>

</body>

1.1.5 条件判断指令

v-if,v-else

在vue中使用v-if和v-else指令

<body>

    <div id="app" class="app">

        <span v-if="lowerCase" v-text="msg"></span>

        <span v-else v-text="msg.toUpperCase()"></span>

        <label>

            <input type="checkbox" v-model="lowerCase" />

            大写/小写

        </label>

    </div>

    <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                msg:"hello",

                lowerCase:true

            }

        });

    </script>

</body>

v-else使用限制 : 上一个兄弟节点必须包含 v-if或v-else-if指令之一

v-else-if

v-else-if,顾名思义,充当 v-if 的 else-if

<body>

    <div id="app">

        <label>

            <input type="radio" v-model="sex" value="0">男

        </label>

        <label>

            <input type="radio" v-model="sex" value="1">女

        </label>

        <label>

            <input type="radio" v-model="sex" value="-1">保密

        </label>

        性别:

        <span v-if="sex==0">男生</span>

        <span v-else-if="sex==1">女生</span>

        <span v-else>保密</span>

    </div>

     <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js">   </script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                sex:-1

            }

        });

    </script>

</body>

使用限制 上一个兄弟节点必须包含 v-if或v-else-if指令之一


1.1.6 循环指令v-for的使用

v-for循环数组或对象 表达式是 obj in objs 形式的特殊语法.objs是一个数组或对象,obj是元素迭代的别名.

也可以使用 (obj,index) in objs 形式的表达式.

当循环目标是数组时,第二个参数index是数组的下标.
\
当循环目标是对象时,第二个参数index是对象的键名.

<body>

    <div id="app" class="app">

        <h4>

            使用v-for指令循环一个数组

        </h4>

        <ul>

            <li v-for="l in lessons">

                <span v-text="l"></span>

            </li>

        </ul>

        <ul>

            <li v-for="(l,i) in lessons">

                <strong v-text="i"></strong>

                <span v-text="l"></span>

            </li>

        </ul>

        

        <h4>

            使用v-for指令循环一个对象

        </h4>

        <ul>

            <li v-for="(s,k) in student">

                <strong v-text="k"></strong>

                <span v-text="s"></span>

            </li>

        </ul>

    </div>

    <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js"></script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                student:{

                    id:'1',

                    name:"张三",

                    age:18,

                    sex:0

                },

                lessons:[

                    "html5",

                    "css3",

                    "JavaScript",

                    "vue"

                ]

            }

        });

    </script>

</body>

1.1.7 动态绑定指令v-bind

它是一个 vue 指令,用于绑定 html 属性,v-bind指令可以被简写为:

<body>

    <div id="app">

        <p v-bind:title="title">html属性不能使用双大括号形式绑定,只能使用v-bind指令</p>

    </div>

     <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js">   </script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                title:"title描述"

            }

        });

    </script>

</body>

这里的 html 最后会被渲染成:

<div id="app">

    <p title="title描述">

        html属性不能使用双大括号形式绑定,只能使用v-bind指令

    </p>

</div>

更多的v-bind部分使用场景:

<body>

    <div id="app">

        <!-- 绑定属性 -->

        <img v-bind:src="imgSrc" />

        <!-- 简写 -->

        <img :src="imgSrc" />

        <!-- 字符串拼接 -->

        <img :src="'/images/'+img" />

        <!-- 绑定标签状态 -->

        <button v-bind:disabled="isDis" type="button">按钮</button>

    </div>

     <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js">   </script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                imgSrc:"http://via.placeholder.com/10x10",

                img:"1.jpg",

                isDis:false

            }

        });

    </script>

</body>

1.1.8 使用v-bind动态绑定class和style属性

使用v-bind:class,v-bind:style 绑定多个值,vue 对 class 和 style 这两个 html 属性进行了一定程度的增强。

基于对象绑定针对 class 的增强

<body>

    <div id="app">

        <span class="static" v-bind:class="classObj">

            将对象绑定到class属性上

        </span>

    </div>

     <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js">   </script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                classObj: {

                    "hasError": true,

                    "isActive": false

                }

            }

        });

    </script>

</body>

页面渲染结果:

<span class="static hasError">

    将对象绑定到class属性上

</span>

当isActive或hasError发生变化时,class 列表将相应地更新。例如: isActive的值为true时,class将渲染为:

<span class="static hasError isActive">

    将对象绑定到class属性上

</span>

基于数组绑定针对 class 的增强

<body>

    <div id="app">

        <span class="static" v-bind:class="classArr">

            将数组绑定到class属性上1

        </span>

        <span class="static" v-bind:class="['hasError',isActive?'isActive':'',]">

            将数组绑定到class属性上2

        </span>

    </div>

     <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js">   </script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                isActive:false,

                classArr: [

                    "hasError","isActive"

                ]

            }

        });

    </script>

</body>

页面渲染结果:

<span class="static hasError isActive">

    将数组绑定到class属性上1

</span>

<span class="static hasError">

    将数组绑定到class属性上2

</span>

我们可以把一个数组传给 v-bind:class,以应用一个 class 列表.

如果你也想根据条件切换列表中的 class,可以用三元表达式.

当有多个条件class时这样写有些繁琐。所以在数组语法中也可以使用对象语法:

<span class="static" 

      v-bind:class="['hasError',{activeClassName:isActive}]">

    将数组绑定到class属性上2

</span>

class属性的值仅在 isActive的值为true时包含样式activeClassName.

基于对象绑定针对 style 的增强

v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript对象。CSS属性名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用单引号括起来) 来命名:

<body>

    <div id="app">

        <span class="static" v-bind:style="styleObj">

            将对象绑定到style上

        </span>

    </div>

     <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js">   </script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                styleObj: {

                    color:'red',

                    fontSize:'15px',

                    border:'solid 1px blue'

                }

            }

        });

    </script>

</body>

html渲染结果:

<span style="color: red; 

             font-size: 18px; 

             border: 1px solid blue;">

    将对象绑定到style上

</span>

基于数组绑定针对 style 的增强

<body>

    <div id="app">

        <span class="static" v-bind:style="styleArr">

            将数组绑定到style属性上

        </span>

    </div>

     <script src="https://cdn.bootcss.com/vue/2.5.15/vue.js">   </script>

    <script type="text/javascript">

        var app = new Vue({

            el: '#app',//可以是css选择器.例如: #app或.app

            data:{

                styleArr: [{

                    color: "red"

                }, {

                    backgroundColor: '#ddd'

                }, {

                    fontSize: '20px'

                }]

            }

        });

    </script>

</body>

html渲染结果:

<span style="color: red; 

                 background-color: rgb(221, 221, 221); 

                 font-size: 20px;">

        将组绑绑定到style属性上

    </span>

style绑定数组时,数组中的每个有效的style对象,都将被输出到html标签的style属性中.


总结一下:

    使用script标签引入vue文件
    使用new Vue({...})创建Vue对象的实例
    使用双大括号插值绑定数据
    v-指令使用 v-text 和 v-show 
    使用v-model绑定数据了解v-model的修饰符作用
    学习条件判断指令v-if,v-else和v-else-if
    学习v-for指令输出对象和数组
    动态绑定指令v-bind绑定html标签的一些属性
    使用v-bind动态绑定class和style属性
    绑定class和style时使用对象和数组绑定以及根据表达式条件绑定

勇于尝试(做练习):第二天博主会贴出答案!
    1. 创建一个vue实例页面.并使用指令显示或隐藏一个html节点
    2. 循环输出一个数组或对象
    3. 使用v-bind指令绑定html节点的样式,并通过vue的属性控制

示例如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <title>第1章.基础指令及数据绑定</title>
    <style type="text/css">
        .r {
            color: red;
        }

        .b {
            color: blue;
        }

        .swipe {
            display: block;
            margin: 0px;
            padding: 0px;
        }

            .swipe li {
                width: 100%;
            }
    </style>
</head>
<body>
    <div id="app">

        <!--4.双大括号绑定数据(语句)-->
        <div>
            数字(id): {{id}} , n:{{n}}
        </div>
        <div>
            字符串(msg): {{msg}}
        </div>
        <!--可绑定(对象,函数)不可绑定(语句)-->
        <div>
            对象:{{obj}}<br />
            <span>调用对象的 JSON.stringify(obj,null,2) 2个空格缩进</span>
        </div>
        <div>
            数组:{{arr}}
        </div>
        <!--调用函数-->
        <div>
            调用函数:{{arr.toString()}}
        </div>
        <div>
            调用函数:{{reverseMsg()}}
        </div>
        <!-- 可使用三元表达式 -->
        <div>
            三元表达式:{{show?'显示':'隐藏'}}
        </div>


        <!--vue指令-->
        <div>
            v-text:
            <span v-text="msg"></span>
        </div>
        <div>
            v-show:
            <span v-show="show" v-text="msg"></span>
            <!--控制台修改vm.show=false-->
            <a href="javascript:;">
                <span v-text="show?'隐藏':'显示'"></span>
            </a>
<small>打开控制台修改vm.show看看效果</small>
        </div>
        <div>
            v-model:<br />
            v-model:<input type="text" v-model="msg" /> <br />
            v-model.trim:<input type="text" v-model.trim="msg" /><br />
            v-model.lazy:<input type="text" v-model.lazy="msg" /><br />
            v-model.number:<input type="number" v-model.number="n" />
        </div>

        <div>
            v-if,v-else:<br />
            <span v-if="show" v-text="msg"></span>
            <span v-else v-text="reverseMsg()"></span>
        </div>

        <div>
            v-for:
            <ul>
                <li v-for="n in arr">
                    <span v-text="n"></span>
                </li>
            </ul>
        </div>

        <div>
            v-bind:
            <span v-bind:class="[show?'r':'b']"
                  v-bind:style="[sty,{fontSize:show?'20px':'12px'}]"
                  v-bind:data-num="n"
                  v-text="msg"></span>
            <button v-bind:disabled="show" type="button">
                状态:<span v-text="show?'禁用':'启用'"></span>
            </button>


            <p>
                <strong>v-bind条件组合:</strong>
                <!--控制台修改vm.n++,vm.show=true-->
                <button type="button" v-bind:disabled="show && n>1">
                    按钮状态
                </button>
                条件判断 show:<span v-text="show"></span>, n:<span v-text="n"></span> ,
                <span v-text="'(show && n>3) is:'+(show && n>1)"></span>
            </p>
        </div>

    </div>
    <!--1.引入vue.js-->
    <script src="../../libs/vue/vue.js"></script>
    <script type="text/javascript">
        //2. 实例化vue对象
        var vm = new Vue({
            el: "#app",
            //3. Vue 实例的数据对象.
            /*
             可以通过 vm.$data 访问原始数据对象。
             Vue 实例也代理了 data 对象上所有的属性,
             访问 vm.id 等价于访问 vm.$data.id。
             */
            data: {
                id: 1,
                n: 0,
                msg: "hello vue!",
                show: true,
                obj: {
                    a: 1,
                    b: true,
                    c: "string",
                    d: [6, 7, 8, 9, 0],
                    e: {
                        name: "张三",
                        age: 18,
                        sex: "男"
                    }
                },
                arr: [1, 2, 3, 4, 5],
                sty: {
                    color: 'red',
                    display: 'inline-block',
                    border: 'solid 1px blue'
                }
            },
            methods: {
                reverseMsg: function () {
                    return this.msg.split('').reverse().join('');
                }
            },
            mounted: function () {

            }
        });


        function cat() {
            this.food = "fish";
            this.say = function () {
                console.log("i love " + this.food);

            }
        }
        var dog = { food: "bone" };
        var blackCat = new cat();
        blackCat.say();
        blackCat.say.apply(dog);
    </script>
</body>
</html>

Vue.js系列(四):Vue基础指令及数据绑定!分享完毕了!各位小伙伴快去试试吧!


最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈永佳

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值