Vue3自定义指令用法

目录

一、自定义指令生命周期及其参数

二、局部自定义指令写法

三、全局自定义指令写法

模块化规范写法

1、在directives文件夹下书写所有自定义指令

2、每个自定义指令文件暴露出注册的方法

3、在入口文件index.ts中引入每个指令的注册方法,并暴露一个注册所有指令的方法


官网:自定义指令 | Vue.js

一、自定义指令生命周期及其参数

const vDirective = {
  // 在绑定元素的 attribute 前,或事件监听器应用前调用
  created(el, binding, vnode, prevVnode) {},

  // 在元素被插入到 DOM 前调用
  beforeMount(el, binding, vnode, prevVnode) {},

  // 在绑定元素的父组件及他自己的所有子节点都挂载完成后调用
  mounted(el, binding, vnode, prevVnode) {},

  // 绑定元素的父组件更新前调用
  beforeUpdate(el, binding, vnode, prevVnode) {},

  // 在绑定元素的父组件及他自己的所有子节点都更新后调用
  updated(el, binding, vnode, prevVnode) {},

  // 绑定元素的父组件卸载前调用
  beforeUnmount(el, binding, vnode, prevVnode) {},

  // 绑定元素的父组件卸载后调用
  unmounted(el, binding, vnode, prevVnode) {}
}

指令的钩子会传递以下几种参数:

  • 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。

  • prevVnode:代表之前的渲染中指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。

二、局部自定义指令写法

这里只说组合式的

在 <script setup> 中,任何以 v 开头的驼峰式命名的变量都可以被用作一个自定义指令。在下面的例子中,vFocus 即可以在模板中以 v-focus 的形式使用。

<script setup>
// 在模板中启用 v-focus

// 写法1
const vFocus = {
  mounted: (el) => el.focus()
}

//写法2  函数式写法:对于自定义指令来说,一个很常见的情况是仅仅需要在 mounted 和 updated 上实现相同的行为,除此之外并不需要其他钩子。这种情况下我们可以直接用一个函数来定义指令
const vFocus = (el: any) => el.focus()
</script>

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

三、全局自定义指令写法

全局共享的自定义指令需要通过“单页面应用程序的实例对象”进行声明,示例代码如下:

// 注册(对象形式的指令)
app.directive('my-directive', {
    /* 自定义指令钩子 */
    mounted(el, binding) {
        if(binding.value == 1){
            el.focus()
        }
    }
})
 
// 注册(函数形式的指令)
app.directive('my-directive', (el, binding) => {
       if(binding.value == 1){
            el.focus()
        } 
})

// 用法
<template>
  <input type="text" v-my-directive="1" />
</template>
模块化规范写法
1、在directives文件夹下书写所有自定义指令

2、每个自定义指令文件暴露出注册的方法
// directive1.ts
import type { App } from 'vue'
const directive1 = {
  mounted() {},
  updated() {}
}

// 暴露注册指令的方法
export function setDrective1(app: App) {
  app.directive('directive1', directive1)
}
// directive2.ts
import type { App } from 'vue'
const directive2 = {
  mounted() {},
  updated() {}
}

// 暴露注册指令的方法
export function setDrective2(app: App) {
  app.directive('directive2', directive2)
}
3、在入口文件index.ts中引入每个指令的注册方法,并暴露一个注册所有指令的方法
// index.ts
import type { App } from "vue";
import { setDrective1 } from "./directive1";
import { setDrective2 } from "./directive2";

export function setDirectives(app: App) {
  // 加载需要的指令
  setDrective1(app);
  setDrective2(app);
}

4、在main.ts中引入注册所有指令的方法

// main.ts
import { createApp } from "vue";
import App from "./App.vue";
import { setDirectives } from "./directives";

const app = createApp(App);

// 注册所有自定义指令
setDirectives(app);

app.mount("#app");

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中的自定义指令封装是一种扩展Vue的能力,允许开发者在DOM元素上添加自定义行为。下面是Vue 3中自定义指令封装的步骤: 1. 创建自定义指令:使用`app.directive`方法来创建自定义指令。该方法接受两个参数,第一个参数是指令名称,第二个参数是一个对象,包含了指令的各种钩子函数和配置选项。 2. 钩子函数:自定义指令可以通过钩子函数来定义其行为。常用的钩子函数有: - `beforeMount`:在指令绑定的元素挂载到DOM之前调用。 - `mounted`:在指令绑定的元素挂载到DOM之后调用。 - `beforeUpdate`:在指令所在组件更新之前调用。 - `updated`:在指令所在组件更新之后调用。 - `beforeUnmount`:在指令所在组件卸载之前调用。 - `unmounted`:在指令所在组件卸载之后调用。 3. 配置选项:除了钩子函数外,还可以通过配置选项来定义自定义指令的行为。常用的配置选项有: - `bind`:在指令绑定到元素时立即调用,只调用一次。 - `update`:在指令所在组件的VNode更新时调用,可能会调用多次。 - `unbind`:在指令从元素上解绑时调用,只调用一次。 下面是一个示例,演示了如何在Vue 3中封装一个自定义指令: ```javascript // 创建Vue实例 const app = Vue.createApp({}); // 创建自定义指令 app.directive('my-directive', { beforeMount(el, binding, vnode) { // 指令绑定到元素之前的操作 }, mounted(el, binding, vnode) { // 指令绑定到元素之后的操作 }, beforeUpdate(el, binding, vnode) { // 指令所在组件更新之前的操作 }, updated(el, binding, vnode) { // 指令所在组件更新之后的操作 }, beforeUnmount(el, binding, vnode) { // 指令所在组件卸载之前的操作 }, unmounted(el, binding, vnode) { // 指令所在组件卸载之后的操作 } }); // 将Vue实例挂载到DOM元素上 app.mount('#app'); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值