Vue3 指令详解

一、构建指令

1. 生命周期

**created:**在指令被绑定到元素之前调用。这个钩子很少使用,因为指令通常在元素存在时才需要进行操作。

**beforeMount:**在指令绑定的元素被插入到 DOM 之前调用。

**mounted:**在指令绑定的元素被插入到 DOM 后调用。这是最常用的生命周期钩子之一,通常在这里进行对元素的初始化操作。

**beforeUpdate:**在包含指令的组件更新之前调用。当组件的响应式数据发生变化导致组件重新渲染时,这个钩子会被触发。

**updated:**在包含指令的组件更新后调用。可以在这里对更新后的元素进行操作。

**beforeUnmount:**在指令绑定的元素被从 DOM 中移除之前调用。可以在这里进行一些清理操作,例如移除事件监听器等。

**unmounted:**在指令绑定的元素被从 DOM 中移除后调用。这是另一个进行清理操作的好时机。

javascript 复制代码
const myDirective = {

  created(el, binding, vnode) {

    console.log("指令创建");

  },

  beforeMount(el, binding, vnode) {

    console.log("指令在元素插入 DOM 前");

  },

  mounted(el, binding, vnode) {

    console.log("指令在元素插入 DOM 后");

  },

  beforeUpdate(el, binding, vnode, prevVnode) {

    console.log("指令在组件更新前");

  },

  updated(el, binding, vnode, prevVnode) {

    console.log("指令在组件更新后");

  },

  beforeUnmount(el, binding, vnode) {

    console.log("指令在元素移除 DOM 前");

  },

  unmounted(el, binding, vnode) {

    console.log("指令在元素移除 DOM 后");

  },

};



export default myDirective;

2. 生命周期参数

生命周期函数参数el、binding、vnode、prevNode,分别表示:

**el:**指令绑定的元素。可进行 DOM 操作。

**binding:**一个对象,包含以下属性:

value:指令的绑定值。

arg:传递给指令的参数,如果没有参数则为 undefined。

modifiers:一个包含指令修饰符的对象。

oldValue:上一次更新时的旧值,仅在 beforeUpdate 和 updated 钩子中可用。

**vnode:**虚拟节点。

**prevNode:**上一次更新前的虚拟节点。

html 复制代码
<input v-focus:a.b="10" />

<!--

{

  value: 10,

  arg: 'a',

  modifiers: { b: true },

  oldValue: /* 上一次更新时 value 的值 */

} -->

3. 创建指令

在 src/directive 下创建一个 Focus.js 文件,用来自动 input 获取焦点。

javascript 复制代码
// Focus.js

const Focus = {

  mounted: (el) => el.focus(),

};



export default Focus;

二、引入指令

在 src/main.js 中引入指令

javascript 复制代码
// main.js

import { createApp } from "vue";

import App from "./App.vue";

/** 指令 */

import Focus from "@/directive/Focus.js";



const app = createApp(App);

app.directive("focus", Focus);

app.mount("#app");

三、使用指令

在组件中使用指令

javascript 复制代码
<input v-focus v-model="value" />
相关推荐
GISer_Jing3 分钟前
今天看了京东零售JDS的保温直播,秋招,好像真的结束了,接下来就是论文+工作了!!!加油干论文,学&分享技术
前端·零售
Mapmost10 分钟前
【高斯泼溅】如何将“歪头”的3DGS模型精准“钉”在地图上,杜绝后续误差?
前端
JellyDDD12 分钟前
h5上传大文件可能会导致手机浏览器卡死,重新刷新的问题
javascript·上传文件
废春啊43 分钟前
前端工程化
运维·服务器·前端
爱上妖精的尾巴44 分钟前
6-9 WPS JS宏Map、 set、get、delete、clear()映射的添加、修改、删除
前端·wps·js宏·jsa
爱分享的鱼鱼1 小时前
对比理解 Vue 响应式 API:data(), ref、reactive、computed 与 watch 详解
前端·vue.js
JS_GGbond1 小时前
【性能优化】给Vue应用“瘦身”:让你的网页快如闪电的烹饪秘籍
前端·vue.js
T___T1 小时前
一个定时器,理清 JavaScript 里的 this
前端·javascript·面试
代码小学僧1 小时前
从 Arco Table 迁移到 VTable:VTable使用经验分享
前端·react.js·开源
微笑的曙光1 小时前
Vue3 环境搭建 5 步走(零基础友好)
前端