持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情juejin.cn/post/714765…
vue3自定义指令
自定义指令(个人理解就是创建指令直接操作DOM,对DOM的操作封装成了指令)
在vue中重用代码的方式:组件和组合式函数。
组件:主要是构建模块(注重封装完整的功能)
组合式函数:侧重于有状态的逻辑。
另一方面,自定义指定主要是为了重用设计普通元素的底层DOM访问的(注重DOM的操作)逻辑。
一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。下面是一个自定义指令的例子,当一个元素被Vue插入到DOM忠厚,它会被自动聚焦:
将一个自定义指令全局注册到应用层级也是一种常见的做法:
注意:只有当所需功能只能通过直接的DOM操作来实现时,才应该使用自定义指令。其他情况下应该尽可能地使用v-bind这样的内置指令来声明式的使用模板,这样更高效,也对服务器端渲染更友好。
指令钩子
一个指令的定义对象可以提供几个钩子函数(都是可选的)
钩子参数
指令的钩子会传递以下几种参数:
- el:指令绑定的元素。这可以用于直接操作DOM
- binding:一个对象,包含以下属性 1.value:传递给指令的值,例如在v-my-directive=“1+1”中,值是2.表达式的结果 2.oldValue:之前的值,仅在beforeUpdate和update中可用,无论值是否更改,它都可用。 3.arg:传递给指令的参数(如果有的话)。例如在v-my-directive:foo中,参数是“foo” 4.modifiers:一个包含修饰符的对象(如果有的话)。例如在v-my-directive.foo.bar中,修饰对象是{foo:true,bar:true} 5.instance:使用该指令的组件实例。 6.dir:指令的定义对象
- vnode:代表绑定元素的底层VNode
- prevNode:之前的渲染中代表指令所绑定元素的VNode,仅在beforeUpdate和updated钩子中使用。
举例来说,像下面这样使用指令:
binding参数会是这样一个对象:
和内置指令类似,自定义指令的参数也可以是动态的。
这里指令的参数会基于组件的arg数据属性响应式地更新。
简化形式
简化形式这里与vue2不同。
对于自定义指令来说,一个很常见的情况是仅仅需要在mounted和updated上实现相同的行为,除此之外不需要其他钩子,这种情况下我们可以直接用一个函数来定义指令:
对象字面量
如果你的指令需要多个值,你可以向他传递一个js对象字面量,因为指令也可以接收任何合法的js表达式
在组件上使用
在组件上使用自定义指令时,它会始终应用于组件的根节点,和透传Attribute类似。
注意:不推荐在组件上使用自定义指令,因为当应用到一个多根组件时,指令将会被忽略且抛出一个警告,和attribute不同,指令不能通过v-bind=“$attrs”来传递给一个不同的元素。