vue3:自定义指令

一、理解vue指令

1.1、指令

在 vue 中提供了一些对于页面和数据更为方便的输出,这些操作就叫做指令,以 v-xxx 表示,比如 html 页面中的属性 <div v-xxx ></div>。自定义指令很大程度提高了开发效率,提高了工程化水平,一定要认真学习。

1.2、内置指令

在Vue中,诸如v-if、v-for、v-on等等被称之为内置指令,它们都是以v-开头的,我们无需注册即可在全局使用它们,内置指令提供了极大的方便给我们,比如v-for指令可以让我们快速循环出很多dom元素。

1.3、自定义指令

顾名思义,自己定义自定义指令的方法,实现我们需要的指令功能。

二、自定义指令钩子

2.1、vue2自定义指令钩子

bind():当指令绑定在 HTML 元素上时触发

inserted():当指令绑定的元素插入到父节点中的时候触发

update():当指令绑定的元素状态/样式、内容(这里指元素绑定的 vue 数据) 发生改变时触发

componentUpdated():当 update() 执行完毕之后触发

unbind():当指令绑定的元素从 dom 中删除时触发

2.2、vue3自定义指令钩子

created:在绑定元素的 attribute 或事件监听器被应用之前调用。在指令需要附加在普通的 v-on 事件监听器调用前的事件监听器中时,这很有用。

beforeMount:当指令第一次绑定到元素并且在挂载父组件之前调用。

mounted:在绑定元素的父组件被挂载后调用,大部分自定义指令都写在这里

beforeUpdate:在更新包含组件的 VNode 之前调用。

updated:在包含组件的 VNode 及其子组件的 VNode 更新后调用。

beforeUnmount:在卸载绑定元素的父组件之前调用

unmounted:当指令与元素解除绑定且父组件已卸载时,只调用一次。

三、自定义指令参数

created(el, binding, vnode, prevNode) {}

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 }。
        dir:指令的定义对象。
        instance:使用该指令的组件实例。
vnode:代表绑定元素的底层 VNode。
prevNode:之前的渲染中代表指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。

四、vue3 + ts 实践自定义指令

4.1、局部自定义指令

4.1.1、在<script setup>定义组件内的指令,任何以v开头的驼峰式命名的变量都可以被用作一个自定义指令

<template>
    <input v-focus />
</template>
<script setup>
    // 在模板中启用 v-focus
    const vFocus = {
      mounted: (el: any) => el.focus()
    }
</script>

<style scoped lang="less">
  input{
    border: 1px solid #000;
  }
</style>

 

4.1.2、options api 自定义指令需要在directives选项中注册

<template>
  <input v-focus />
</template>
<script>
export default{
  setup() {},
  directives: {
    // 指令名
    focus: {
      // 生命周期
      mounted(el) {
        // 处理DOM的逻辑
        el.focus()
      },
    }
  }
}
</script>

 

4.2、全局自定义指令

4.2.1、src/directives/focus.ts

export default function(app: any) {
app.directive("focus", {
    mounted(el: any) {
      console.log("focus mounted");
      el.focus();
    }
  })
}

4.2.2、src/directives/index.ts

import registerFocus from './focus'; // 获取焦点

export default function registerDirectives(app: any) {
    registerFocus(app);
}

4.2.3、 main.ts

import registerDirectives from './directives'

const app = createApp(App)
registerDirectives(app)

4.2.4、src/views/directives/index.vue

<template>
  <div class="directives">
    <input v-focus />
  </div>
</template>
<script setup lang="ts">
</script>
<style scoped lang="less">
  input{
    border: 1px solid #000;
  }
</style>

4.2.5、效果

 

4.3、在组件上使用指令

因为vue3可以有多个根节点,当有一个根节点时使用指令没有问题,如果有多个根节点使用指令回报错,建议多个根节点可以在组件内部使用指令。

五、常用的自定义指令积累(以全局自定义指令的方式记录)

5.1、input获取焦点

src/directives/focus.ts

// 获取焦点
export default function(app: any) {
app.directive("focus", {
    mounted(el: any) {
      console.log("focus mounted");
      el.focus();
    }
  })
}

5.2、 防抖

5.2.1、src/directives/debounce.ts

// 防抖
export default function(app: any) {
  app.directive("debounce", {
    mounted(el: any, binding: any) {
      let timer:any
      el.addEventListener('click', () => {
        if (timer) {
          clearTimeout(timer)
        }
        timer = setTimeout(() => {
          binding.value()
        }, 1000)
      })
    }
  })
}

5.2.2、src/views/directives/index.vue

1秒触发一次,连续点击不会多次触发。

<template>
  <div class="directives">
    <el-button v-debounce="debounceClick">debounce-button</el-button>
  </div>
</template>
<script setup lang="ts">
  const debounceClick = () => {
    console.log('1s触发一次')
  }
</script>

5.2.3、效果

 

5.3、其他待补充

六、欢迎交流指正,关注我,一起学习

七、参考链接

如何在Vue3中实现自定义指令(超详细!)_vue.js_脚本之家

vue全局自定义指令_妹妹你大胆地往前走啊!的博客-CSDN博客

Vue3自定义指令-10个常见的实用指令,带详细讲解,快拿去收藏!!!_vue3使用指令_橙某人.的博客-CSDN博客

手把手教你在 Vue3 中自定义指令_vue3自定义指令_肥肥技术宅的博客-CSDN博客

Vue自定义指令_轮孑哥的博客-CSDN博客

百度安全验证

Vue自定义指令及使用 - sugar_coffee - 博客园

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git简介和使用、基础命令

文章目录 一、git的安装与配置二、Git工作区原理三、Git的使用和仓库的创建四、Git的常用操作五、配置公钥六、IDEA中配置Git 一、git的安装与配置 https://tortoisegit.org/ 下载对应版本安装即可 注意&#xff1a;配置中输入邮箱和密码一定要和自己的git账户一致 git的配置…

面试华为测试岗,收到offer后我却毫不犹豫拒绝了....

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是2年。我想说的是&#xff0c;但凡有点机会&#xff0c;千万别去外包&#xff01; 在深思熟虑过后&am…

【模拟IC学习笔记】 反馈

反馈的作用&#xff1a;增益灵敏度降低 采用开环的方式实现一个精确的增益比较困难&#xff0c;但是可以实现高增益。 增益灵敏度衍生出来的另外两个特点 1、增加系统带宽。 2、改变输出阻抗&#xff0c;提高驱动能力。 反馈的作用&#xff1a;增加带宽 带宽的增加来源于…

ChatGPT实现markdown 格式与 emoji 表情

markdown 格式与 emoji 表情 书写文章时&#xff0c;巧妙的使用一些小图标&#xff0c;可以给文章增加不少的灵动感&#xff0c;读者也会感觉更加轻松。恰当的图标也能增进读者对内容的理解。ChatGPT 目前不能直接联网&#xff0c;但可以使用 emoji 表情文字来达到类似的效果。…

C++之数据对齐

目录 关于对齐数据对齐结构体对齐原则原理分析 关于对齐 对齐方式&#xff1a;表示的是一个类型的对象存放的内存地址应满足的条件好处&#xff1a;对齐的数据在读写上有性能优势对于不对齐的结构体&#xff0c;编译器会自动补齐以提高CPU的寻址效率 数据对齐 四个函数/描述…

机器学习实战:带你进入AI世界!

机器学习是人工智能领域的一个重要分支&#xff0c;可以帮助我们从大量数据中发现规律&#xff0c;进行预测和分类等任务。然而&#xff0c;想要真正掌握机器学习算法&#xff0c;并将其应用到实际问题中&#xff0c;还需要进行大量的实战练习。 本文将介绍几个常见的机器学习实…

6、Flutterr聊天界面网络请求

一、准备网络数据 1.1 数据准备工作 来到网络数据制造的网址,注册登录后,新建仓库,名为WeChat_flutter;点击进入该仓库,删掉左侧的示例接口,新建接口. 3. 接着点击右上角‘编辑’按钮,新建响应内容,类型为Array,一次生成50条 4. 点击chat_list左侧添加按钮,新建chat_list中的…

PAT A1032 Sharing

1032 Sharing 分数 25 作者 CHEN, Yue 单位 浙江大学 To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix. For example, l…

如何利用ChatGPT进行论文润色-ChatGPT润色文章怎么样

ChatGPT润色文章怎么样&#xff1f; ChatGPT可以润色文章&#xff0c;使用其润色功能可以为用户提供更加整洁、清晰、文采动人的文本。但需要注意以下几点&#xff1a; 需要保持文本的一致性和完整性。当使用ChatGPT进行润色时&#xff0c;需要注意保持文本的一致性和完整性。…

和月薪5W的聊过后,才发现自己一直在打杂···

前几天和一个朋友聊面试&#xff0c;他说上个月同时拿到了腾讯和阿里的offer&#xff0c;最后选择了阿里。 我了解了下他的面试过程&#xff0c;就一点&#xff0c;不管是阿里还是腾讯的面试&#xff0c;这个级别的程序员&#xff0c;都会考察项目管理能力&#xff0c;并且权重…

Java程序设计入门教程---循环结构(while)

目录 思考 概念 语法 案例&#xff1a;求1到100的整数和&#xff1f; 案例分析 思考 1. 让你输出10000000000000000句“Hello,world!”&#xff0c;你怎么写代码&#xff1f; 2. 求1到100的整数和&#xff1f; 概念 循环结构程序多次循环执行相同或相近的任务。 while循环…

Windows在外远程桌面控制macOS 【macOS自带VNC远程】

文章目录 前言1.测试局域网内远程控制1.1 macOS打开屏幕共享1.2 测试局域网内VNC远程控制 2. 测试公网远程控制2.1 macOS安装配置cpolar内网穿透2.2 创建tcp隧道&#xff0c;指向5900端口 3. 测试公网远程控制4. 配置公网固定TCP地址4.1 保留固定TCP地址4.2 配置固定TCP端口地址…

什么?Python一行命令快速搭建HTTP服务器并公网访问?

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

springboot第19集:权限

article 文章表sys_permission 后台权限表sys_role 后台角色表sys_role_permission 角色-权限关联表sys_user 用户表sys_user_role 用户-角色关联表 image.png image.png sys_user_role id user_id(用户id) role_id(角色id) sys_role id role_name(角色名) create_time(创建时间…

基于 EKS Fargate 搭建微服务性能分析系统

背景 近期 Amazon Fargate 在中国区正式落地&#xff0c;因 Fargate 使用 Serverless 架构&#xff0c;更加适合对性能要求不敏感的服务使用&#xff0c;Pyroscope 是一款基于 Golang 开发的应用程序性能分析工具&#xff0c;Pyroscope 的服务端为无状态服务且性能要求不敏感&…

部署simple-chat项目

simple-chat介绍&#xff1a;此项目是基于openAI3.5模型的h5端人工智能聊天项目&#xff0c;无需翻墙即可体验。 simple-chat线上地址&#xff1a;simple-chat simple-chat项目地址&#xff1a;GitHub - AMxiaoming/simple-chat nginx部署前端步骤&#xff1a; https://blo…

MySQL基础(十八)MySQL8其它新特性

1. MySQL8新特性概述 MySQL从5.7版本直接跳跃发布了8.0版本&#xff0c;可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强&#xff0c;开发者对MySQL的源代码进行了重构&#xff0c;最突出的一点是MySQL Optimizer优化器进行了改进。不仅在速度上得…

HashSet和HashMap内部结构分析

首先明确一点&#xff1a;HashSet的底层就是HashMap HashSet与HashMap的不同点&#xff1a; HashMap存储的是键值对&#xff08;也就是key-value&#xff09;&#xff0c;即在调用HashMap的put方法时传入的两个值&#xff0c;而HashSet其实也是存储的键值对&#xff0c;但是键…

阿里云服务器镜像怎么选?操作系统版本选择说明

阿里云服务器镜像怎么选择&#xff1f;云服务器操作系统镜像分为Linux和Windows两大类&#xff0c;Linux可以选择Alibaba Cloud Linux&#xff0c;Windows可以选择Windows Server 2022数据中心版64位中文版&#xff0c;阿里云百科来详细说下阿里云服务器操作系统有哪些&#xf…

【sop】基于灵敏度分析的有源配电网智能软开关优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…