一、基本概念
自定义指令是用来操作dom的,尽管vue推崇数据驱动试图的理念,但并非所又情况都适合数据驱动。自定义指令就是一种有效的补充和扩展,不仅仅可用于定义任何dom操作,并且是可以复用的
全局封装(main.js)
局部注册(在对应组件)
使用方法: v-focus
指令定义函数提供了几个钩子函数(可选,执行顺序排序):
bind:只调用一次,指令第一次绑定到元素时调用,可以用这个钩子函数定义一个在绑定时执行一次的初始化动作
inserted:被绑定的元素插入父节点时调用(父节点存在即可调用,不必存在于document中)
update:被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新
componentUpdated:被绑定元素所在模板完成一次更新周期时调用
unbind:只调用一次,指令与元素解绑时调用
钩子函数的参数主要有以下几项
el:指令所绑定的元素,可以用来直接操作DOM
binding:一个对象,包含以下属性
name:指令名,不包括v-前缀
value:指令的绑定值,例如v-my-directive=“1+1”,value的值是2
oldValue:指令绑定的前一个值,仅在update和componentUpdated钩子中可用,无论值是否改变都可用
expression:绑定值的表达式或变量名,例如v-my-directive=“1+1”,expression的值是"1+1"
arg:传给指令的参数,例如v-my-directive:foo,arg的值是"foo"
modifiers:一个包含修饰符的对象,例如v-my-directive.foo.bar,修饰符对象modifiers的值是{foo:true,bar:true}
vnode:Vue编译生成的虚拟节点
oldVnode:上一个虚拟节点,仅在update和componentUpdated钩子中可用
二、示例
例如:在一些后台管理系统,我们可能需要根据用户角色进行一些操作权限的判断,很多时候我们都是粗暴地给一个元素添加 v-if / v-show 来进行显示隐藏,但如果判断条件繁琐且多个地方需要判断,这种方式的代码不仅不优雅而且冗余。针对这种情况,我们可以通过全局自定义指令来处理。
需求:自定义一个权限指令,对需要权限判断的 Dom 进行显示隐藏。
使用:给 v-permission 赋值判断即可
2.自定义封装v-copy
实现一键复制文本内容,用于鼠标右键粘贴。
思路: 动态创建 textarea 标签,并设置 readOnly 属性及移出可视区域
将要复制的值赋给 textarea 标签的 value 属性,并插入到 body
选中值 textarea 并复制
将 body 中插入的 textarea 移除
在第一次调用时绑定事件,在解绑时移除事件
使用:给 Dom 加上 v-copy 及复制的文本即可