Vue3 学习笔记 —— 破坏式更新、自定义指令 directive

news2024/9/20 6:14:43

目录

1. 什么叫破坏式更新?

2. Vue3 中的自定义指令

2.1 自定义指令的生命周期

2.1.1 Vue2 Vs Vue3 的自定义指令生命周期

2.1.2 自定义指令的生命周期中,接收的参数

2.2 定义一个自定义指令

2.2.1 在 setup 中定义自定义指令(此处为 对象 形式)

2.2.2 在 setup 中定义自定义指令(此处为 函数简写 形式)

2.3 自定义指令 Demo —— 实现拖动


1. 什么叫破坏式更新?

有一个方法,传入一个对象并返回结果。在方法结束之后,传入的参数对象也被改变了,这就是破坏式更新。

java8函数式编程笔记-破坏式更新和函数式更新_weixin_33946020的博客-CSDN博客破坏式更新和函数式更新什么是破坏式更新和函数式更新:破坏式更新: 有一个方法,传入一个对象并返回结果。在方法结束之后传入的参数对象也被改变了,这就是破坏式更新。你不能保证调用这个方法之后后续是否还会使用传入的参数对象,因此破坏式更新在java的函数式编程中是不被提倡的。这也是另一种副作用。函数式更新: 用函数式编程的方法解决问题,强调没有任何副作用破坏式更新例子:我们有一个类用...https://blog.csdn.net/weixin_33946020/article/details/91403872

前面的 v-model,以及本章 directive 都属于破坏式更新

2. Vue3 中的自定义指令

v-if、v-show、v-for、v-model、v-on、v-bind 等,都是 vue 内置的指令

2.1 自定义指令的生命周期

2.1.1 Vue2 Vs Vue3 的自定义指令生命周期

Vue2 中,自定义指令的生命周期,区别于组件的生命周期:

  • bind
  • inserted
  • update
  • componentUpdated
  • unbind

Vue3 中,自定义指令的生命周期,类似于组件的生命周期:

  • created —— 元素初始化时执行
  • beforeMount —— 指令绑定到元素后执行,只执行一次
  • mounted —— 元素插入父级 DOM 时执行
  • beforeUpdate —— 元素被更新之前执行
  • updated —— 元素更新后执行(注意:带 d)
  • beforeUnmount —— 元素被移除前执行
  • unmounted —— 指令被移除后执行,只执行一次

2.1.2 自定义指令的生命周期中,接收的参数

参数一:el —— 当前绑定的 DOM 元素

参数二:binding —— 自定义指令接收的值

  • instance:使用 自定义指令的 组件实例
  • value:传递给指令的值(在 v-my-directive="{ color: 'red' }" 中,该值为 { color: 'red' })
  • oldValue:先前的值,仅在 beforeUpdate 和 updated 中可用,无论值是否有更改都可用
  • arg:传递给指令的参数(在 v-my-directive:test 中,arg 为 "test")
  • modifiers:包含修饰符的对象(在 v-my-directive.foo.bar 中,修饰符对象为 { foo: true,bar: true })
  • dir:一个对象,在注册指令时,作为参数传递,包含了自定义指令生命周期

参数三:自定义指令绑定的 元素的 虚拟 DOM,也就是 Vnode

参数四:prevNode 上一个虚拟节点,仅在 beforeUpdate 和 updated 钩子中可用

2.2 定义一个自定义指令

自定义指令命名,必须符合一定的规则 —— vNameOfDirective

2.2.1 在 setup 中定义自定义指令(此处为 对象 形式)

自定义指令的大部分生命周期,都能接收到 2.1.2 中提到的参数

根据这些参数,我们可以对绑定指令的 DOM 元素进行各种操作

 const vColorDirective: Directive = {
  created: () => {
    console.log("------ 初始化 ------");
  },
  beforeMount(...args: Array<any>) {
    // 在元素上做些操作
    console.log("------ 初始化一次 ------");
  },
  mounted(el: any, dir: DirectiveBinding<Value>) {
    el.style.background = dir.value.background;
    console.log("------ 初始化 ------");
  },
  beforeUpdate() {
    console.log("------ 更新之前 ------");
  },
  updated() {
    // 动态绑定的值 改变时 触发
    console.log("------ 更新结束 ------");
  },
  beforeUnmount(...args: Array<any>) {
    console.log(args);
    console.log("------ 卸载之前 ------");
  },
  unmounted(...args: Array<any>) {
    console.log("------ 卸载完成 ------");
  },
};

在模板中使用自定义指令:

<template>
  <button @click="show = !show">动态改变的值 —— {{ show }}</button>
  <Dialog v-color-directive="{ background: 'red', flag: show }"></Dialog>
</template>

2.2.2 在 setup 中定义自定义指令(此处为 函数简写 形式)

在 mounted 和 updated 时,触发相同的行为,其他生命周期内不做任何操作

<template>
   <div>
      <input v-model="value" type="text" />
      <div v-color-directive="{ background: value }"></div>
   </div>
</template>
   
<script setup lang='ts'>
import { ref, Directive, DirectiveBinding } from 'vue'

// 输入框双向绑定的值,用于输入各种颜色
let value = ref<string>('')

type Dir = {
   background: string
}

// 这里用函数定义了自定义指令,而不是对象了
const vColorDirective: Directive = (el: HTMLElement, binding: DirectiveBinding<Dir>) => {
   // 每次输入的值改变,都会改变背景颜色
   el.style.background = binding.value.background
}

</script>

2.3 自定义指令 Demo —— 实现拖动

实现过程:

  • 定义 函数 自定义指令
  • 获取可以被拖拽的的 DOM,也就是头部
  • 给可拖拽部分的 DOM,添加 鼠标按下 时的事件监听
  • 记录鼠标落下的位置(为了避免移动时,计算的距离不对)
  • 全局添加移动监听,在移动监听的函数里,获取移动的距离,并且移动元素
  • 鼠标抬起时,移除全局添加的移动监听
<template>
   <div v-drag class="box">
      <div class="header"> 头部 - 可拖拽 </div>
      <div> 身体 - 不可拖拽 </div>
   </div>
</template>
   
<script setup lang='ts'>
import { ref, Directive, DirectiveBinding } from 'vue'

// 这里用函数定义了自定义指令,而不是对象了
const vDrag: Directive<any, void> = (el: HTMLElement, binding: DirectiveBinding) => {
   // 获取可以被拖拽的的 DOM,也就是头部
   let dragElement: HTMLDivElement = el.firstElementChild && HTMLDivElement

   // 鼠标按下的事件
   const mouseDown = (e: MouseEvent) => {
     // 记录鼠标落下的位置(为了避免移动时,计算的距离不对)
     let moX = e.clientX - el.offsetLeft;
     let moY = e.clientY - el.offsetTop;

     // 定义移动事件函数
     const move = (e: MouseEvent) => {
       // 从这里可以获取移动时的坐标
       console.log('获取移动时的坐标 ---', e);
       // 移动元素(记得 减掉 鼠标最初按下的位置)
       el.style.left = e.clientX - moX + 'px';
       el.style.top = e.clientY - moY + 'px';
     };

     // 全局添加移动监听
     document.addEventListener('mousemove', move);

     // 鼠标抬起时,取消监听 全局鼠标移动 事件
     document.addEventListener('mouseup', () => {
        document.removeEventListener('mousemove', move);
     });
   };

   // 给可拖拽部分的 DOM,添加事件监听
   dragElement.addEventListener('mousedown', mouseDown);
}

</script>

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

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

相关文章

数据结构 树练习题

目录 判断 选择 判断 1.一棵有124个结点的完全二叉树&#xff0c;其 叶结点个数是确定的。 【答案】正确 【解析】完全二叉树 若设二叉树的深度为h 除第 h 层外 其它各层 1&#xff5e;(h-1) 的结点数都达到最大个数(即1~(h-1)层为一个满二叉树) 第 h 层所有的结点都连续集…

【C++】STL

文章目录回调函数&#xff1a;一、STL的诞生二、STL基本概念三、STL六大组件四、STL中容器&#xff0c;算法&#xff0c;迭代器回调函数&#xff1a; 函数被作为参数传递到另一个函数&#xff08;主要函数&#xff09;的那个函数就叫做 回调函数 一、STL的诞生 C的面向对象和…

DHTMLX Diagram JavaScript/HTML5 Pro Library:5.0

Diagram — JavaScript/HTML5 Diagram Library Ω578867473 破解版DHTMLX Diagram comprises a set of interactive HTML5 UI components such as organization charts, flowcharts, decision trees, block diagrams, mind maps, etc. Consisting of nodes and connectors, di…

i.MX 6ULL 驱动开发 二十八:网络设备

一、网络设备的系统框图 MAC&#xff1a;工作在网络模型的数据链路层&#xff0c;通过 RGMII 或 RMII 接口连接 PHY&#xff0c;MAC 控制器中的 MDIO 控制器提供 MDIO 接口&#xff0c;用于访问 PHY 寄存器。 PHY&#xff1a;工作在网络模型的物理层&#xff0c;是 IEEE802.3 …

SVN项目,提交Git保留之前提交记录

&#x1f4c3;目录跳转简介&#xff1a;1.创建文件2.命令下载:3.上传到远程git3.1 创建远程git工程3.2 添加一个新的远程 Git 仓库3.3 拉取远程master的数据合并3.3 推送远程git分支简介&#xff1a; 由于之前直接搞的项目是部署在自己搭建的SVN服务器上&#xff0c;平时创建的…

5. JVM调优工具详解及调优实战(这里有我的实战案例预制构件生产管理平台)

1. Jmap&#xff0c;Jstack&#xff0c;Jinfo命令详解 1.1 Jmap 此命令可以用来查看内存信息&#xff0c;实例个数以及占用内存大小 jps 先查看有哪些java程序 jmap -histo 16492 > ./log.txt jmap -heap 16492 查看堆的信息 查看堆年轻代老年代的使用情况 堆内存dum…

Matlab:tftb-0.2时频工具箱安装小记

Matlab&#xff1a;tftb-0.2时频工具箱安装小记一、安装过程记录1、解压缩&#xff1a;2、将解压缩后的文件夹复制到自己的Matlab安装目录工具箱下&#xff1b;3、打开Matlab设置路径&#xff1a;设置路径4、测试是否安装成功&#xff1a;5、小试牛刀叮嘟&#xff01;这里是小啊…

【ASE+python学习】-批量识别石墨烯团簇结构中的吡啶氮,并删除与其相连的氢

批量识别石墨烯团簇结构中的吡啶氮&#xff0c;并删除与其相连的氢文章背景任务内容程序实现思路实现代码建立标准结构中边缘碳与氢的位置差值标准数据集读入待修改结构&#xff0c;识别氮与氢位置差值是否存在标准数据集代码细节剖析文章背景 在科研工作中&#xff0c;我的工…

STM32系列(HAL库)——串口IAP

前言 IAP&#xff08;In Application Programming&#xff09;即在应用编程&#xff0c;IAP 是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写&#xff0c;目的是为了在产品发布后可以方便地通过预留的通信口对产 品中的固件程序进行更新升级。 设备具备IAP功能…

javaScript学习———变量概述 变量的使用 变量语法扩展 变量命名规范交换 变量案例

博主每篇博文的浪漫主义&#xff1a; 【东京girl秀场上那些甜度爆表的女孩子们。&#x1f496;】 https://www.bilibili.com/video/BV1pG411F7KT/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 东京girl秀场上那些甜度爆表的女孩子们。&#x1f496;…

计算机组成原理--------12.4---------开始

计算机硬件的基本组成 冯诺依曼计算机的特点 冯诺依曼首次提出“存储程序”概念 计算机由五大部件组成&#xff1a;I/O设备&#xff08;输入输出&#xff09;&#xff0c;存储器&#xff08;存放数据和程序&#xff09;&#xff0c;运算器&#xff08;算术运算、逻辑运算&…

[附源码]JAVA毕业设计科研项目审批管理系统(系统+LW)

[附源码]JAVA毕业设计科研项目审批管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

关于解释型语言和编译性语言的区别

关于博主每篇博文的浪漫主义 【初恋是整遍《手写的从前》】 https://www.bilibili.com/video/BV1JP411g7qF/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 初恋是整遍《手写的从前》能够知道解释性语言和编译型语言的特点能够知道标识符不能是关键字…

docker_重装mysql

1.docker ps 查看docker正在运行的容器 2.docker stop xxx 停止正在运行的mysql 3.docker pull mysql:5.7 docker拉取mysql指定版本的镜像 docker pull mysql docker拉取最新版本的镜像 4.docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:…

PHP代码审计系列(一)

PHP代码审计系列&#xff08;一&#xff09; 本系列将收集多个PHP代码安全审计项目从易到难&#xff0c;并加入个人详细的源码解读。此系列将进行持续更新。 extract变量覆盖 源码如下 <?php$flagextractFlag.txt; extract($_GET);if(isset($shiyan)){ $contenttrim(f…

YOLO算法创新改进系列(项目汇总)

&#x1f680;&#x1f680;&#x1f680;——YOLO算法创新改进系列项目汇总——&#x1f384;&#x1f384;&#x1f384; &#x1f680; YOLO算法创新改进系列 &#xff08;项目汇总&#xff09;&#x1f384;&#x1f388; &#x1f340; 改进YOLOv5/YOLOv7——魔改YOLOv5/Y…

文件操作及IO

目录 一、文件的分类 二、文件路径 三、File 常见方法 1、get 相关方法使用 2、文件的创建和删除 3、遍历目录下所有文件 四、文件读写 一、文件的分类 站在程序员的角度&#xff0c;文件通常可以分为两类&#xff1a; 文本文件&#xff1a;以字符形式存储二进制文件&…

Java基于SSM的海淘商城系统

随着计算机网络的普及,电子商务的兴起,网络支付以及网络安全体系逐渐完善,人们的生活进入了网络时代,越来越多的人习惯于乐于网上购物,只需上网轻轻点击鼠标便能够买到心仪商品。 本系统主要是针对广大网络消费者而开发的,专为网络消费者打造,建设一个”全球购”海淘商城系统。…

Redis学习笔记(五)

主从复制 单机redis的风险和问题 机器故障&#xff1a;硬盘故障、系统崩溃容量瓶颈&#xff1a;内存不足&#xff0c;无限升级内存结论&#xff1a;为了避免单点redis服务器故障&#xff0c;准备多台服务器互相连通&#xff0c;将数据复制多个副本保存在不同的服务器上&#xf…

Vue 官方文档2.x教程学习笔记 1 基础 1.5 计算属性和侦听器 1.5.2 侦听器

Vue 官方文档2.x教程学习笔记 文章目录Vue 官方文档2.x教程学习笔记1 基础1.5 计算属性和侦听器1.5.2 侦听器1 基础 1.5 计算属性和侦听器 1.5.2 侦听器 虽然计算属性在大多数情况下更合适&#xff0c;但有时也需要一个自定义的侦听器。 这就是为什么 Vue 通过 watch 选项提…