一、构建指令
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:上一次更新前的虚拟节点。
<input v-focus:a.b="10" /><!--{value: 10,arg: 'a',modifiers: { b: true },oldValue: /* 上一次更新时 value 的值 */} -->
3. 创建指令
在 src/directive 下创建一个 Focus.js 文件,用来自动 input 获取焦点。
javascript">// Focus.jsconst Focus = {mounted: (el) => el.focus(),};export default Focus;
二、引入指令
在 src/main.js 中引入指令
javascript">// main.jsimport { 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" />