vue3自定义指令
很多时候,我们可能会遇到一些需求,需要对某个元素或某类进行特殊的操作,这时候就可以使用自定义指令,自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。
自定义指令
vue3中的自定义指令和vue2中的自定义指令差不多,也有两种定义方式:局部定义和全局定义。在作用上是一样的,只是在具体定义和使用上有一些差别。
局部定义
在 <script setup>
中,任何以 v
开头的驼峰式命名的变量都可以被用作一个自定义指令。
<template>
<input v-focus />
</template>
<script setup>
// 在模板中启用 v-focus
const vFocus = {
mounted: (el) => el.focus()
}
</script>
效果如下:
页面会自动获得焦点。
在没有使用 <script setup>
的情况下,自定义指令需要通过 directives
选项注册。
<template>
<input v-focus />
</template>
<script>
export default {
setup() {
/*...*/
},
directives: {
// 在模板中启用 v-focus
focus: {
mounted: (el) => el.focus()
}
}
}
</script>
效果同上
全局定义
全局定义就是在main.js中定义,这样所有的组件都可以使用了。
// main.js
const app = createApp({});
// 使 v-focus 在所有组件中都可用
app.directive('focus', {
mounted: (el) => el.focus()
})
// 组件中直接使用
<template>
<input v-focus />
</template>
<script>
效果同上。
自定义指令钩子
自定义指令中的钩子和生命周期的钩子有点类似,一共有以下几种形式:
- created:在绑定元素的 attribute 前或事件监听器应用前调用
- beforeMount:在元素被插入到 DOM 前调用
- mounted: 在绑定元素的父组件及他自己的所有子节点都挂载完成后调用
- beforeUpdate:绑定元素的父组件更新前调用
- updated:在绑定元素的父组件及他自己的所有子节点都更新后调用
- beforeUnmount:绑定元素的父组件卸载前调用
- unmounted:绑定元素的父组件卸载后调用
钩子参数
上面的自定义钩子都有以下四种参数:
-
el:指令绑定到的元素。这可以用于直接操作 DOM。
-
binding:一个对象,包含以下属性。
value
:传递给指令的值。例如在v-my-directive="1 + 1"
中,值是2
。oldValue
:之前的值,仅在beforeUpdate
和updated
中可用。无论值是否更改,它都可用。arg
:传递给指令的参数 (如果有的话)。例如在v-my-directive:foo
中,参数是"foo"
。modifiers
:一个包含修饰符的对象 (如果有的话)。例如在v-my-directive.foo.bar
中,修饰符对象是{ foo: true, bar: true }
。instance
:使用该指令的组件实例。dir
:指令的定义对象。
-
vnode:代表绑定元素的底层 VNode。
-
prevNode:之前的渲染中代表指令所绑定元素的 VNode。仅在
beforeUpdate
和updated
钩子中可用。
<template>
<div v-demo="{ color: 'white', text: 'hello!' }"></div>
</template>
<script setup>
const vDemo = {
mounted: (el, binding) => {
console.log(binding.value.color);
console.log(binding.value.text);
}
}
</script>
效果如下:
转载自:https://juejin.cn/post/7201856218809303095