Vue自定义指令

155 阅读3分钟

一、基本概念

自定义指令是用来操作dom的,尽管vue推崇数据驱动试图的理念,但并非所又情况都适合数据驱动。自定义指令就是一种有效的补充和扩展,不仅仅可用于定义任何dom操作,并且是可以复用的

全局封装(main.js)

image.png

局部注册(在对应组件)

image.png

使用方法:  v-focus

image.png

指令定义函数提供了几个钩子函数(可选,执行顺序排序):

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 进行显示隐藏。

image.png

使用:给 v-permission 赋值判断即可

image.png

2.自定义封装v-copy

实现一键复制文本内容,用于鼠标右键粘贴。

思路: 动态创建 textarea 标签,并设置 readOnly 属性及移出可视区域

将要复制的值赋给 textarea 标签的 value 属性,并插入到 body

选中值 textarea 并复制

将 body 中插入的 textarea 移除

在第一次调用时绑定事件,在解绑时移除事件

image.png

使用:给 Dom 加上 v-copy 及复制的文本即可

image.png