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

news2024/11/30 10:32:09

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 = true
                    const timer = setTimeout(() => {
                        el.disabled = false
                        clearTimeout(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.coloradmin.cn/o/1529510.html

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

相关文章

杨氏矩阵的查找(复杂度<O(N))

题目&#xff1a; 解释&#xff1a;时间复杂度小于O(N)即不要一个一个的去遍历查找。 思路&#xff1a; 一个33的二维数组如图所示&#xff1a; 一&#xff1a;先找到一个最关键的数字&#xff0c;3&#xff08;下标为0,2&#xff09; 关键数的关键之处在于&#xff08;处于…

过拟合欠拟合

问题&#xff1a;训练数据训练的很好啊&#xff0c;误差也不大&#xff0c;为什么在测试集上面有问题呢&#xff1f; 当算法在某个数据集当中出现这种情况&#xff0c;可能就出现了过拟合现象。 1、 什么是过拟合与欠拟合 欠拟合 过拟合 分析第一种情况&#xff1a;因为机器…

[Python人工智能] 四十三.命名实体识别 (4)利用bert4keras构建Bert+BiLSTM-CRF实体识别模型

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解如何实现中文命名实体识别研究,构建BiGRU-CRF模型实现。这篇文章将继续以中文语料为主,介绍融合Bert的实体识别研究,使用bert4keras和kears包来构建Bert+BiLSTM-CRF模型。然而,该代码最终结…

Linux用户、用户组

用户管理命令&#xff1a; 首先要先知道两个配置文件&#xff1a;/etc/group 用户组配置文件/etc/passwd 保存了所有用户的用于读取的必要信息**/etc/shadow **是 Linux 系统中用于存储用户密码信息的文件。这个文件也被称为“影子文件”&#xff0c;因为它包含了 /etc/passwd…

Unity发布webgl设置占满浏览器运行

Unity发布webgl设置占满浏览器运行 Unity发布webgl的时候index.html的模板文件 模板文件路径&#xff0c;根据自己的需求修改。 C:\Program Files\Unity\Hub\Editor\2021.1.18f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates\Default再桌面新建一个t…

chatgpt大模型基础学习

chatgpt大模型基础学习 1. 吴恩达提示工程2. 大模型说的token是什么 1. 吴恩达提示工程 知乎 https://zhuanlan.zhihu.com/p/626290417?utm_id0 中文版 https://mp.weixin.qq.com/s?__bizMzkwMjQ5MzExMg&mid2247483714&idx1&sn5e905f5ec6196f6dc2187db2a8618f02&…

Jmeter接口测试,一篇足矣。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 现在对测试人员的要求越来越高&#xff0c;不仅仅要做好…

使用强森算法求任意两点之间最短路径

对于强森算法的算法思想,如果给定的图中是没有负数的边,那么就可以使用迪杰斯特拉算法来进行遍历每个节点,找到它与其他节点的最短路径,而如果给定的图中是存在负数的边,但是不存在负数的环的时候,那么就可以使用算法对边长做一些修改并且可以准确的找到给定的两个节点之…

各种窗函数对脉压结果的影响

雷达导论专栏总目录链接: 雷达导论专栏总目录-CSDN博客 1. 各类窗函数 有几个窗函数的系数可配,配置如下: tukeywin(N,0.75)kaiser(N,2.5)gausswin(N,1.5)taylorwin(N,3,-24)2. 时域加窗 时域加窗时,直接加在匹配滤波函数上:Htw=exp(1j*pi*K*tp.^2).*win;。那么矩形窗就相…

手撕算法-最长公共子序列(二)

最长公共子序列(二) 分析&#xff1a;典型的动态规划&#xff0c;直接看代码了。 代码&#xff1a; import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** longest common sub…

【第十四章】改进神经网络学习方式-权重初始化

当我们创建神经网络时&#xff0c;我们必须为初始权重和偏置做出选择。到目前为止&#xff0c;我们一直根据我在第一章中简要讨论过的一种方法来选择它们。提醒一下&#xff0c;那种方法是使用独立的高斯随机变量来选择权重和偏置&#xff0c;使它们的均值为0&#xff0c;标准差…

从C++源代码到可执行文件?

从C源代码到可执行文件的转换是一个涉及多个步骤的过程&#xff0c;通常包括预处理、编译、汇编和链接四个主要阶段&#xff1a; 1.四个阶段 预处理 (Preprocessing) 预处理器&#xff08;如cpp&#xff09;首先读取原始的C源代码文件&#xff0c;并对其进行一系列文本替换操作…

【考研数学】武忠祥全年各阶段搭配用书汇总

如果选武忠祥&#xff0c;讲义方面选择基础篇和辅导讲义即可。分别在基础阶段和强化阶段使用。 此外复习全书不用买&#xff08;无论是基础篇还是提高篇都不用&#xff09;你以后可能会看到它的各种推广&#xff0c;不要轻信&#xff0c;有讲义的情况下全书很难利用得上。 武…

Positive Technologies 专家发现的漏洞已在 ABB 控制器中得到修复

&#x1f31f; 我们的同事一如既往地表现出色&#xff1a;应用分析专家 Natalia Tlyapova 和 Denis Goryushev 因发现 Freelance AC 900F 和 AC 700F 控制器中的两个漏洞而受到 ABB 的表彰。 这些设备用于自动化大规模连续循环生产设施和构建企业配送控制系统。利用这些漏洞的…

一文彻底搞懂TCP三次握手和四次挥手,及常见的面试题带答案

TCP&#xff08;传输控制协议&#xff09;是一种可靠的、面向连接的协议。在TCP/IP协议栈中&#xff0c;它负责在两个网络应用程序之间建立可靠的会话连接。TCP通过“三次握手”建立连接&#xff0c;通过“四次挥手”断开连接。本文将详细介绍这两个过程&#xff0c;并给出一些…

Women of Polkadot:波卡生态的女性社群与创新力量

在 Web3 行业里&#xff0c;女性似乎总是被忽视的群体。线下峰会的合照一眼望去尽是西装革履的男性成员&#xff0c;项目和机构高管的名单里也似乎难以寻觅到女性领导者的身影。在这个强调技术、编程、极客精神的行业里&#xff0c;女性身份的缺席看起来如此天生自然。 根据 B…

湖北省地质灾害分布数据 崩塌滑坡泥石流空间分布地质灾害详查等数据集

地质灾害是指在自然或者人为因素的作用下形成的&#xff0c;对人类生命财产造成的损失、对环境造成破坏的地质作用或地质现象。地质灾害在时间和空间上的分布变化规律&#xff0c;既受制于自然环境&#xff0c;又与人类活动有关&#xff0c;往往是人类与自然界相互作用的结果。…

防火墙的原理和配置

“防火墙”一词起源于建筑领域&#xff0c;用来隔离火灾&#xff0c;阻止火势从一个区域蔓延到另一个区域。引入到通信领域&#xff0c;防火墙这一具体设备通常用于两个网络之间有针对性的、逻辑意义上的隔离。这种隔离是选择性的&#xff0c;隔离“火”的蔓延&#xff0c;而又…

Vue.js+SpringBoot开发大学生相亲网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询会员4.2 查询相亲大会4.3 新增留言4.4 查询新闻4.5 新增新闻 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的大学生相亲网站&#xff0c;包含了会员管理模块、新闻管…

python 基础知识点(蓝桥杯python科目个人复习计划65)

今日复习内容&#xff1a;做题 例题1&#xff1a;遥远的雪国列车 问题描述&#xff1a; 小蓝和小红今天在房间里一起看完了“雪国列车”这部电影&#xff0c;看完之后他们感触颇深&#xff0c;同时他们想到了这样一道题目&#xff1a; 现在有一个数轴&#xff0c;长度为N&a…