vue指令总结

1. 指令周期

指令有5个生命周期

bind                      指令绑定后,只执行一次,适合初始化
inserted                 元素插入父节点后
update                   组件VNode更新时
componentUpdated 组件VNode及其子VNode更新后调用
unbind                   只执行一次,指令与元素解绑时

2. 生命周期参数说明

el:指令所绑定的元素,可以用来直接操作 DOM。
binding:一个对象,包含以下 property:
  name:指令名,不包括 v- 前缀。
  value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
  oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
  expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
  arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。  
  modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
  vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
  oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

3. 周期简写

指令通常写法

Vue.directive('color-swatch', {
    bind(){...}
    update(){...}
    unbind(){...}
})

如果bind和update总是相同,可以简写为一个函数

Vue.directive('color-swatch', function (el, binding) {
  ...
})

4. 经典场景

4.1 实现元素的visibility的隐藏功能

//以插件的形式暴露指令,可以方便的以use的方式来引入指令
const oVisible = {
    install(Vue) {
        //全局注册在指令
        Vue.directive('visible', (el, binding) => {
            var value = binding.value;
            if (!!value) {
                el.style.visibility = 'visible';
            } else {
                el.style.visibility = 'hidden';
            }
        });
    }
};

if (typeof window !== 'undefined' && window.Vue) {
    window.Vue.use(oVisible);
}

export default oVisible;

使用

import VueVisible from 'vue-visible';

Vue.use(VueVisible);

<div v-visible="shouldVisible">测试例子</div>

4.2 实现点击元素外部执行方法,clickOutSide功能

Vue.directive('clickoutside',{
    bind(el, binding, vnode) {
        function onDocumentClick(e) {
            if (el.contains(e.target)) {
                return false
            }
            if (binding.expression) {
                binding.value(e)
            }
        }
        el.__vueClickOutside__ = onDocumentClick
        document.addEventListener('click', onDocumentClick)
    },
    unbind(el, binding) {
        document.removeEventListener('click', el.__vueClickOutside__)
        delete el.__vueClickOutside__
    }
})

 

posted @ 2020-08-12 15:56  全玉  阅读(464)  评论(0编辑  收藏  举报