vue自定义全局和局部指令

一、介绍

  1、除了核心功能默认内置的指令 (v-modelv-show),Vue 也允许注册自定义指令。

  2、自定义指令的分类
         1、全局指令

    2、局部指令

  3、自定义全局指令格式

    Vue.directive(指令ID,指令定义对象)    

  4、 自定义局部指令格式

    略

二、指令对象中的钩子函数(一个指令定义对象可以提供如下几个钩子函数)

  1、bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

  2、inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。

  3、update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。

  4、componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。

  5、unbind:只调用一次,指令与元素解绑时调用。

三、钩子函数参数(指令钩子函数会被传入以下参数:)

  1、el:指令所绑定的元素,可以用来直接操作 DOM 。

  2、binding:一个对象,包含以下属性:

    name:指令名,不包括 v- 前缀。

    value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2

    oldValue:指令绑定的前一个值,仅在 updatecomponentUpdated 钩子中可用。无论值是否改变都可用。

    expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"

    arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"

    modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }

  3、vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。

  4、oldVnode:上一个虚拟节点,仅在 updatecomponentUpdated 钩子中可用。

  注释:除了 el 之外,其它参数都应该是只读的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。

四、示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义指令</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="itany">
        <!-- <h3 v-hello>{{msg}}</h3> -->
        <button @click="change">更新数据</button>

        <h3 v-world:wbs17022.hehe.haha="username">{{msg}}</h3>

        <!-- <p v-world>网博,专业的前端培训</p> -->

        <!-- <h3 v-wbs>网博</h3> -->

        <input type="text" v-model="msg" v-focus>
    </div>

    <script>
        /**
         * 自定义全局指令
         * 注:使用指令时必须在指令名称前加前缀v-,即v-指令名称
         */
        Vue.directive('hello',{
            bind(){ //常用!!
                alert('指令第一次绑定到元素上时调用,只调用一次,可执行初始化操作');
            },
            inserted(){
                alert('被绑定元素插入到DOM中时调用');
            },
            update(){
                alert('被绑定元素所在模板更新时(前)调用');
            },
            componentUpdated(){
                alert('被绑定元素所在模板完成一次更新周期时调用');
            },
            unbind(){
                alert('指令与元素解绑时调用,只调用一次');
            }
        });
        //钩子函数的参数
        Vue.directive('world',{
            bind(el,binding){
                // console.log(el,binding); //第一个参数表示指令所绑定的元素,是个dom对象,第二个参数是个对象
                // el.style.color='red';

                console.log(binding); //name
            }
        });
        //传入一个简单的函数,bind和update时都会调用
        Vue.directive('wbs',function(){
            alert('wbs17022');
        });


        var vm=new Vue({
            el:'#itany',
            data:{
                msg:'welcome to itany',
                username:'alice'
            },
            methods:{
                change(){
                    this.msg='欢迎来到南京网博'
                }
            },
            directives:{ //自定义局部指令
                focus:{
                    //当被绑定元素插入到DOM中时获取焦点,其他用法和自定义全局指令用法相同
                    inserted(el){
                        el.focus();//让这个元素获得焦点
                    }
                }
            }
        });
    </script>
    
</body>
</html>
View Code

 

 

 

 

 

 

posted @ 2017-11-18 15:27  mx轩  阅读(978)  评论(0编辑  收藏  举报