Vue学习笔记——指令

1. 常用指令

v-cloak:解决渲染页面的闪烁问题,使用插值表达式,如果网速较慢的时候会出现闪烁问题,比如说页面会出现{{ msg }},在标签元素中使用v-cloak,然后在style标签中设置样式:[v-cloak]:{display:none;}

v-text:v-text=“数据”,比如v-text=“msg”,但是这种方式会覆盖标签内部的文本内容,使用插值表达式只会替换自己的占位符,而不会覆盖原来的文本内容。

v-html:将文本内容渲染为HTML标签。

v-bind:用于绑定属性的指令,比如v-bind:title=‘my_title’ 将属性title绑定给已经自己定义的my_title属性。

注意:v-bind指令可以直接简写为":" , v-bind中可以写合法的js表达式,比如v-bind:title=‘my_title + 123’

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-cloak、v-text、v-html</title>
    <script src="./lib/vue-2.4.0.js"></script>
    <style>
        [v-cloak] {
            display: none;
        }
    </style>
</head>
<body>
         <div id="app" v-cloak>
        <!-- 使用插值表达式渲染界面,如果网速慢的话会出现闪烁问题,也就是界面会出{{msg}} 而不是数据或者空白-->
        <p>123--------{{msg}}-----456</p>
        <!-- 使用 v-text='数据' 渲染界面 但是会覆盖标签里面的内容-->
        <div v-text='msg'>----Hello World 不会显示咯-----</div>
        <!-- 渲染HTML代码 v-html也会覆盖内部-->
        <div v-html='msg1'></div>
        <!-- v-bind指令绑定的属性可以写合法的js表达式 -->
        <!-- <input type="button" v-bind:title="my_title + 123" value="v-bind测试"> -->
        <!-- 也可以直接省略v-bind 直接在属性前面使用: -->
        <input type="button" :title = "my_title + '456'" value="v-bind测试"><br><br>
        <input type="button" :title = "my_title" value="v-on事件测试" v-on:click = "show">
    </div>
    <script>
        var vm = new Vue({
            /*
            new Vue()实例对象属性:
            el:元素的id,类或者是标签 element,需要加上#或者是.
            data:传输给页面的数据
            methods:页面的事件
            */
            el:'#app',
            data:{
                msg:'Hello Vue.js',
                msg1:'<h1>Hello World</h1>',
                my_title:'自定义的title'
            },
             // 页面事件 methods
            methods: {
                // 事件名:function() {事件体}
                show:function() {
                    alert('Hello World');
                }
 // 如果data需要访问methods中事件  使用this引用 
 // methods中的普通函数访问data中数据,需要在外部定义一个变量,把this赋值给变量,如果是箭头函数直接用this即可
        });
            }
        });
    </script>
</body>
</html>

v-on 用于绑定元素的事件,v-on:事件名=“methods中定义的函数名称” 如v-on:click = “show”

v-on可以简写为@ ,注意:在函数名称需要传参的时候要加上()

v-model:实现双向数据的绑定。单向数据绑定:只能改变data中的数据,从而改变页面中的数据,也就是说可以从从M—V,不能从V—M,双向数据绑定:M改变会影响到V,同时改变V的数据也会影响M。

v-model =“data中的对象”

注意:v-model只能用于表单元素:inputt(text email radio address) select checkbox textarea

简易计算器
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>简易计算器案例</title>
    <script src="../lib/vue-2.4.0.js"></script>
</head>
<body>
    <div id="app">
        <input type="text" v-model="n1">
        <select v-model="sel">
            <option value="+">+</option>
            <option value="-">-</option>
            <option value="*">*</option>
            <option value="/">/</option>
            <option value="%">%</option>
        </select>
        <input type="text" v-model="n2">
        <input type="button" value="=" @click = 'op'>
        <input type="text" v-model="result">
    </div>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
    // 默认都是0  使用双向数据绑定 页面更改的数据就会传送到Model中 然后就可以进行运算,然后结果又返回的页面View中
                n1:0,
                n2:0,
                sel:'+',
                result:0
            },
            methods:{
                op() {
                    switch(this.sel) {
                        case '+':
                        // this.result = this.n1 + this.n2;   注意 需要转换为数字类型 否则就是连接字符串了
                        this.result = Number(this.n1) + Number(this.n2);
                        break;
                        case '-':
                        this.result = Number(this.n1) - Number(this.n2);
                        break;
                        case '*':
                        this.result = Number(this.n1) * Number(this.n2);
                        break;
                        case '/':
                        this.result = Number(this.n1) / Number(this.n2);
                        break;
                        case '%':
                        this.result = Number(this.n1) % Number(this.n2);
                        break;
                    }
                }
            }
        });
    </script>
</body>
</html>

v-for:四种用法:
第一种用法:遍历普通数组 ,如果需要输出索引(数组元素,索引) in 数组名

<p v-for="item in array">{{ item }}</p>

<p v-for="(item,i) in array">索引:{{ i }} ------ 值:{{ item }}</p>

​ 第二种用法:遍历对象数组 ,(对象名,索引) in 数组名 对象名.属性

<p v-for="(user,i) in list">id : {{user.id}} ------ name : {{user.name}} ------- 索引 : {{i}}</p>

​ 第三种用法:遍历对象 (值val,键key,索引) in 对象名 {{键}} {{值}} 对象是键值对组成

<p v-for="(val,key,i) in obj">键:{{key}} ------- 值:{{val}} ------ 索引:{{i}}</p>

​ 第四种用法:遍历普通数字,数字是从1开始,不是从0开始

<p v-for="count in 10">循环到了第 {{count}} 次</p>

在v-for中使用key绑定唯一值

注意:key必须使用v-bind绑定属性形式,指定唯一值,key属性只能是字符串或者或者Number类型。

在组件中,使用v-for循环的时候,或者特殊的情况下,如果使用v-for出现问题,那么在使用v-for的同时,必须绑定key

动态添加复选框,使用key绑定复选框选中的唯一值
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-for的四种用法</title>
    <script src="../lib/vue-2.4.0.js"></script>
</head>
<body>
   <div id="app">
   <label>
         Id:<input type="text" v-model = "id">
   </label>
   <label>
          Name:<input type="text" v-model = "name">
   </label>
        <input type="button" value="添加" @click='add'>
   <p v-for="(item,i) in user" :key="item.id">
        <input type="checkbox" name="" id="">id:{{item.id}} -- name:{{item.name}} -- 索引:{{i}}
   </p>
</div>
     <script>
        var vm = new Vue({
            el:'#app',
            data:{
            user:[
                    {id : 1 , name : '张三'},
                    {id : 2 , name : '李四'},
                    {id : 3 , name : '王五'},
                    {id : 4 , name : '赵六'}
                ],
                id:'',
                name:''
            },
            methods:{
                add() {
                    // 点击添加按钮就增加一个对象
                    this.user.push({id : this.id , name : this.name});
                }
            }
        });
    </script>
</body>
</html>

v-if:每次都会重新创建或者删除元素, true为创建元素,false为删除元素。

v-show:不会重新对DOM进行创建或者删除,只是切换元素的display:none样式, false为display:none true为display: block。

v-if和v-show都可以实现元素的切换,特点是 v-if有较高的切换性能的消耗,v-show有较高的初始渲染的消耗

如果涉及频繁的切换,推荐使用 v-show ,如果元素永远不会被显示给用户看,推荐使用v-if。

点击按钮,切换元素的显示,点击显示元素,再点击元素消失
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-if和v-show的使用</title>
    <script src="../lib/vue-2.4.0.js"></script>
</head>
<body>
    <div id="app">
        <input type="button" value="toggle" @click="toggle">
        <h3 v-if="flag">使用v-if控制的元素</h3>
        <h3 v-show="flag">使用v-show控制的元素</h3>
    </div>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                flag:true
            },
            methods:{
                toggle() {
                    this.flag = !this.flag;
                }
            }
        });
    </script>
</body>
</html>

2.事件修饰符

.stop:阻止事件冒泡

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件修饰符</title>
    <script src="./lib/vue-2.4.0.js"></script>
    <style>
        #inner {
            height: 500px;
            background-color: aquamarine;
        }
        #out {
            padding: 50px;
            background-color: skyblue;
        }
    </style>
</head>
<body>
<div id="app">
      <div id="out" @click = 'outClick'>
            <div id="inner" @click = 'innerClick'>
<!-- button使用stop事件修饰符,阻止了事件冒泡,不会显示out inner被点击了 最后的结果就是btn被点击了-->
                <input type="button" value="事件修饰符演示" @click.stop = 'btnClick'>
            </div>
        </div> 
</div>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{},
            methods:{
                outClick() {
                    console.log('out被点击了!');
                },
                innerClick() {
                    console.log('inner被点击了!');
                },
                btnClick() {
                    console.log('btn被点击了!');
                },
                linkClick() {
                    console.log('a被点击了!');
                }
            }
        });
    </script>
</body>
</html>

.prevent:阻止默认事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件修饰符</title>
    <script src="./lib/vue-2.4.0.js"></script>
    <style>
        #inner {
            height: 500px;
            background-color: aquamarine;
        }
        #out {
            padding: 50px;
            background-color: skyblue;
        }
    </style>
</head>
<body>
<div id="app">
<!--此时链接只会显示a被点击了,而不会跳转到百度-->
<a href="http://www.baidu.com" @click.prevent = 'linkClick'>点一下,到达百度</a>
</div>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{},
            methods:{
                outClick() {
                    console.log('out被点击了!');
                },
                innerClick() {
                    console.log('inner被点击了!');
                },
                btnClick() {
                    console.log('btn被点击了!');
                },
                linkClick() {
                    console.log('a被点击了!');
                }
            }
        });
    </script>
</body>
</html>

.capture 事件捕获, 使用.capture此时的事件先被捕获,然后在执行事件冒泡

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件修饰符</title>
    <script src="./lib/vue-2.4.0.js"></script>
    <style>
        #inner {
            height: 500px;
            background-color: aquamarine;
        }
        #out {
            padding: 50px;
            background-color: skyblue;
        }
    </style>
</head>
<body>
<div id="app">
<!-- 点击button,运行结果就是先捕获了inner,然后在从button开始执行事件冒泡: inner被点击了 btn被点击了!out被点击了!-->
<div id="out" @click = 'outClick'>
   <div id="inner" @click.capture = 'innerClick'>
         <input type="button" value="事件修饰符演示" @click = 'btnClick'>
    </div>
</div>
</div>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{},
            methods:{
                outClick() {
                    console.log('out被点击了!');
                },
                innerClick() {
                    console.log('inner被点击了!');
                },
                btnClick() {
                    console.log('btn被点击了!');
                },
                linkClick() {
                    console.log('a被点击了!');
                }
            }
        });
    </script>
</body>
</html>

.self 当事件为该元素本身的时候触发

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件修饰符</title>
    <script src="./lib/vue-2.4.0.js"></script>
    <style>
        #inner {
            height: 500px;
            background-color: aquamarine;
        }
        #out {
            padding: 50px;
            background-color: skyblue;
        }
    </style>
</head>
<body>
<div id="app">
点击button不会触发到out 也就是说.self不会阻止事件冒泡
<div id="out" @click.self = 'outClick'>
            <div id="inner" @click = 'innerClick'>
                <input type="button" value="事件修饰符演示" @click = 'btnClick'>
            </div>
      </div>
</div>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{},
            methods:{
                outClick() {
                    console.log('out被点击了!');
                },
                innerClick() {
                    console.log('inner被点击了!');
                },
                btnClick() {
                    console.log('btn被点击了!');
                },
                linkClick() {
                    console.log('a被点击了!');
                }
            }
        });
    </script>
</body>
</html>

注意:.self和.stop的区别 .self是只有该元素本身才会触发事件,并且不会阻止事件的冒泡

.once 事件只会触发一次

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件修饰符</title>
    <script src="./lib/vue-2.4.0.js"></script>
    <style>
        #inner {
            height: 500px;
            background-color: aquamarine;
        }
        #out {
            padding: 50px;
            background-color: skyblue;
        }
    </style>
</head>
<body>
<div id="app">
 <!-- once连接其他事件修饰符,也只会触发一次,下面的a触发第一次之后,下次触发就不会阻止默认行为了,就会跳转到百度 -->
        <a href="http://www.baidu.com" @click.once.prevent = 'linkClick'>点一下,到达百度</a>
</div>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{},
            methods:{
                outClick() {
                    console.log('out被点击了!');
                },
                innerClick() {
                    console.log('inner被点击了!');
                },
                btnClick() {
                    console.log('btn被点击了!');
                },
                linkClick() {
                    console.log('a被点击了!');
                }
            }
        });
    </script>
</body>
</html>

自定义指令

全局自定义指令Vue.directive() 参数1:指令名称,不需要加上v-,但是在调用的使用需要加上v-
参数2:对象,对象有一些指令的相关函数和操作

Vue.directive('focus',{
            // 指令相关函数  每个函数的参数都是el 表示一个原生的JS对象,必填项
            bind:function(el {  //binding参数是可选的,在调用的时候如果需要传入值,定义指令需要这个参数
                // 每当指令绑定到元素的时候,会执行一次bind函数 ,只执行一次  常常用于设置样式相关的指令
            },
            inserted:function(el) {
                // 表示插入到DOM中,会执行inserted函数 只会触发一次  常常用于需要进行操作的情况
                el.focus();
            },
            updated:function(el) {
                // VNode更新的时候,会执行updated函数,可能会触发多次
            }
        });
// Vue函数的参数 第一个是element  第二个参数是传进来的值 比如说颜色 在调用指令的时候就可以传入一个颜色的值
        Vue.directive('color',{
            bind:function(el,binding) {
                el.style.color = binding.value;
            }
        });

自定义私有指令var vm = new Vue( directives: 指令名称:{指令函数});

 var vm = new Vue({
            el:'#app',
            data: {
                today:new Date()
            },
            directives: {
                // 自定义私有指令
                'fontweight':{
                    bind: function (el , binding) {
                    el.style.fontWeight = binding.value
                }
                },
                //指令函数的简写 如果只有bind和update 在指令名称后面直接写 function() {}
                'fontsize': function(el , binding) { 
                    el.style.fontsize = parseInt(binding.value) + 'px';
                }
            }
        });

自定义指令的调用

 <div id="app">
    <!-- 调用自定义私有指令 -->
        <h2 v-fontweight = "700">{{ today }}</h2>
    <!-- 调用自定义全局指令 -->
        <h1 v-color = "red">认真学习Vue.js</h1>
    </div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值