Vue——自定义指令

121 阅读2分钟

自定义指令(el代表绑定这个指令的节点对象:DOM):directives:{x:{inserted(el){}}}

在Vue中,指令就是标签中v-打头的一种自定义的属性,它在vue运行了以后,就具有封装好了的功能,使用时非常简洁。

指令定义函数提供了几个钩子函数(可选) 。

1.bind:只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。

2.inserted:被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。

3.update:所在组件的 VNode 更新时调用,但是可能发生在其孩子的 VNode 更新之前。指令的值可能发生了改变也可能没有。但是可以通过比较更新前后的值来忽略不必要的模板更新。

4.componentUpdated:所在组件的 VNode 及其孩子的 VNode 全部更新时调用。

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

注意区别:

bindinserted:bind时父节点为null,inserted时父节点存在;

updatecomponentUpdated:update是数据更新前,componentUpdated是数据更新后。

钩子函数参数

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

2.binding:一个对象,包含指令名称及该指令所绑定的表达式信息。

  • name:指令名

  • value:指令的绑定值,不包括v-前缀

  • oldvalue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用

  • expression:字符串形式的指令表达式。

  • arg:传给指令的参数

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

4.oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

注意:除了 el 之外,其它参数都是只读的,尽量不要修改他们。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。

<body>
<div class="app">
    <!-- 在Vue中,指令就是标签中v-打头的一种自定义的属性,它在vue运行了以后,就具有封装好了的功能,使用时非常简洁 -->
    <p v-html="msg"></p>
    <input type="text" v-model="count">
    <!-- 这里的v-red是自定义指令 -->
    <div v-red>hello</div>
    <h2 v-color="`blue`">122</h2>
    <input type="text" v-focus>
</div>
<script>
    new Vue({
        el:".app",
        data:{  
            msg:"<b>hello</b>",
            count:123
        },
        methods:{ 

        },
        directives:{ 
            // 自定义指令
            red:{ 
                // inserted:绑定节点以后
                inserted(el){ 
                    // 绑定这个指令的节点对象:DOM
                    console.log(el)
                    el.style.color="red"
                }
            },
            color:{ 
                inserted(el,option){
                    // option:代表绑定这个color属性等号后面的值(也就是这里的blue)
                    console.log(el,option)
                    el.style.color=option.value
                }
            },
            focus:{ 
                inserted(el){
                    // 获取焦点
                    el.focus()
                }
            }
        }

    })
</script>