基础概念
主要是官网内容,对指令的基本内容进行介绍
应用情景:
对dom元素进行操作时
分类:
- 全局指令
Vue.directive('name', {
inserted: function (el) {
// content
}
})
- 局部指令
directives: {
name: {
// content
}
}
使用 v-name,如<div v-name class="test">
钩子函数
bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 只调用一次, 指令与元素解绑时调用。
如果是在bind
和update
上做操作,而不关心其它的,可以合并钩子
Vue.directive('name', function (el, binding) {
// content
})
钩子函数参数(el,binding,vnode,oldVnode)
- el 指令绑定的元素,可直接操作dom
- binding 是一个对象
- name 指令名,不包含v-
- value 指令绑定的值
- oldValue 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
- expression 绑定值的字符串形式 不会计算出来 例如 v-my-directive:foo, arg 的值是 "foo"。
- modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。
- vnode: Vue 编译生成的虚拟节点
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
- vnode
- oldVnode
项目使用
控制按钮权限
根据不同的用户角色控制按钮是否出现
let btnObj =[] //存放有关按钮的code码 项目中是结合vuex一起的
// 移除
Vue.directive('btnCode', {
inserted: (el, binding) => {
if(!btnObj.includes(binding.value)){
console.log(el.parentNode.removeChild(el))
}
}
})
// display:none
Vue.directive('btnCodes', {
inserted: (el, binding) => {
if(!btnObj.includes(binding.value)){
console.log(el)
console.log(el.style.display = 'none')
}
}
})
使用
<el-button v-btnCode="'dbb'">test3</el-button>
// 这边如果有需要也可以传对象 v-btnCode="{key: value}" 在指令中的取值就是 binding.value.key
<el-button v-btnCodes="'aa'">test4</el-button>
以上是部分关于dirctive的代码,实际项目中btn的code值会结合 vuex一起
延伸
remove() 和 display