vue2.x与vue3.x中自定义指令详解

news2024/11/13 10:20:39

🐱个人主页:不叫猫先生
🙋‍♂️作者简介:前端领域新星创作者、华为云享专家、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫系列专栏:vue3从入门到精通
📝个人签名:不破不立

🍬目录

  • 🌮前言
  • 🥙一、自定义指令分类
  • 🥪二、Vue2.x自定义指令钩子函数
    • (1)bind与update区别
    • (2)update与componentUpdated区别
    • (3)钩子函数的参数(摘自官网)
    • (4)局部自定义指令
    • (5)全局自定义指令
    • (6)简写形式
  • 🍔 三、Vue3.x自定义指令钩子函数
    • (1)指令钩子函数(摘自官网)
    • (2)钩子函数参数
    • (3)局部注册两种方式
    • (4)全局注册
    • (5)简化形式

🌮前言

vue自定义指令(2.x丨3.x)可以帮助我们实现需要操作,比如防抖、节流、懒加载、输入框自动聚焦等等,使用起来非常方便,比如vue自带的v-text、v-html、v-show、v-if等等。

🥙一、自定义指令分类

  • 局部自定义指令:只在组件内有效
  • 全局自定义指令:所有组件都有效

🥪二、Vue2.x自定义指令钩子函数

  • bind:只会调用一次,指令 第一次 绑定到元素时会调用

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

  • update:元素第一次绑定不会触发,绑定的值发生更新触发,可能发生在其子节点更新之前。

  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。

  • unbind:只调用一次,指令与元素解绑时调用。

(1)bind与update区别

相同点:

  • dom插入都会调用,bind在inserted之前

异同点:

  • bind 时父节点为 null
  • inserted 时父节点存在
  • bind是在dom树绘制前调用,inserted在dom树绘制后调用

(2)update与componentUpdated区别

  • 组件更新都会调用,update在componentUpdated之前
  • update 组件更新前的状态,componentUpdated 组件更新后的状态
Vue.directive('focus', {
  inserted: function (el) {
    console.log(el.parentNode, 'inserted')
    el.focus();
  },
  bind: function (el) {
    console.log(el.parentNode, 'bind')
    el.focus();
  },
});

输出结果如下,说明执行bind时,还没父节点;执行inserted时,已有父节点。
在这里插入图片描述

(3)钩子函数的参数(摘自官网)

  • el:指令所绑定的元素,可以用来直接操作 DOM。
  • binding:一个对象,包含以下 property:
  • name:指令名,不包括 v- 前缀。
    value:指令的绑定值,例如:v-my-directive=“1 + 1” 中,绑定值为 2。
    oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    expression:字符串形式的指令表达式。例如 v-my-directive=“1 + 1” 中,表达式为 “1 + 1”。
    arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 “foo”。
    modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
  • vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
 <p v-style:[direction]="connect">Enter connection information to connect</p>
    directives: {
        style: {
            bind(el,binding) {
              console.log(binding,'binding')
                el.style.fontSize = "30px";
                el.style.color = "blue";
            },
        },
    },

在这里插入图片描述

(4)局部自定义指令

在组件A.vue,用自定义指令实现改变文字颜色

<p v-style>文字描述</p>
 directives: {
    style: {
      bind(el,binding) {
        el.style.fontSize = "30px";
         el.style.color = "blue";
      },
      update(el,binding){
      el.style.fontSize = "30px";
      el.style.color = "blue";
      }
    },
  },
  • style:指令的名称,使用的时候要加前面加个v-
  • bind:只会调用一次,指令 第一次 绑定到元素时会调用
  • el:是指绑定的这个dom元素本身
  • binding:获取绑定指令的信息(name:指令名称;rawName:指令全称:value:指定绑定的值)
  • update:元素第一次绑定不会触发,绑定的值发生更新触发,参数与binding是相同的,如果逻辑与bind相同的话可以直接把指令当成函数写,上面的指令是对象类型。
  • v-style:使用指令改变了元素的样式

(5)全局自定义指令

使用Vue.directive(‘指令名称’,{钩子函数})

  • 第一个参数为字符串,指令的名称
  • 第二个参数是一个对象,用于接收指令的参数值
Vue.directive('style',{
    bind(el) {
      el.style.fontSize = "30px";
      el.style.color = "blue";
    },
  },
)

(6)简写形式

如果update逻辑与bind相同的话可以直接把指令当成函数写

 directives: {
    style(){
       el.style.fontSize = "30px";
       el.style.color = "blue";
    },
  },

🍔 三、Vue3.x自定义指令钩子函数

(1)指令钩子函数(摘自官网)

const myDirective = {
  // 在绑定元素的 attribute 前
  // 或事件监听器应用前调用
  created(el, binding, vnode, prevVnode) {
    // 下面会介绍各个参数的细节
  },
  // 在元素被插入到 DOM 前调用
  beforeMount(el, binding, vnode, prevVnode) {},
  // 在绑定元素的父组件
  // 及他自己的所有子节点都挂载完成后调用
  mounted(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件更新前调用
  beforeUpdate(el, binding, vnode, prevVnode) {},
  // 在绑定元素的父组件
  // 及他自己的所有子节点都更新后调用
  updated(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件卸载前调用
  beforeUnmount(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件卸载后调用
  unmounted(el, binding, vnode, prevVnode) {}
}

(2)钩子函数参数

指令的钩子会传递以下几种参数:

  • el:指令绑定到的元素。这可以用于直接操作 DOM。

  • binding:一个对象,包含以下属性。
    value:传递给指令的值。例如在 v-my-directive=“1 + 1” 中,值是 2。
    oldValue:之前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否更改,它都可用。
    arg:传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 “foo”。
    modifiers:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }。
    instance:使用该指令的组件实例。
    dir:指令的定义对象。

  • vnode:代表绑定元素的底层 VNode。

  • prevNode:之前的渲染中代表指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。

(3)局部注册两种方式

<script lang="ts" setup>
// 局部指令, 变量名为驼峰命名(vFocus = v-focus)
const vFocus = {
  mounted: (el:any) => {
    el.focus()
    console.log(el, '已经自动获得焦点')
  }
}
</script>
<script lang="ts">
const vFocus = {
    focus:  {
        mounted(el:any){
            el.focus();
            console.log(el, "已经自动获得焦点");
        }
    },
};
export default {
    setup() { },
    directives: vFocus,
};
</script>

(4)全局注册

  • 组件A.vue
  <input type="text" v-focus>
  • 在directives文件夹新建focus.ts文件
const directives: any = {
	mounted(el: any) {
		el.focus();
		el.value = '1'
	}
}
export default {
	name: "focus",
	directives
}
  • 在directives文件夹新建index.js
import type { App } from 'vue'
import focus from './focus'
export default function installDirective(app: App) {
    app.directive(focus.name, focus.directives);
} 
  • main.ts文件
import directives from './directives'
const app = createApp(App);
app.use(directives);

(5)简化形式

当update和mounted中的函数体一样时,则可以简写成如下:

const directives = (el:any) => {
		el.focus();
		el.value = '1';
}
export default {
	name: "focus",
	directives
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

m基于GA遗传算法的分件供送螺杆参数优化matlab仿真,优化参数包括螺杆总尺寸-最大圈数等

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 首先介绍MATLAB部分的遗传算法的优化算法介绍&#xff1a; 遗传算法的原理 遗传算法GA把问题的解表示成“染色体”&#xff0c;在算法中也即是以二进制编码的串。并且&#xff0c;在执行遗传算法…

AI 对话模型被网友玩坏了!这次还可以运行 Docker 容器...

最近一款新的聊天 AI 被网友们玩疯了。它可以直接生成代码、可以给你的代码 debug 以及提出优化...可以模仿莎士比亚风格写作...还可以解答各种各样的问题&#xff0c;而且显然不只 10 岁小孩子的智商&#xff0c;感觉它已经把互联网上所有的公开资料都吸收并消化了。这就是 Op…

mssql(1433端口)介绍

mssql介绍 Microsoft SQL Server是一个关系型数据库&#xff0c;微软开发的管理系统。作为数据库服务器&#xff0c;它是一种软件产品&#xff0c;其主要功能是存储和检索其他软件应用程序所请求的数据&#xff0c;这些应用程序可以运行在同一台计算机上&#xff0c;也可以运行…

Java连接数据库(JDBC非常重要)

目录 一.数据库连接 1.1之前如何操作数据库 1.2.实际开发中如何操作数据库&#xff1f; 二.JDBC(Java Database Connectinity)(重要) 2.1.JDBC的概念 2.2 JDBC核心思想 2.2.1 MySQL数据库驱动 2.2.2 JDBC API 2.3JDBC 环境搭建 2.4准备一张表 2.4.1 创建student表 2.4.…

[附源码]Python计算机毕业设计Django三星小区车辆登记系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Json简介与基本使用

前言 本文为Json简介与基本使用相关知识&#xff0c;下边具体将对什么是JSON&#xff0c;XML与JSON的区别&#xff0c;JSON的语法格式&#xff0c;JSON数据的转换&#xff08;包括&#xff1a;Java对象转换为JSON格式、JSON格式转换为Java对象&#xff09;等进行详尽介绍~ &am…

学习 MySQL:什么是分页

在本文中&#xff0c;我将解释在MySQL中&#xff0c;什么是分页以及我们如何实现它。当我们从 MySQL 数据库填充大型数据集时&#xff0c;读取同一页面上的所有记录并不容易。使用分页&#xff0c;我们可以将结果集划分为多个页面&#xff0c;这增加了结果集的可读性。在本文中…

协议-序列化-http-Cookie-Session-https

文章目录再谈协议什么是序列化&#xff0c;什么是反序列化&#xff1f;为什么要进行序列化和反序列化&#xff1f;怎么进行序列化和反序列化呢&#xff1f;网络计算器版本总结http协议httpurlencode&urldecode一. 格式认识二 代码实现一个http协议下的服务器安装telnet服务…

javaScript 进阶之路 --- 《加深理解回调函数》

前言&#xff1a; 回想当初第一次看到“回调函数”这个名词的时候&#xff0c;真的快把我难哭了。所有视频教程在讲到某个知识点的时候&#xff0c;大概都会说一句&#xff1a;“啊&#xff0c;这里怎么办呢&#xff1f;这里我们就需要用到一个回调函数...”。 等等&#xff0…

校园论坛(Java)—— 数据报表模块

校园论坛&#xff08;Java&#xff09;—— 数据报表模块 文章目录校园论坛&#xff08;Java&#xff09;—— 数据报表模块1、写在前面2、系统结构设计2.1 各个页面之间的调用关系2.2.3、数据报表设计3.1 数据报表主界面的实现3.2 发表数Top5的普通帖子3.3 回帖数Top5的普通帖…

技术人员创业的第一步分析(续,可听音频)

概述&#xff1a;昨天的文章发布以后&#xff0c;在腾讯云TVP专家群里和多个技术群里都引起了一些讨论&#xff0c;基于这些讨论&#xff0c;有了今天的这篇续章。里面谈到了这次创业中&#xff0c;青润经历过的几次生死关头&#xff0c;是真的差点离开人世&#xff0c;而不是想…

2022年物联卡的发展前景如何

在这个万物互联的时代&#xff0c;针对于企业设备联网的物联卡就显得格外重要了&#xff0c;而共享单车&#xff0c;移动支付&#xff0c;智慧城市&#xff0c;自动售卖机等企业采购物联卡会面临着各种问题&#xff0c;低价陷阱&#xff0c;流量虚假&#xff0c;管理混乱&#…

JMeter 做性能测试,YYDS!

2. JMeter下载和安装 JMeter可以在JMeter的官方网站下载&#xff0c;下载链接如下图所示&#xff0c;xmeter君写本文的时候&#xff08;2016/11&#xff09;可以下载到的最新的版本是3.0。 下载后解压到你系统下的任意目录&#xff0c;我们称该目录为%JMETER_HOME%&#xff0c;…

Dart语言简介

简单介绍Dart语言 Dart是一种针对客户优化的语言&#xff0c;亦可在任何平台上快速开发的应用陈旭。 目标是为多平台开发提供最高效的变成语言&#xff0c;并为应用程序框架搭配了领会的运行时执行平台。 Dart特点 Dart语言 类型安全&#xff0c;使用静态型检查来确保变量的…

Linux命令之常用基础命令备查手册

一、前言 家里领导因公司系统部署国产化发展趋势&#xff0c;需要学习Linux。作为Linux初学者&#xff0c;希望能有一篇博文提供学习快速学习和掌握Linux系统的常用基础命令。为了满足领导要求&#xff0c;特编写此博文&#xff0c;尽量将常用Linux命令囊括进来&#xff0c;以示…

基于ssm的宠物商城网站设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

HTML5期末大作业:基于HTML+CSS+JavaScript实现中国风文化传媒企业官网源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【一条命令搞定rabbitmq的安装与配置】

提示&#xff1a;宝塔面板安装docker/docker-compose&#xff0c;一条命令搞定rabbitmq的安装与配置 文章目录前言一、docker-compose.yml配置二、安全组规则添加端口三、通过浏览器访问rabbitmq的管控页面总结前言 已经安装好了宝塔面板、并且可以在Docker栏目&#xff0c;选…

[附源码]计算机毕业设计物业管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

微服务框架 SpringCloud微服务架构 16 SpringAMQP 16.2 入门案例的消息发送

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构16 SpringAMQP16.2 入门案例的消息发送16.2.1 直接开干16.2.2 总结16 Spri…