(详解)Vue自定义指令

一、背景

在我们日常开发中,会遇到特殊的操作例如,图片懒加载,和类似v-model等等这样的自定义指令

二、提前预习(必看)

自定义指令跟组件一样,也是有生命周期的 ,我们的操作都是定义在对应的生命周期中 ,然后进行操作的,然后通过钩子函数传参进行绑定事件等等(先了解下)

2.1自定义指令生命周期

  • created:在绑定元素的 attribute 或事件监听器被应用之前调用;
  • beforeMount:当指令第一次绑定到元素并且在挂载父组件之前调用;
  • mounted:在绑定元素的父组件被挂载后调用,大部分自定义指令都写在这里;
  • beforeUpdate:在更新包含组件的 VNode 之前调用;
  • updated:在包含组件的 VNode 及其子组件的 VNode 更新后调用;
  • beforeUnmount:在卸载绑定元素的父组件之前调用;
  • unmounted:当指令与元素解除绑定且父组件已卸载时,只调用一次;

2.2 生命周期四个参数

这里七个钩子函数,钩子函数中有回调参数,回调参数有四个,含义基本上和 Vue2 一致:

  • el:指令所绑定的元素,可以用来直接操作 DOM(可以进行事件绑定)。

  • binding:我们通过自定义指令传递的各种参数

  • vnode:Vue 编译生成的虚拟节点。

  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

三、 自定义指令

3.1私有自定义指令

3.1.1定义指令

在每个 vue 组件中,可以在 directives 节点下声明私有自定义指令。示例代码如下:

复制代码
<script>
export default {
  directives: {
      // 自定义私有指令focus,在使用的时候要用 v-focus 。
    focus: {
      mounted(el, binding, vnode) => {
        //el是对应的dom,可以通过el给对应添加事件监听 el.addEventListener
        // binding.value 就是通过 = 绑定的值,在传值的时候传到这 binding.value
        //vnode是节点
        }
    },
  },
}
</script>

3.1.2使用自定义指令

在使用自定义指令时,需要加上 v- 前缀。示例代码如下:

复制代码
<!-- 声明自定义私有指令focus,在使用的时候要用 v-focus 。 -->    
<input v-focus/>

3.2全局自定义指令

3.2.1定义指令

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

复制代码
import { createApp } from 'vue'
 
const app = createApp({
  /* ... */
})
 
// 注册(对象形式的指令)
app.directive('my-directive', {
  /* 自定义指令钩子 */
    mounted(el, bindings) {
      
    }
 
})
 
// 注册(函数形式的指令)
app.directive('my-directive', (el, binding, vnode) => {
        //el是对应的dom,可以通过el给对应添加事件监听 el.addEventListener
        // binding.value 就是通过 = 绑定的值,在传值的时候传到这 binding.value
        //vnode是节点
        })

3.2.2使用自定义指令

在使用自定义指令时,需要加上 v- 前缀。示例代码如下:

复制代码
<!-- 声明自定义私有指令focus,在使用的时候要用 v-focus 。 -->    
<input v-focus/>
相关推荐
烬羽15 分钟前
从"整个页面刷新"到"丝滑切换":手写一个 HashRouter 彻底搞懂前端路由
javascript·前端框架·全栈
用户9385156350737 分钟前
从零理解 React Router v6:每一个 API 都是怎么工作的
前端·javascript·全栈
用户059540174462 小时前
Redis缓存回滚踩坑实录:一个配置失误,让我在凌晨3点丢了3000条数据
前端·css
kyriewen3 小时前
别再这样写条件渲染了——你的React组件里藏着这5种定时炸弹
前端·javascript·react.js
IT_陈寒4 小时前
Redis缓存击穿把我坑惨了,原来这样设过期时间才靠谱
前端·人工智能·后端
用户938515635074 小时前
从"坐电梯"到"前端路由"——深入理解 Hash 路由原理
前端·typescript·全栈
梦想CAD控件4 小时前
网页端CAD的图形选择、编辑与夹点操作教程
前端·javascript·node.js
妙码生花4 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十二):管理员权限检查中间件,AI 随意放行预闯大祸
前端·后端·go
月月大王的3D日记4 小时前
Three.js 入门系列(8):六种光源全解析 —— 关灯了,开光!
前端·javascript
达子6665 小时前
第26章_HarmonyOs开发图解之 设备管理
vue.js