美文网首页
Vue.directive 自定义指令

Vue.directive 自定义指令

作者: 苦咖啡Li | 来源:发表于2018-08-21 16:04 被阅读0次

    1、简介:

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

    有的情况下,仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。

    问题:当页面加载时,该元素将获得焦点 (注意:autofocus 在移动版 Safari 上不工作)。事实上,只要你在打开这个页面后还没点击过任何内容,这个输入框就应当还是处于聚焦状态。现在让我们用指令来实现这个功能:

    // 注册一个全局自定义指令 `v-focus`
    Vue.directive('focus', {
      // 当被绑定的元素插入到 DOM 中时……
      inserted: function (el) {
        // 聚焦元素
        el.focus()
      }
    })
    

    如果想注册局部指令,组件中也接受一个 directives 的选项:

    directives: {
      focus: {
        // 指令的定义
        inserted: function (el) {
          el.focus()
        }
      }
    }
    

    页面中使用:

    <input v-focus>
    

    2、自定义指令中传递的三个参数

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

    binding: 一个对象,包含指令的多个属性信息。

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

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

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

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

    自定义指令有五个生命周期(也叫钩子函数),分别是 bindinsertedupdatecomponentUpdatedunbind

    3.1、bind:只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个绑定时执行一次的初始化动作。
    
    3.2、inserted:被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于document中)。
    
    3.3、update:被绑定于元素所在的模板更新时调用,而无论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新。
    
    3.4、componentUpdated:被绑定元素所在模板完成一次更新周期时调用。
    
    3.5、unbind:只调用一次,指令与元素解绑时调用。
    

    4、案例

    我们要定义一个v-jspang的指令,让文字变成绿色。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <script type="text/javascript" src="../assets/js/vue.js"></script>
        <title>vue.directive 自定义指令</title>
    </head>
    <body>
        <h1>vue.directive 自定义指令</h1>
        <hr>
        <div id="app">
           <div v-jspang="color" id="aaa">
               {{num}}
           </div>
           <p>
               <button @click='jia'>加分</button>
           </p>
           <p>
               <button onclick='unbind()'>解绑</button>
           </p>
        </div>
     
        <script type="text/javascript">
     
            function unbind(){
                app.$destroy();
            }
     
            //自定义指令
            Vue.directive('jspang',{
                bind:function(el,binding,vnode){//被绑定
                    /**
                            var s=JSON.stringify;
                            el.innerHTML = 
                                'name:'        + s(binding.name) +'<br>' + 
                                'value:'       + s(binding.value) +'<br>' + 
                                'expression:'  + s(binding.expression) +'<br>' ;
                    **/
                    el.style='color:'+binding.value;
                      
     
                    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');
                }
     
            })
     
            var app=new Vue({
                el:'#app',
                data:{
                    color:'green',
                    num:10
                },
                methods:{
                    jia:function(){
                        this.num++;
                    }
                }
            })
        </script>
    </body>
    </html>
    
    

    相关文章

      网友评论

          本文标题:Vue.directive 自定义指令

          本文链接:https://www.haomeiwen.com/subject/fbdjiftx.html