Vue3 – 自定义指令 directives
简介
Vue 自带的指令有非常多,比如 v-if 、v-show.这些都是Vue自带给我们使用的指令。
Vue 还提供了用户自定义指令的方法,用户可以自定义创建指令,自定义指令方法。
本文讲解在Vue3中如何使用自定义指令的方法。
在模板中使用directives
在Vue3中,自定义指令提供了在模板中使用的功能,即可以在单个组件的setup方法中定义directives,规则是在指令名前加小写“v”作为标记,如下代码:
<script setup>
// 在模板中启用 v-focus
const vFocus = {
mounted: (el) => el.focus()
}
</script>
<template>
<input v-focus />
</template>
通过directives选项注册自定义指令
通过在组件中,创建一个directives属性,在里面定义自定义指令也可以
export default {
setup() {
/*...*/
},
directives: {
// 在模板中启用 v-focus
focus: {
/* ... */
}
}
}
全局注册自定义指令
在某些情况下,这个指令我们可能需要在大多数组件中复用,这时我们可以把directives注册成全局自定义指令
const app = createApp({})
// 使 v-focus 在所有组件中都可用
app.directive('focus', {
/* ... */
})
指令钩子方法
当某个元素被加上自定义指令后,这个元素的不同阶段,都会被自定义指令所捕获。通过处理不同情况下的状态,来决定元素在不同状态下该如何处理业务逻辑。
created
作用;
1.在绑定元素的 attribute 前
2.或事件监听器应用前调用
案例:
const myDirective = {
created(el, binding, vnode, prevVnode) {
// 下面会介绍各个参数的细节
}
}
beforeMount
在元素被插入到 DOM 前调用
const myDirective = {
beforeMount(el, binding, vnode, prevVnode) {
// 下面会介绍各个参数的细节
}
}
mounted
在绑定元素的父组件
及他自己的所有子节点都挂载完成后调用
const myDirective = {
mounted(el, binding, vnode, prevVnode) {
// 下面会介绍各个参数的细节
}
}
beforeUpdate
绑定元素的父组件更新前调用
const myDirective = {
beforeUpdate(el, binding, vnode, prevVnode) {
// 下面会介绍各个参数的细节
}
}
updated
在绑定元素的父组件
及他自己的所有子节点都更新后调用
const myDirective = {
updated(el, binding, vnode, prevVnode) {
// 下面会介绍各个参数的细节
}
}
beforeUnmount
绑定元素的父组件卸载前调用
const myDirective = {
beforeUnmount(el, binding, vnode, prevVnode) {
// 下面会介绍各个参数的细节
}
}
unmounted
绑定元素的父组件卸载后调用
const myDirective = {
unmounted(el, binding, vnode, prevVnode) {
// 下面会介绍各个参数的细节
}
}
提供参数说明
el:指令绑定到的元素。这可以用于直接操作 DOM。即应用在那个元素,那么el则是该元素对象
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。
prevVnode:代表之前的渲染中指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。
案例
<div v-example:foo.bar="baz">
如果在元素中调用如上代码的自定义指令,
则binding 参数会是一个这样的对象:
{
arg: 'foo',
modifiers: { bar: true },
value: /* `baz` 的值 */,
oldValue: /* 上一次更新时 `baz` 的值 */
}
在组件中使用
当在组件上使用自定义指令时,它会始终应用于组件的根节点
<MyComponent v-demo="test" />
<!-- MyComponent 的模板 -->
<div> <!-- v-demo 指令会被应用在此处 -->
<span>My component content</span>
</div>
需要注意的是组件可能含有多个根节点。当应用到一个多根组件时,指令将会被忽略且抛出一个警告。和 attribute 不同,指令不能通过 v-bind="$attrs" 来传递给一个不同的元素。总的来说,不推荐在组件上使用自定义指令。
共有 0 条评论