Vue 指令

指令

一、表单指令

<body>
<div id="app">
    <!--1. 属性指令: v-model="变量", v-model绑定的变量控制的表单元素的value,
        只要表单发生变化,与其绑定的变量值(data)就会发生变化
        普通表单元素,用v-model直接绑定变量控制value值
      -->
    <input type="text" v-model="v1">
    <input type="text" v-model="v1">
    <textarea name="" id="" cols="30" rows="10" v-model="v1"></textarea>
    <p>v1: {{ v1 }}</p>
    <hr>
    <form action="">
        <!--    单 复选框
        通过v-model的值可以设置单选框是否被选中
        -->
        同意:
        <input type="checkbox" name="agree" v-model="v2">
        <br>
        <!-- 多个复选框
             通过: 复选框可以通过v-model来控制选择那一个,
             通过对应的value值默认设置选中哪一个,是数组的形式
             v-model对应的值也会发生变化
                -->
        <hr>
        多选框 <br>
        男: <input type="checkbox" name="hobbies" value="male" v-model="v3">

        女: <input type="checkbox" name="hobbies" value="female" v-model="v3">
        其他: <input type="checkbox" name="hobbies" value="other" v-model="v3">
        <p>v3: {{ v3 }}</p>
        <hr>
        <!-- 单选框
            单选按钮可以通过v-model 值来控制选择哪一个单选框
            v-model对应的值也会发生变化
        -->
        单选框 <br>
        男: <input type="radio" name="hobbies" value="male" v-model="v4">

        女: <input type="radio" name="hobbies" value="female" v-model="v4">
        其他: <input type="radio" name="hobbies" value="other" v-model="v4">
        <p> v4: {{ v4 }}</p>
        <button type="submit">提交</button>
    </form>

</div>
</body>
<script src="../js/vue.js"></script>
<script>
   new Vue({
        el: '#app',
        data: {
            // 默认值可以决定单选框默认选项
            v1: '',
            // 默认值为true,单-复选框就会被选中,反之不选中
            v2: true, // false
            // 默认选中哪一个复选框或多个,true全选中
            v3: ['male'],
            // 默认选中一个单选框
            v4: 'male',
        }
    })
</script>

总结:

  1. 表单指令:v-model="变量", 通过变量控制绑定表单元素value的值(数据双向驱动)
  2. 只要表单发生了变化与其绑定的变量值(data)也会发生变化,普通表单元素,可以直接通过v-model变量控制value值
  3. 单个的单选框和单个的复选框只有一个可以通过v-model的值可以设置表单是否被选中(true/false)
  4. 多个复选框,可以通过v-model对应变量来控制选择哪几个复选框,列表的形式,只要在页面选择发生了变化,与之对应的data中值也会发生变化,值为true则全选中,false反之
  5. 多个单选框,可以通过v-model的值选择那一个单选框,只能选择一个单选框

二、斗篷指令

出现闪烁的原因

页面上来就把 {{ msg }} 这类代码加载出来了原样现实在屏幕上,但是那会儿vue环境还没有加载好。等环境加载好了之后会把msg又替换成了正常的样子。故这个过程出现了闪烁。

如何解决闪烁?

使用斗篷指令v-cloak,把v-cloak属性所涵盖的标签制成 displaty:none。所以上来就把{{ msg }}这类代隐藏掉了,然后vue加载好了之后 v-cloak属性会自动在标签中移除掉。那么有vue环境了,原来的标签就又显示出来了,故做到了避免页面闪烁。

<style>
   [v-cloak]{
        display: none;
    }
</style>
<body>
<div id="app" v-cloak>
    <p>{{ msg }}</p>
    <p>{{ msg }}</p>
</div>
</body>
<script src="../js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            msg: 1234
        }
    })
</script>

总结:

  1. 使用v-cloak, 创建对应样式进行隐藏
  2. 作用:解决页面闪烁问题(页面会出现{{ }}情况)

三、条件指令

<div id="app">
    <!--
        条件指令
         v-if="true"|false,为假时,页面上不进行渲染,可以隐藏标签找那个的信息,变为注释
         v-show="true"|false, 为假时,在页面中用display:none渲染,虽然没有展示,但是标签内容在页面结构中
    -->
    <p v-if="true"> if 指令</p>
    <p v-show="false">show指令</p>

    <!--
     v-if家族
        v-if
        v-else-if
        v-else
        1. 上分支成立,下分支会被屏蔽
        2.else分支只要在所有分支都为假时显示,且不需要条件
     -->
    <p v-if="v1 ==='1'">if分支</p>
    <p v-else-if="v1=== '2'"> else -if分支1</p>
    <p v-else-if="v1=== '3'"> else -if分支2</p>
    <p v-else="">else分支</p>
</div>
</body>
<script src="../js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            v1: ''
        }
    })
</script>
eg: 动态获取颜色
<style>
    .box {
        width: 400px;
        height: 200px;
    }
    .r {
        background-color: red
    }
    .y {
        background-color: yellow
    }
    .g {
        background-color: green
    }
    .action {
        background-color: pink;
    }
</style>
</head>
<body>
<div id="app">
    <p>
        <button @click="changeC('r')" :class="{action:c==='r'}">红</button>
        <!--<button @click="changeC('red')" :class="c === 'red'? 'action': ''">红</button>-->
        <button @click="changeC('y')" :class="{action:c==='y'}">黄</button>
        <button @click="changeC('g')" :class="{action:c==='g'}">绿</button>
    </p>
    <div class="wrap">
        <div class="box r" v-if="c == 'r'"></div>
        <div class="box y" v-else-if="c ==='y'"></div>
        <div class="box g" v-else-if="c==='g'"></div>
    </div>
</div>
</body>
</body>
<script src="../js/vue.js"></script>
<script>
    // sessionStorage的生命周期与页面标签绑定,当页面标签被关闭,数据会被清空
    // localStorage保存永久保存在数据库中

    // sessionStorage.name = '123'; // 页面关掉及消失
    // localStorage.name = 'randy'; // 永久保存在数据库中
    // localStorage.clear()

    new Vue({
        el: '#app',
        data: {
            // c: 'r'
            c: localStorage.c ? localStorage.c : 'r',
        },
        methods: {
            changeC(args) {
                this.c = args;
                // 每一改变c的值,都会将值同步到前台数据库
                localStorage.c = args;
            },

        }
    });

总结:

  1. 条件指令:v-if v-else-if v-else, 条件判断
  2. 条件指令有两种,
    • 一种为if当条件为假则会隐藏标签在页面中不会看到,
    • 另一种show当条件为假则会隐藏标签,但是在页面还是可以看到,只不过是display进行隐藏了
  3. 条件指令有单分支和多分支,在v-if="可以进行逻辑判断", 在等号右边可以进行逻辑判断
  4. 多分支中,当上分支成立,下分支就不会再执行,else只有在所有分支都不成立才会执行
  5. 将数据保存在浏览器中用两种方式,通过保存用户操作的数据记录,方便下次打开页面再次打开原来界面
    • sessionStorage:的生命周期与页面标签绑定当页面标签被关闭,数据会被清空
    • localStorage:保存永久保存在数据库中,存储的数据都是字符串

img

四、循环遍历

<div id="app">
    <!--
        循环指令
          v-for=""
          语法:
            v-for="成员 in 容器"
            -->
    <!--    1.字符串循环渲染:可以遍历值,也可以遍历值与索引-->
    <!--    字符串遍历获取值,值在前,索引在后面-->
    <p v-for="(v, i) in str">{{ i }}-{{ v }}</p>

    <!--    实现竖线分割字符串-->
    <span v-for="(v, i) in str"><span v-if="i !=0">|</span>{{ v }}</span>
    <!--    数组遍历,可以获取值,也可以获取索引-->
    <p v-for="(v, k) in arr">{{k}}-{{v}}</p>

    <!--    对象循环遍历,可以获取值,键key,索引-->
    <p v-for="(v,k,i) in p">{{v}}-{{k}}——{{i}}</p>

    <!--    循环遍历对象-->
    <div>
        <div v-for="(s,i) in stu">
            <hr v-if="i !=0 ">
            <p v-for="(v, k, i) in s">
                {{ i }}-{{ k }}-{{ v }}
            </p>
        </div>
    </div>
</div>
</body>
<script src="../js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            str: '字符串遍历',
            arr: [1, 4, 2, 5, 3],
            p: {
                name: '兔子',
                color: '粉白',
                price: 6.66,
            },
            stu: [
                {
                    name: "Bob",
                    age: 18
                },
                {
                    name: "Tom",
                    age: 17
                },
                {
                    name: "Jerry",
                    age: 19
                }
            ]
        }
    })
</script>

eg: 评论与删除
<body>
<div id="app">
    <input type="text" v-model="msg">
    <button @click="send_msg">留言</button>
    <ul>
        <li v-for="(v, i) in comment " @click="deleteMsg(i)">{{ v }}</li>
    </ul>
</div>
</body>
<script src="../js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            msg: '',
            comment: []
        },
        methods: {
            send_msg() {
                if (this.msg) {
                    this.comment.push(this.msg);
                    this.msg = ""
                }
            },
            deleteMsg(i) {
                // splice参数:开始索引操作长度,操作的结果
                this.comment.splice(i, 1)
            }
        }
    })
</script>

img

总结:

  1. 循环指令:循环遍历数据,语法 v-for="成员 in 容器"
  2. 循环遍历字符串:可以获取字符串的值也可以获取字符串的索引,在成员中第一个位值,第二个为索引
  3. 循环遍历数字:可以获取数组的值也可以获取数据的索引,在成员中第一个位置为值,第二个位置为索引
  4. 循坏遍历对象:可以获取对象中的值可以获取键key和索引,在成员中第一个位置为值,第二个位置为key,在第三个位置为索引
  5. 支持双重循坏,注意的是在使用循坏嵌套的时候,注意标签的嵌套

五、分隔符成员

作用是可以自己定制vue被识别的模板语言符号, 比如jinja2的模板语言默认使用{{变量名}},我们的vue默认也使用{{变量名}}就会有冲突,可以通过自定义delimiters分隔符号来解决这类问题。

<body>
<div id="app">
    <p>{{ }}</p>
    <p>{[num]}</p>
</div>
</body>
<script src="../js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            num: 100,
        },
        //用来修改插值表达式符号
        delimiters: ["{[", "]}"]
    })
</script>

总结:

  1. 作用:可以会与python中模板语法冲突,可以修改获取数据的格式,delimiters: ["{[", "]}"]
  2. 使用:实例成员,delimiters: ["{[", "]}"],两个参数

六、计算属性成员

应用场景:一般用在computed用来解决一个变量值依赖一个或多个变量值,computed内部书写方法 - 管理可以监听多个变量的方法
1)方法名 可以直接作为变量被渲染,值为方法的返回值
2) 在方法名被渲染后(在页面中使用了),方法内部的所有变量都会被监听

<div id="app">
    <input type="text" v-model="v1">
    +
    <input type="text" v-model="v2">
    =
    <button>{{ res }}</button>
</div>
</body>
<script src="../js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            v1: '',
            v2: '',
            // res: ''
        },
        /*
        * 1. computed中定义的方法是属性,data中定义的也是属性,所以不需要重复定义(省略data中的)
        * 2. 方法属性的值来源于绑定的方法的返回值
        * 3. 方法属性必须在页面中渲染后,绑定的方法才会被调用
        * 4. 在定义方法属性中出现所有变量都会被监听,任何变量值改变都会调用一次方法属性
        * 5. 方法属性值不能手动设置,必须通过绑定的方法进行设置
        * */
        computed:{
            res(){
                console.log('相关属性便我就变');
              return this.v1 && this.v2 ? +this.v1 + +this.v2: ""
            }
        }
    })
</script>

总结:

  1. 使用:添加computed实例成员,在里面编写属性方法
  2. 作用:将属性变为方法属性(函数), 相当于将属性变为方法
  3. computed中定义的方法是属性,data中定义的也是属性,所以不需要重复定义(省略data中的)
  4. 方法属性的值来源于绑定的方法的返回值
  5. 方法属性必须在页面中渲染后,绑定的方法才会被调用
  6. 在定义方法属性中出现所有变量都会被监听,任何变量值改变都会调用一次该方法属性
  7. 方法属性值不能手动设置,必须通过绑定的方法进行设置

七、属性的监听

应用场景:watch用来解决多个变量值依赖一个变量值,或者一个变量改变想触发的功能, watch内部书写方法 - 管理 监听绑定的属性(提前要存在) 的方法
1) 方法名 被监听的变量名(属性)
2) 在方法名被渲染后,方法名代表的属性值改变,绑定的方法就会被调用
3) 返回值没有任何意义

<div id="app">
    <p>
        姓名:<input type="text" v-model="full_name">
    </p>
    <p>
        姓:<span>{{ first_name }}</span>
    </p>
    <p>
        名:<span>{{ last_name }}</span>
    </p>
</div>
</body>
<script src="../js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            full_name: '',
            first_name: '',
            last_name: '',
        },
        watch: {
            full_name() {
                /*
                * 1. watch中给已有的属性设置监听方法,对自身属性设置监听
                * 2.监听的属性值一旦发生更新,就会调用监听方法,在方法中完成相应的逻辑
                * 3. 监听方法不需要返回值(返回值只有主动结束方法的作用)
                * */
                console.log("我被一直监听");
                if (this.full_name.length == 2) {
                    arr = this.full_name.split('');
                    this.first_name = arr[0];
                    this.last_name = arr[1];
                }
            },
        },
    })
</script>

总结:

  1. 使用:添加成员变量watch,在里面编写属性函数
  2. 作用:为自身设置属性函数,自己监听自己,在data中不能去除
  3. watch中给已有的属性设置监听方法,对自身属性设置监听
  4. 监听的属性值一旦发生更新,就会调用监听方法,在方法中完成相应的逻辑
  5. 监听方法不需要返回值(返回值只有主动结束方法的作用)

七、总结

  1. v-model 表单指令

    1. 表单指令:v-model="变量", 通过变量控制绑定表单元素value的值(数据双向驱动)
    2. 只要表单发生了变化与其绑定的变量值(data)也会发生变化,普通表单元素,可以直接通过v-model变量控制value值
    3. 单个的单选框和单个的复选框只有一个可以通过v-model的值可以设置表单是否被选中(true/false)
    4. 多个复选框,可以通过v-model对应变量来控制选择哪几个复选框,列表的形式,只要在页面选择发生了变化,与之对应的data中值也会发生变化,值为true则全选中,false反之
    5. 多个单选框,可以通过v-model的值选择那一个单选框,只能选择一个单选框
  2. v-vloak 斗篷指令

    1. 使用v-vloak, 创建对应样式进行隐藏
    2. 作用:解决页面闪烁问题(页面会出现{{ }}情况)
  3. v-if 条件指令

    1. 条件指令:v-if v-else-if v-else, 条件判断
    2. 条件指令有两种,
      • 一种为if当条件为假则会隐藏标签在页面中不会看到,
      • 另一种show当条件为假则会隐藏标签,但是在页面还是可以看到,只不过是display进行隐藏了
    3. 条件指令有单分支和多分支,在v-if="可以进行逻辑判断", 在等号右边可以进行逻辑判断
    4. 多分支中,当上分支成立,下分支就不会再执行,else只有在所有分支都不成立才会执行
    5. 将数据保存在浏览器中用两种方式,通过保存用户操作的数据记录,方便下次打开页面再次打开原来界面
      • sessionStorage:的生命周期与页面标签绑定当页面标签被关闭,数据会被清空
      • localStorage:保存永久保存在数据库中
  4. v-for 循环指令

    1. 循环指令:循环遍历数据,语法 v-for="成员 in 容器"
    2. 循环遍历字符串:可以获取字符串的值也可以获取字符串的索引,在成员中第一个位值,第二个为索引
    3. 循环遍历数字:可以获取数组的值也可以获取数据的索引,在成员中第一个位置为值,第二个位置为索引
    4. 循坏遍历对象:可以获取对象中的值可以获取键key和索引,在成员中第一个位置为值,第二个位置为key,在第三个位置为索引
    5. 支持双重循坏,注意的是在使用循坏嵌套的时候,注意标签的嵌套
  5. delimiters 分隔符成员

    1. 作用:可以会与python中模板语法冲突,可以修改获取数据的格式,delimiters: ["{[", "]}"]
    2. 使用:实例成员,delimiters: ["{[", "]}"],两个参数
  6. computed 计算属性成员

    1. 使用:添加computed实例成员,在里面编写属性方法
    2. 作用:将属性变为方法属性(函数), 相当于将属性变为方法
    3. computed中定义的方法是属性,data中定义的也是属性,所以不需要重复定义(省略data中的)
    4. 方法属性的值来源于绑定的方法的返回值
    5. 方法属性必须在页面中渲染后,绑定的方法才会被调用
    6. 在定义方法属性中出现所有变量都会被监听,任何变量值改变都会调用一次该方法属性
    7. 方法属性值不能手动设置,必须通过绑定的方法进行设置
  7. watch 属性的监听

    1. 使用:添加成员变量watch,在里面编写属性函数
    2. 作用:为自身设置属性函数,自己监听自己,在data中不能去除
    3. watch中给已有的属性设置监听方法,对自身属性设置监听
    4. 监听的属性值一旦发生更新,就会调用监听方法,在方法中完成相应的逻辑
    5. 监听方法不需要返回值(返回值只有主动结束方法的作用)
posted @ 2019-11-17 14:51  RandySun  阅读(279)  评论(0编辑  收藏  举报