vue常用指令

2,912 阅读10分钟

vue常用指令列表


v-once

默认情况下, vue事件是可以重复触发的,但是在特定的情况下, 我们只想要事件执行一次.所以就有了v-once

<div id="app">
    <input type="text" placeholder="请输入数据" v-model="name">
    <p v-once>{{ name }} <span>我会进行一次渲染</span></p>
    <p>{{ name }} <span>我会进行多次渲染</span></p>
</div>
    
<script>
    new Vue({
        el: "#app",
        data:({
             name:"张三",
        })
    })
</script>

v-cloak

vue如果渲染的时候使用的是{{data}}进行渲染的话,在网络不好的情况,会显示{{data}},这样子的用户体验并不好,所以就有了 v-cloak 这个指令

<style>
    [v-cloak] {
    /* v-cloak 必须配合这个style 进行隐藏 */
        display: none;
    }
</style>

<div id="app">
    <p v-cloak>{{ name }} <span>如果网络差,我则不会显示</span></p>
    <p>{{ name }} <span>无论网络状态如何 ,我都会显示</span></p>
</div>

<script src="vue.js"></script>

<script>
    new Vue({
        el: "#app",
        data: ({
            name: "张三",
        })
    })
</script>

v-text and v-html

v-text 等同于 innerText
v-html 等同于 innerHTML

<div id="app">
    <!-- 数据插值 : 把数据插入到指定位置 ,并且不会覆盖原有的内容 -->
    <p>{{name}}</p>
    <p>+++++n{{name}}+++++</p>
    <!-- 数据插值 : 不会解析HMTL标签 -->
    <p>{{span}}</p>
    <!-- v-text 直接渲染数据, 并且会覆盖原有的数据 -->
    <p v-text="name"></p>
    <p v-text="name">++++++++++</p>
    <!-- v-text 不会渲染 HTML 标签 -->
    <p v-text="span"></p>
    <!-- v-html 会覆盖原有数据, 并且可以渲染数据和html标签 -->
    <p v-html="name">+++++++++</p>
    <p v-html="span">+++++++++</p>
</div>
<script>
    new Vue({
        el: "#app",
        data: ({
            name: "张三",
            span: "<span> 我是span标签 </span>"
        })
    })
</script>

v-if and v-else-if and v-else

<div id="app">
    <!-- v-if 如果为假, 则压根不会创建元素  -->
    <input type="text" v-model="age">
    <!-- v-if 会接收数据模型中的数据 , 判断是否是真 ,为真就显示  -->
    <p v-if="show">我会显示</p>
    <p v-if="hidden">我不会显示</p>
    <p>------</p>
    <!-- v-if 可以接收行内表达式 -->
    <p v-if="age >= 18">成年人</p>
    <p v-if="age < 18">未成年</p>
    <!-- 也可以接收直接传值 -->
    <p v-if="true">我会显示</p>
    <p v-if="false">我会显示</p>
    <!-- v-if 也可以搭配 v-else 和 v-else-if 进行使用  -->
    <!-- v-else-if如果不需要, 也是可以省略的 , 但是需要主要注意的是 ,else必须紧跟if后面 -->
    <input type="text" v-model="abc">
    <p v-if="abc === 'a'">a</p>
    <p v-else-if="abc === 'b'">b</p>
    <p v-else-if="abc === 'c'">c</p>
    <p v-else>not abc</p>
</div>

<script>
    new Vue({
        el: "#app",
        data: ({
            show: true,
            hidden: false,
            age: 18,
            abc: "a"
        })
    })
</script>

v-show

<div id="app">
    <!-- v-show 和 v-if 特性相同, 而不同之处则是它无论条件是否成立 ,都会创建元素, 控制display,而v-if则会动态创建元素与否 -->
    <p v-show="show">我会显示</p>
    <p v-show="hidden">我不会显示</p>

    <p v-show="true">我会显示</p>
    <p v-show="false">我不会显示</p>

    <input type="text" v-model="age">
    <p v-show="age >= 18">我会显示</p>
    <p v-show="age < 18">我不会显示</p>
</div>

<script>
    new Vue({
        el: "#app",
        data: ({
            show: true,
            hidden: false,
            age: 18
        })
    })
</script>

v-model

<div id="app">
    <input placeholder="请输入数据" type="text" v-model="name">
    <p>{{ name }}</p>
</div>


<script>
    new Vue({
        el: "#app",
        data: ({
            name: "张三",
        })
    })
</script>

v-for

<div id="app">
    <!-- 单属性 -->
    <!-- <li v-for="value in list">{{value}}</li> -->
    <ul>
        <!-- 遍历数组 -->
        <li v-for="(value,index) in listArr">{{index}}---{{value}}</li>
    </ul>
    <ul>
        <!-- 遍历对象 -->
        <li v-for="(value,key) in listObj">{{key}} --- {{value}}</li>
    </ul>
    <ul>
        <!-- 遍历字符 -->
        <li v-for="(value,index) in 'abcdefghijklmn'">{{index}}---{{value}}</li>
    </ul>
    <ul>
        <!-- 遍历数字 -->
        <li v-for="(value,index) in 10">{{index}}---{{value}}</li>
    </ul>
</div>


<!-- v-for 相当于 js 中的 for in 循环 -->
<!-- v-for 可以循环遍历   数组 / 对象 / 字符 / 数字 -->
<script>
    new Vue({
        el: "#app",
        data: ({
            listArr: ["张三", "李四", "王五", "赵六"],
            listObj: {
                name: "张三",
                age: "18",
                sex: "男"
            }
        })
    })
</script>

v-bind

<div id="app">
    <!-- value 绑定 -->
    <input type="text" v-bind:value="name">
    <input :value="name" type="text">
    <input :value="age + 10 " type="text">
</div>
<!-- v-bind 可以给元素的属性动态绑定数据 -->
<!-- v-bind 取值特点: 只要是一个合法的 js 表达式即可 -->
<!-- v-bind 可以简写为   :    -->
<script>
    new Vue({
        el: "#app",
        data: ({
            name: "张三",
            age: 18,
        })
    })
</script>

v-bind绑定类名

    <style>
        .size {
            font-size: 25px;
            font-weight: bold;
        }

        .color {
            color: red;
        }

        .active {
            background: skyblue;
        }
    </style>
<div id="app">
    <!--v-bind 动态绑定类名 -->
    <p :class="['size','color','active']">我是段落</p>
    <!--v-bind 按需加载类名-->
    <p :class="['size','color', flag ? 'active' : '' ]">按需加载active</p>
    <!--v-bind 对象方式按需加载-->
    <p :class="['size','color',{active:false}]">对象当时按需加载</p>
    <!--v-bind 获取data中的对象进行加载-->
    <p :class="obj">获取data中的对象</p>
</div>

<!--
应用场景
1. 从服务器端获取样式返回给前端控制界面
2. 按需加载类名
3. v-bind 无论绑定什么 ,一切都是为了动态控制
-->


<script>
    new Vue({
        el: "#app",
        data: ({
            flag: true,
            obj: {
                size: true,
                color: true,
                active: false
            }
        })
    })
</script>

v-bind绑定样式

<div id="app">
    <!--动态绑定 style-->
    <!--注意点 : key和value最好都用引号包裹起来, 否则 如果 key 带有 - 会导致无效 -->
    <p :style="{color:'red'}">我是段落1</p>
    <p :style="{'color':'red'}">我是段落2</p>
    <!--带 - 的 key -->
    <!--第一种方式, 用引号包裹住 key -->
    <p :style="{'font-size':'50px'}">我是段落3</p>
    <!--第二种方式,  把 key 转换为驼峰 -->
    <p :style="{fontSize :'50px'}">我是段落4</p>

    <!--
    总结上两点 :
        key 值可以不用 引号包裹起来, 但是 如果遇到带 - 的key 就必须转换为 驼峰命名法
        value 值必须用引号包裹起来, 无论怎么写的情况下,都需要
    -->

    <!--从model中引入-->
    <p :style="obj">我是段落5</p>

    <!--从model中引入多个对象-->
    <p :style="[obj,obj1]">我是段落6</p>

</div>

<script>
    new Vue({
        el: "#app",
        data: ({
            obj: {
                'color': 'red',
                'font-size': '50px',
                'font-width': '700'
            },
            obj1: {
                'background': 'skyblue'
            }
        })
    })
</script>

v-on

<div id="app">
    <!--v-on 基础使用-->
    <!--click是事件名称 ,后面必须是 函数名称,函数名称的()可写可不写-->
    <button v-on:click="myFn()">我是按钮</button>
    <!--v-on简写 -->
    <button @click="myFn()">我是按钮</button>

</div>
<script>
    new Vue({
        el: "#app",
        data: ({}),
        //methods钩子 , vue 中所以需要执行的方法 ,都写在 methods 中
        methods: {
            myFn() {
                alert("123");
            }
        }
    })
</script>

v-on事件修饰符

    <style>
        .a {
            width: 300px;
            height: 300px;
            background: red;
        }

        .b {
            width: 200px;
            height: 200px;
            background: blue;
        }

        .c {
            width: 100px;
            height: 100px;
            background: green;
        }
    </style>
<div id="app">
    <!--
    .once - 只触发一次回调。
    .prevent - 调用 event.preventDefault()。
    .stop - 调用 event.stopPropagation()。
    .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
    .capture - 添加事件侦听器时使用 capture 模式。
    -->

    <!--默认可以重复执行-->
    <button @click="myFn">可以重复执行</button>
    <!-- .once 让函数只执行一次 -->
    <button @click.once="myFn">只执行一次</button>
    <!-- a标签默认事件会跳转 -->
    <a @click="myFn" href="https://www.baidu.com">我是有默认事件的</a>
    <!-- .prevent 阻止默认事件 -->
    <a @click.prevent="myFn" href="https://www.baidu.com">我的默认事件被阻止了</a>

    <hr>

    <!--嵌套关系默认是会有冒泡事件-->
    <div @click="myFnA" class="a">
        <div @click="myFnB" class="b">
            <div @click="myFnC" class="c"></div>
        </div>
    </div>

    <hr>

    <!--阻止冒泡事件 -->
    <div @click.stop="myFnA" class="a">
        <div @click.stop="myFnB" class="b">
            <div @click.stop="myFnC" class="c"></div>
        </div>
    </div>

    <hr>

    <!--让鼠标只有点击在他本来的元素的时候 ,才触发事件, 阻止冒泡和捕获-->
    <div @click.self="myFnA" class="a">     <!-- 只添加了给A  ,所以冒泡不会给到 A-->
        <div @click="myFnB" class="b">
            <div @click="myFnC" class="c"></div>
        </div>
    </div>

    <hr>
    <!--把默认的事件冒泡事件改变为 事件捕获-->
    <div @click.capture="myFnA" class="a">
        <div @click.capture="myFnB" class="b">
            <div @click.capture="myFnC" class="c"></div>
        </div>
    </div>

</div>

<script src="vue.js"></script>

<script>
    new Vue({
        el: "#app",
        data: ({}),
        methods: {
            myFn() {
                alert("123");
            },
            myFnA() {
                console.log("A");
            },
            myFnB() {
                console.log("B");
            },
            myFnC() {
                console.log("C");
            },
        }
    })
</script>

v-on按键修饰符

<div id="app">
    <!--
    vue 提供了很多默认的按键修饰符
    .enter
    .tab
    .delete (捕获“删除”和“退格”键)
    .esc
    .space
    .up
    .down
    .left
    .right
    -->
    <!--使用按键修饰符进行触发事件-->
    <input @keyup.enter="myFn" type="text" value="按enter键触发">
    <!--使用任意按键触发事件-->
    <input @keyup="myFn" type="text" value="按任意键触发">
    <!--自定义按键触发事件  例如 F2-->
    <!--格式:   keyup.keyCode码       -->
    <input @keyup.113="myFn" type="text" value="按F2触发事件">
    <!--但是直接写  keyCode码 并不好识别是按了什么按键, 所以可以使用别名代替-->
    <input @keyup.f2="myFn" type="text" value="按F2触发事件">
    <!--按键组合修饰符-->
    <!-- Alt + C -->
    <input @keyup.ctrl.c="clear" value="按 Ctrl + C 触发事件">
</div>

<script>

    //定义全局 按键修饰符 别名
    Vue.config.keyCodes.f2 = 113;
    Vue.config.keyCodes.c = 67;

    new Vue({
        el: "#app",
        data: ({
            name: "张三"
        }),
        methods: {
            myFn() {
                alert(this.name);
            },
            clear() {
                alert("不允许复制");
            }
        }
    })
</script>

v-on注意点

<div id="app">
    <!--
    1.使用v-on的时候 , 调用函数名称后面的 () 可写, 可不写 ,但是如果要传递参数,则必须写
    -->
    <button @click="myFn">我没有写()</button>
    <button @click="myFn()">我写了()</button>
    <!--
    2. 使用v-on传参数的格式
    -->
    <button @click="param('李四')">点击我 , 会传参李四</button>
    <!--传递原生事件对象 -->
    <button @click="event('李四',$event)">点击我 , 会传递李四和原生事件对象</button>

    <!--
    3.在 vue 中想使用data 中的数据, 必须加上 this .
    -->
</div>
<script>
    new Vue({
        el: "#app",
        data: ({
            name: "张三"
        }),
        methods: {
            myFn() {
                alert(this.name);
            },
            param(name) {
                alert(name);
            },
            event(name, event) {
                console.log(name);
                console.log(event);
            }

        }
    })
</script>

自定义全局指令

<div id="app">
    <p v-color="'red'">我是段落</p>
    <input type="text" v-focus value="页面渲染后聚焦">
    <div v-wh="200"></div>
    <p v-demo="{text:'我是一个文本',color:'blue'}"></p>
</div>

<script>
    /*
    自定义指令格式:
    Vue.directive('名称',{回调函数})

   directive接收两个参数
   第一个参数 : 名称 (不需要加 v-)
   第二个参数 : 业务逻辑回调函数
    */
    /*
    生命周期钩子
    bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
    inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
    */

    Vue.directive('color', {
        //el代表所绑定的元素
        bind: function (el, obj) {
            // el.style.color = "red";
            el.style.color = obj.value;
        }
    });

    Vue.directive('wh', {
        //    binding 代表传进来的参数
        bind: function (el, binding) {
            el.style.width = binding.value + "px";
            el.style.height = binding.value + "px";
            el.style.background = "red"
        }
    });

    Vue.directive('focus', {
        inserted: function (el) {
            el.focus();
        }
    });

    Vue.directive('demo', {
        bind: function (el, binding) {
            el.innerHTML = binding.value.text;
            el.style.color = binding.value.color;
        }
    });

    new Vue({
        el: "#app",
        data: {},
        methods: {}
    })
</script>

自定义局部指令

<div id="app">
    <p v-color="'red'">我是段落</p>
</div>

<script>
    new Vue({
        el: "#app",
        data: {},
        methods: {},
        directives: {
            'color': {
                bind: function (el, obj) {
                    el.style.color = obj.value;
                }
            }
        }
    })
</script>