学习vue3第八节(自定义指令 directive)

1、自定义指令的作用:

自定义指令是用来操作底层DOM的,尽管vue推崇数据驱动视图的理念,但并非所有情况都适合数据驱动。自定义指令就是一种有效的补充和拓展,不仅仅可用于定义任何DOM操作,并且是可以重复使用。
自定义指令,是由一个包含类似组件生命周期钩子函数的对象组成,钩子函数会接受组件所绑定的元素作为参数

2、组件内的自定义指令:

在 中以 v 开头的驼峰形式命名的对象都可以看做是自定义指令
如:

<template><div class="cntainer"><!-- 自定义指令 --><img class="img-box" v-img-rotote src="https://img.yzcdn.cn/vant/cat.jpeg" /><div>测试自定义指令</div></div>
</template><script setup>
const vImgRotote = {
// 添加自定义指令,图片旋转动效bind() {console.log('bind')},update() {console.log('update')},mounted(el) {// el 当前绑定的元素对象console.log('mounted', el)el.addEventListener('mouseover', () => {console.log('==mouseover==')el.style.transform = 'rotate(360deg)'el.style.transition = 'all 0.5s'})el.addEventListener('mouseleave', () => {el.style.transform = 'rotate(0deg)'// el.style.transition = 'all 0.5s'})}
}
</script>

或者直接 写指令js文件,通过文件引入

如: 
import vImgRotote from './v-img-rotote.js' // 自定义的指令文件v-img-rotote.js

3、通常情况下我们会定义一个全局的自定义指令,方便使用

比如自定义防重提交指令
// 声明的防重提交指令文件,直接在main.ts 中引入并且挂载在vue实例上即可全局使用;

import { App, DirectiveBinding } from 'vue'
interface MyEl extends HTMLElement {disabled?: boolean
}
export function setupMyReplayClickDirective(app: App) {app.directive('myReplayClick', {mounted(el: MyEl, binding: DirectiveBinding) {el.addEventListener('click', () => {if (!el.disabled) {el.disabled = trueconst timer = setTimeout(() => {el.disabled = falseclearTimeout(timer)}, binding.value || 1500)}})},// updated(el: MyEl, binding: DirectiveBinding) {//     console.log('=updated==el;', el)//     console.log('=updated==binding', binding)// }})
}

main.ts 中如下

import { App, createApp } from 'vue'
import aplication from './App.vue'
// const app = createApp({})
const app = createApp(aplication)
import { setupMyReplayClickDirective } from '@/directives/my-replay-click-directive.ts'
setupMyReplayClickDirective(app)

模板中使用如下:

<template><button v-my-replay-click="1000">提交</button>// 因默认是1500毫秒,所以可以不写执行时间,直接写上指令即可<button v-my-replay-click>提交</button>
</template>

如图:
在这里插入图片描述
在这里插入图片描述

4、自定义指令的生命周期钩子函数

// 此写法为在setup 中声明方式

const myDirective = {// 在绑定元素的 attribute 前// 或事件监听器应用前调用created(el, binding, vnode, prevVnode) {// 下面会介绍各个参数的细节// el: 要绑定的DOM元素,可以直接进行DOM操作// binding: 一个对象,包含以下属性:// value: 指令的值,如果传入了表达式,则为表达式的值,否则为 undefined,比如v-my-replay-click="`${1000 + 500 }`" // 可以是变量参数,可以是具体的值// oldValue:之前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否更改,它都可用// arg: 指令的参数,也即 v-bind:arg="value" 中的 arg// modifiers:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }// instance:使用该指令的组件实例// dir:指令的定义对象// vnode: 代表绑定元素的底层 VNode:// prevNode:代表之前的渲染中指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。},// 在元素被插入到 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) {}
}

通常情况下,我们在自定义指令时候,只需要在mounted 和updated上执行相关的逻辑,因此我们并不需要其他生命钩子函数,比如:

<div v-my-num=200>改变数字</div>
app.description('myNum', (el, bind) => {console.log('====,el,bind)el.innerText = `改变数字--${bind.value}`
})

**

5、组件上不建议使用自定义指令,因为自定义指令需要作用在根节点上,vue3组件中可能同时存在多个根节点;

**

仅代表自己观点,如有错误及不合适地方,欢迎批评指正

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

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

相关文章

只需3步,使用Stable Diffusion无限生成AI数字人视频

基本方法 搞一张照片&#xff0c;搞一段语音&#xff0c;合成照片和语音&#xff0c;同时让照片中的人物动起来&#xff0c;特别是头、眼睛和嘴。 语音合成 语音合成的方法很多&#xff0c;也比较成熟了&#xff0c;大家可以选择自己方便的&#xff0c;直接录音也可以&#…

el-tree 设置默认展开指定层级

el-tree默认关闭所有选项&#xff0c;但是有添加或者编辑删除的情况下&#xff0c;需要刷新接口&#xff0c;此时会又要关闭所有选项&#xff1b; 需求&#xff1a;在编辑时、添加、删除 需要将该内容默认展开 <el-tree :default-expanded-keys"expandedkeys":da…

Redis 启动进程报错排查

在阿里云ECS安装了redis, systemctl 启动进程正常, redis-cli 链接正常, 准备远程链接发现无法链接上. 报错 Connection: ECS-redis > connection failed Connection: Disconnect on error: Connection error: Connection timed out 连接超时. 后来查别人的经验发现是…

递归——求阶乘

递归的基本概念 一个函数调用其自身&#xff0c;就是递归求n&#xff01;的阶乘 int Factorial(int n) {if(n0) return 1&#xff1b;return n*Factorial(n-1); } #include <iostream> using namespace std; int n; int Factorial(int n) {if(n0) return 1;return n*F…

开源模型应用落地-安全合规篇-模型输出合规性检测(三)

一、前言 为什么我们需要花大力气对用户输入的内容和模型生成的输出进行合规性检测,一方面是严格遵守各项法规要求,具体如下:互联网信息服务深度合成管理规定https://www.gov.cn/zhengce/zhengceku/2022-12/12/content_5731431.htm ​ 其次,受限于模型本身的一些缺陷,…

Trent-FPGA硬件设计课程

本课程涵盖FPGA硬件设计的基础概念和实践应用。学生将学习Verilog语言编程、数字电路设计原理、FPGA架构和开发工具的使用。通过项目实践&#xff0c;掌握FPGA设计流程和调试技巧&#xff0c;为硬件加速和嵌入式系统开发打下坚实基础。 课程大小&#xff1a;4.3G 课程下载&am…

Flutter开发入门——路由

什么是路由&#xff1f; 移动端应用开发中&#xff0c;路由技术是一个非常重要的组成部分。路由技术负责管理应用中各个页面之间的跳转、导航以及参数传递等关键功能。在移动端应用中&#xff0c;一个高效、易于维护的路由系统对于提高开发效率和用户体验具有重要意义。 Flut…

【CSS】overflow中scroll和hidden的区别是什么?

overflow: scroll; 和 overflow: hidden; 是CSS中用于处理元素内容溢出其容器时的两种不同属性值。它们的主要区别在于当内容超出指定容器的尺寸时&#xff0c;它们如何显示或隐藏内容。 如果你有一个包含大量文本或图片的元素&#xff0c;并且希望用户能够滚动查看所有内容&am…

诗意人生三层: 爱层、富足金字塔层、苟且层

海德格尔说:人充满劳绩&#xff0c;但还诗意地栖居在大地之上。论语中说&#xff0c;曾子曰:暮春三月&#xff0c;春服既成&#xff0c;童子五六人&#xff0c;冠者六七人&#xff0c;浴乎沂&#xff0c;风乎舞雩&#xff0c;咏而归。夫子喟然叹曰:吾与点也。这两个说法可视为诗…

解决wrap_socket() got an unexpected keyword argument ‘ciphers‘

看报错本以为是一个简单的传参问题&#xff0c;没想到查到盘丝洞。 # 报错信息 wrap_socket() got an unexpected keyword argument ciphers# 报错代码段 _exception_handler() def connect(self):u"""连接MySQL数据库"""self.config_connect_a…

MongoDB聚合运算符:$gt

文章目录 语法举例 $gt聚合运算符用于比较两个值&#xff0c;如果第一个大于第二个&#xff0c;返回true&#xff1b;如果第一个小于等于第二个&#xff0c;返回false。 语法 { $gt: [ <expression1>, <expression2> ] }$gt可以用来比较任何类型的值&#xff0c;…

国产化系统操作说明以及各个配置(redis、minio、kafka、mysql)

一、 中标麒麟系统安装 下载中标麒麟桌面操作系统软件&#xff08;兆芯版&#xff09;V7.0镜像文件&#xff0c;在虚拟机安装中标麒麟系统&#xff0c;安装过程不详细赘述&#xff0c;跟windows类似。国产操作系统、麒麟操作系统——麒麟软件官方网站 二、 达梦数据库安装 1…

shardingsphere-elastic-job-ui 管理界面安装

shardingsphere-elasticjob 从 3.0.0-alpha 版本开始&#xff0c;将console管理界面单独拆分出来 下载前需要 安装 maven 配置环境变量 安装 nodejs 配置环境变量 下载ui源码,安装 官方并未直接提供可执行的二进制文件,需要下载源码编译,目前发行版 3.0.2 https://github.com/…

分布式Raft原理详解,从不同角色视角分析相关状态

分布式Raft原理详解&#xff0c;从不同角色视角分析相关状态 1. CAP定理2.Raft 要解决的问题3. Raft的核心逻辑3.1. Raft的核心逻辑2.1. 复制状态机2.2. 任期 Term2.3. 任期的意义&#xff1a;逻辑时钟2.4 选举定时器 3. Leader选举逻辑4. 从节点视角查看Leader选举4.1. Follow…

springboot2.7集成es8 https方式绕过证书访问集群

版本说明 项目Valuespring-boot2.7.13es8.12.2 配置文件 spring:elasticsearch:uris: https://192.168.1.110:30920username: elasticpassword: 123456依赖文件 子pom.xml引入elasticsearch-java依赖 <dependency><groupId>co.elastic.clients</groupId>…

vue 安装脚手架报错 certificate has expired

vue 安装脚手架的时候报错&#xff0c;报错信息如下&#xff1a; 错误信息&#xff1a;npm ERR! request to https://registry.npm.taobao.org/vue%2fcli failed, reason: certificate has expired 翻译&#xff1a;npm ERR&#xff01;请求到https://registry.npm.taobao.org…

Nanya(南亚科技)DRAM芯片选型详解

一、DRAM产品选型 普通SDRAM只在时钟的上升期进行数据传输&#xff0c;DDR内存能够在时钟的上升期和下降期各传输一次数据&#xff0c;因此性能翻倍&#xff0c;被称为双倍速率同步动态随机存储器。因此DDR内存可以在与SDRAM相同的总线频率下达到更高的数据传输率。DDR是一种掉…

React 19有哪些新的变化

随着 React 19 的发布即将到来&#xff0c;它承诺带来一些令人期待的新功能。这个版本不仅仅是又一个更新&#xff0c;而是被寄予厚望&#xff0c;将重新定义我们对待 React 代码的方式。承诺提供增强的速度、效率和更流畅的编码体验&#xff0c;React 19 正准备将 Web 开发提升…

C# 使用OpenCvSharp4将Bitmap合成为MP4视频的环境

环境安装步骤&#xff1a; 在VS中选中项目或者解决方案&#xff0c;鼠标右键&#xff0c;选择“管理Nuget包”&#xff0c;在浏览窗口中搜索OpenCVSharp4 1.搜索OpenCvSharp4,选择4.8.0版本&#xff0c;点击安装 2.搜索OpenCvSharp4.runtime.win,选择4.8.0版本&#xff0c;点…

快速入门uniapp-day03

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;给自己一个梦想&#xff0c;给世界一个惊喜。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章目录 什么是标签栏…