likes
comments
collection
share

vue3自定义指令

作者站长头像
站长
· 阅读数 27

很多时候,我们可能会遇到一些需求,需要对某个元素或某类进行特殊的操作,这时候就可以使用自定义指令,自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。

自定义指令

vue3中的自定义指令和vue2中的自定义指令差不多,也有两种定义方式:局部定义和全局定义。在作用上是一样的,只是在具体定义和使用上有一些差别。

局部定义

在 <script setup> 中,任何以 v 开头的驼峰式命名的变量都可以被用作一个自定义指令。

<template>
  <input v-focus />
</template>

<script setup>
// 在模板中启用 v-focus
const vFocus = {
  mounted: (el) => el.focus()
}
</script>

效果如下:

vue3自定义指令 页面会自动获得焦点。

在没有使用 <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>

效果如下:

vue3自定义指令