VueJS----[全局API-2.1]----Vue.directive 自定义指令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010996565/article/details/81211692

Vue.directive 自定义指令

1.什么是全局API

全局API并不在构造器里,而是先声明全局变量或者在Vue上定义一些新的功能,vue内置了一些全局API,比如今天要说的Vue.directive,简单的来说就是在构造器外部用Vue提供给我们的 API函数来定义新的功能.

2.Vue.directive自定义指令

在上几篇文章中学习的 主要是Vue 的内部指令,我们也可以定义一些属于自己的指令,比如我们要定义一个v-cheny的指令,作用就是让文字变成蓝色。
在自定义指令前我们写一个小功能,在页面上有一个数字为10,数字下面有一个按钮,让我们每次点击按钮后,数字加一。
html:

<div id="app">
    <div>{{num}}</div>
    <p><button @click="add">ADD</button></p>
</div>

js:

var app = new Vue({
    el:'#app',
    data:{
        num:10
    },
    methods:{
        add:function(){
            this.num++;
        }
    }
})

效果图
这里写图片描述

这个小小的功能实现之后,我们就要自定义一个全局指令,使用Vue.directive();

Vue.directive('cheny',function(el,binding){
     //操作的div
     console.log(el);
     console.log(binding);
     console.log(binding.name);
     console.log(binding.value);
     console.log(binding.expression);
     el.style="color:"+binding.value;
 });

这里写图片描述
可以看到 数字已经变色了。
其中的三个参数分别是:

el:指定所绑定的元素,可以用来直接操作dom

binding:一个对象,包含指令的很多信息

vnode:Vue编译生成的虚拟节点

3.自定义指令的生命周期

自定义指令有5个生命周期,也叫钩子函数,跟别是bind,inserted,updated,componentUpdated,unbind
a.bind:只调用一次,指令第一次绑定到元素调用,用这个钩子函数可以定义一个绑定时执行一次的初始化作用。
b.inserted:被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于document中)
c.updated:被绑定元素所在的模板更新时调用,而无论绑定值是否变化。通过比较更前后的绑定值,可以忽略不必要的模板更新。
d.componentUpdated:被绑定元素所在模板完成一次更新周期时调用,
e.unbind:只调用一次,指令与元素解绑时调用。

Vue.directive('cheny',{
    bind:function(){//被绑定
        console.log('1 - bind');
    },
    inserted:function(){//绑定到节点
        console.log('2 - inserted');
    },
    update:function(){//组件更新
        console.log('3 - update');
    },
    componentUpdated:function(){//组件更新完成
        console.log('4 - componentUpdated');
    },
    unbind:function(){//解绑
        console.log('5 - unbind');
    }
});

元素初始化的时候,只会调用bind,和inserted这两个钩子函数
点击按钮更新的时候,会调用updated和componentUpdated这两个函数
解绑的时候回调用unbind函数

<p><button onclick="unbind()">解绑</button></p>

这里Vue提供的destroy方法

function unbind(){
  app.$destroy();
}

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue.directive 自定义指令</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>Vue.directive 自定义指令</h1>
    <hr>
    <div id="app">
        <div v-cheny="color">{{num}}</div>
        <p><button @click="add">ADD</button></p>
        <p><button onclick="unbind()">解绑</button></p>
    </div>
    <script type="text/javascript">
        function unbind(){
            app.$destroy();
        }
        // Vue.directive('cheny',function(el,binding){
        //     console.log(el);
        //     console.log(binding);
        //     console.log(binding.name);
        //     console.log(binding.value);
        //     console.log(binding.expression);
        //     el.style="color:"+binding.value;
        // });
        Vue.directive('cheny',{
            bind:function(el,binding){//被绑定
                console.log('1 - bind');
                el.style="color:"+binding.value;
            },
            inserted:function(){//绑定到节点
                console.log('2 - inserted');
            },
            update:function(){//组件更新
                console.log('3 - update');
            },
            componentUpdated:function(){//组件更新完成
                console.log('4 - componentUpdated');
            },
            unbind:function(){//解绑
                console.log('5 - unbind');
            }
        });
        var app = new Vue({
            el:'#app',
            data:{
                num:10,
                color:'blue'
            },
            methods:{
                add:function(){
                    this.num++;
                }
            }
        })
    </script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/u010996565/article/details/81211692
今日推荐