当前位置: 首页 > news >正文

Vue2/Vue3自定义指令

Vue2 和 Vue3 都支持自定义指令,用于直接操作 DOM 元素。两者的实现方式类似,但在 Vue3 中,指令的生命周期钩子有所调整。以下是详细说明和示例:


1. Vue2 自定义指令

在 Vue2 中,自定义指令通过 Vue.directive 全局注册或组件内 directives 选项局部注册。

全局注册
Vue.directive('focus', {
  // 指令钩子
  inserted(el) {
    el.focus(); // 元素插入 DOM 时聚焦
  }
});
局部注册
export default {
  directives: {
    focus: {
      inserted(el) {
        el.focus();
      }
    }
  }
};
指令钩子
  • bind:指令第一次绑定到元素时调用(只调用一次)。

  • inserted:元素插入父节点时调用。

  • update:组件更新时调用(可能发生在子组件更新之前)。

  • componentUpdated:组件及其子组件全部更新后调用。

  • unbind:指令与元素解绑时调用。


2. Vue3 自定义指令

Vue3 中,自定义指令通过 app.directive 全局注册或组件内 directives 选项局部注册。指令的生命周期钩子有所调整。

全局注册
import { createApp } from 'vue';
const app = createApp(App);

app.directive('focus', {
  mounted(el) {
    el.focus(); // 元素插入 DOM 时聚焦
  }
});

app.mount('#app');
局部注册
export default {
  directives: {
    focus: {
      mounted(el) {
        el.focus();
      }
    }
  }
};
指令钩子
  • created:指令绑定到元素时调用(元素还未插入 DOM)。

  • beforeMount:元素插入 DOM 前调用。

  • mounted:元素插入 DOM 后调用。

  • beforeUpdate:组件更新前调用。

  • updated:组件及其子组件更新后调用。

  • beforeUnmount:元素卸载前调用。

  • unmounted:元素卸载后调用。


3. 示例:实现一个点击外部关闭的自定义指令

以下是一个常见的自定义指令示例:点击元素外部时触发回调。

Vue2 实现
Vue.directive('click-outside', {
  bind(el, binding, vnode) {
    el.clickOutsideEvent = function(event) {
      if (!(el === event.target || el.contains(event.target))) {
        binding.value(event); // 调用绑定的回调函数
      }
    };
    document.addEventListener('click', el.clickOutsideEvent);
  },
  unbind(el) {
    document.removeEventListener('click', el.clickOutsideEvent);
  }
});
Vue3 实现
app.directive('click-outside', {
  beforeMount(el, binding) {
    el.clickOutsideEvent = function(event) {
      if (!(el === event.target || el.contains(event.target))) {
        binding.value(event); // 调用绑定的回调函数
      }
    };
    document.addEventListener('click', el.clickOutsideEvent);
  },
  unmounted(el) {
    document.removeEventListener('click', el.clickOutsideEvent);
  }
});
使用
<template>
  <div v-click-outside="handleClickOutside">
    点击外部关闭
  </div>
</template>

<script>
export default {
  methods: {
    handleClickOutside() {
      console.log('点击了外部区域');
    }
  }
};
</script>

4. Vue2 和 Vue3 自定义指令的区别

特性Vue2Vue3
注册方式Vue.directive 或 directives 选项app.directive 或 directives 选项
生命周期钩子bindinsertedupdatecomponentUpdatedunbindcreatedbeforeMountmountedbeforeUpdateupdatedbeforeUnmountunmounted
钩子参数elbindingvnodeoldVnodeelbindingvnodeprevVnode

5. 总结

  • Vue2 和 Vue3 的自定义指令功能类似,但 Vue3 的生命周期钩子更细粒度。

  • Vue3 的指令钩子名称更贴近组件生命周期(如 mounted 替代 inserted)。

  • 自定义指令适合处理 DOM 操作(如聚焦、点击外部、拖拽等),但应避免过度使用,优先考虑组件化设计。

相关文章:

  • 从零开始构建一个语言模型中vocab_size(词汇表大小)的设定规则
  • v4l2子系统学习(一)V4L2应用程序编程
  • Python3测试开发面试题2
  • 在echarts的tooltip组件中使用vue3自定义组件
  • Spring Bean生命周期通俗讲解
  • VScode C语言学习开发环境;运行提示“#Include错误,无法打开源文件stdio.h”
  • php文件包含
  • C extern在函数声明中的作用
  • 各类数据质量等相关学习地址
  • vmware centos 10 stream boot 安装
  • 【算法】快排-786. 第k个数
  • 23. AI-大语言模型-DeepSeek
  • MySQL登录问题总结
  • 【Reasoning】LLaMA-Berry: Pairwise Optimization for O1-like Olympiad-Level Mathematical Reasoning
  • Linux 内核中的 container_of 宏:以 ipoib_rx_poll_rss 函数为例
  • Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好?
  • android,flutter 混合开发,pigeon通信,传参
  • RDMA ibverbs_API功能说明
  • 【蓝桥杯集训·每日一题2025】 AcWing 6122. 农夫约翰的奶酪块 python
  • Rust编程语言入门教程(五)猜数游戏:生成、比较神秘数字并进行多次猜测
  • 戴上XR头盔,五一假期在上海也能体验“登陆月球”
  • 日菲同意扩大安全合作,外交部:反对任何在本地区拉帮结派的做法
  • 圆桌|特朗普上台百日未能结束俄乌冲突,若美国“退出”会发生什么?
  • 应勇:以法治力量服务黄河流域生态保护和高质量发展
  • 游戏论|迟来的忍者与武士:从《刺客信条:影》论多元话语的争议
  • 珠海市香洲区原区长刘齐英落马,此前已被终止省人大代表资格