vue3自定义指令(防抖指令)与vue3与vue2指令的对比

简介: vue3自定义指令(防抖指令)与vue3与vue2指令的对比

定义指令的变化

根据vue3文档的描述
https://v3.cn.vuejs.org/guide/migration/introduction.html#%E6%B8%B2%E6%9F%93%E5%87%BD%E6%95%B0
自定义指令的 API 已更改为与组件生命周期一致。
且 binding.expression 已移除。
也就是说vue2的自定义钩子函数被移除了。
我们不能够在使用vue2的自定钩子函数了

vue2的自定义钩子函数

bind (){} 指令绑定到元素后调用。只调用一次。主要用来操作css
inserted (){} 元素插入父 DOM 后调用。有关的DOM操作可以放在这个钩子函数中。
update(){} - 当元素更新,但子元素尚未更新时,将调用此钩子。
componentUpdated(){}- 一旦组件和子级被更新,就会调用这个钩子。
unbind(){} - 一旦指令被移除,就会调用这个钩子。也只调用一次。
ps:vue3中上面的这5个钩子函数将不能够在使用了。
  已经被移除了。大家不要在使用了。

vue3的自定义钩子函数

created - 新增!在元素的 attribute 或事件监听器被应用之前调用。 
bind 变为 → beforeMount 在元素被插入到 DOM 前调用,通常进行css的操作
inserted 变为→ mounted 可以进行DOM操作
beforeUpdate:新增!在元素本身被更新之前调用,与组件的生命周期钩子十分相似。
update → 移除!该钩子与 updated 有太多相似之处,因此它是多余的。请改用 updated。
componentUpdated → updated
beforeUnmount:新增!与组件的生命周期钩子类似,它将在元素被卸载之前调用。
unbind -> unmounted

vue3自定义指令最终的APi如下

const MyDirective = {
  created(el, binding, vnode, prevVnode) {}, // 新增
  beforeMount(el, binding, vnode) {},
  mounted() {},
  beforeUpdate() {}, // 新增
  updated() {},
  beforeUnmount() {}, // 新增
  unmounted() {}
}

created(el, binding, vnode, prevVnode) {}参数讲解

第1个参数el: 指令绑定的DOM元素。可以直接去操作的哈。
第2个参数binding:是一个对象,包含 
{ 
  arg:'', 
  dir:{},
  instance:Proxy,
  modifiers:{},
  value:'传递的指令值'
}

定义一个简单的颜色指令

在main.ts文件中。
import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'
const app = createApp(App);
// 定义全局自定义指令
app.directive("bg", {
    // 在元素的 attribute 或事件监听器被应用之前调用   
    created(el, binding, vnode, prevVnode) {
    },
    // 在元素被插入到 DOM 前调用,通常进行css的操作
    beforeMount(el, binding, vnode) {
        el.style.background = binding.value
    }
});
app.use(router).mount('#app')

在使用的页面

<template>
  <div>
    <!-- 注意pink需要引号 -->
    <div v-bg="'pink'">
      <p>自定指令</p>
      <p>定义的是颜色</p>
    </div>
  </div>
</template>

什么是防抖 ?

什么是防抖:当持续触发事件时,【一定时间段内】该事件没有被触发。
事件处理函数才会被执行一次。
如果设定的时间到来之前,又触发了事件,就重新开始延时。

自定义防抖指令

import { createApp } from "vue";
import App from "./App.vue";
import router from "./router/index";
const app = createApp(App);
// 定义全局自定义指令
app.directive("debounce", {
  mounted(el, binding) {
    // 如果不是函数或者不是事件直接返回
    if (typeof binding.value.fn !== "function" || !binding.value.event) return;
    // 默认的延迟时间
        let delay = 400;
        el.timer = null;
        console.log('多次执行')
        el.handler = function () {
          if (el.timer) {
            clearTimeout(el.timer);
          }
          el.timer = setTimeout(() => {
            binding.value.fn.apply(this, arguments);
          },binding.value.delay || delay);
        };
        el.addEventListener(binding.value.event, el.handler);
  },
  // 元素卸载前清理定需要清除:延时器并且移除监听事件
  beforeUnmount(el, binding) {
      console.log(el,'即将卸载');
      if (el.timer) {
          el.timer = null;
          clearTimeout(el.timer);
      }
      el.removeEventListener(binding.value.event, el.handler);
  },
});
app.use(router).mount("#app");

使用防抖

<template>
    <div>
  <button v-debounce="{ fn: handler, event: 'click', delay: 300}">
            点击我呀
       </button>
    </div>
</template>
<script setup lang="ts">
const handler = ():void => {
  console.log('防抖点击');
}
</script>

遇见问题,这是你成长的机会,如果你能够解决,这就是收获。

相关文章
|
15天前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
395 139
|
10天前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
103 1
|
2月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
268 11
|
25天前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
169 0
|
3月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
361 1
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
232 2
|
12天前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
221 137
|
5月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
663 0
|
5月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
6月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
671 77