Vue3.5常用特性整理
Vue3.5 发布已近半年,抽空整理下常用的新增/改动特性
响应式 Props 解构
Vue3.5 中 Props 正式支持解构了,并添加了响应式跟踪
设置默认值
使用 JavaScript 原生的默认值语法声明 props 默认值
以前
const props = withDefaults( | |
defineProps<{ | |
count?: number | |
msg?: string | |
}>(), | |
{ | |
count: 0, | |
msg: 'hello' | |
} | |
) |
现在
const { count = 0, msg = 'hello' } = defineProps<{ | |
count?: number | |
message?: string | |
}>() |
响应式解构
当在同一个 <script setup> 代码块中访问由 defineProps 解构的变量时,Vue 编译器会自动在前面添加 props
以前
const { foo } = defineProps(['foo']) | |
watchEffect(() => { | |
// 在 3.5 之前只运行一次 | |
console.log(foo) | |
}) |
现在
const { foo } = defineProps(['foo']) | |
watchEffect(() => { | |
// 在 3.5 中在 "foo" prop 变化时重新执行 | |
console.log(foo) | |
// `foo` 由编译器转换为 `props.foo`,以上等同于 `console.log(props.foo)` | |
}) |
与之类似,监听解构的 prop 变量 或 将其传递到可组合项中同时保留响应性 时需要将其包装在 getter 中
以前
const { foo } = defineProps(['foo']) | |
watch(foo, /* ... */) |
现在:
// watch(foo, /* ... */) 等价于 watch(props.foo, ...),我们给 watch 传递的是一个值而不是响应式数据源 | |
watch(() => foo, /* ... */) | |
// 传递解构的 prop 到外部函数中并保持响应性 | |
useComposable(() => foo) |
监听(watch / watcheffect) 相关
watch 支持指定深度 deep: number
watch 的 deep 选项现在支持传入数字,来指定监听的深度
const state = ref({ | |
a: { | |
b: { | |
c: 1 | |
} | |
} | |
}) | |
watch(state, (newValue) => { | |
console.log(`state: ${newValue}`) | |
}, | |
{ deep: 2 } | |
) | |
state.a.b = { c: 2 } // 更改了第二层的属性,触发监听 | |
state.a.b.c = 2 // 更改了第三层的属性,不触发监听 |
清理函数 onWatcherCleanup / onEffectCleanup
以前我们在监听函数中要发送异步请求时,很可能发生请求参数发生变化的情况,这时我们需要设置全局变量存储 AbortController,并在组件卸载之前清理它
import { watch, onBeforeUnmount } from "vue" | |
let controller = new AbortController() | |
watch(state, (newValue) => { | |
controller.abort() // 取消上一次的请求 | |
controller = new AbortController() | |
fetch(`/api/${newValue}`, { signal: controller.signal }).then(() => { | |
// 回调逻辑 | |
}) | |
}); | |
// 组件卸载前也要清理 | |
onBeforeUnmount(() => controller.abort()) |
现在有了清理函数 onWatcherCleanup / onEffectCleanup 后,我们可以直接调用它来清理之前的 调用(异步)函数/请求
import { watch, onWatcherCleanup } from 'vue' | |
watch(id, (newId) => { | |
const controller = new AbortController() | |
fetch(`/api/${newId}`, { signal: controller.signal }).then(() => { | |
// 回调逻辑 | |
}) | |
onWatcherCleanup(() => { | |
// 终止过期请求 | |
controller.abort() | |
}) | |
}) |
onEffectCleanup 函数写法类似以上,不同的是导入来源
import { onEffectCleanup } from "@vue/reactivity"; |
[!WARNING]
onWatcherCleanup仅在 Vue 3.5+ 中支持,并且必须在watchEffect效果函数或watch回调函数的同步执行期间调用:你不能在异步函数的await语句之后调用它。
watch 返回值增强
watch 返回值中新增 暂停/恢复侦听器,可以更细致的控制监听作用范围
const { stop, pause, resume } = watch(() => {}) | |
// 暂停侦听器 | |
pause() | |
// 稍后恢复 | |
resume() |
SSR 改进
惰性激活 Lazy Hydration
异步组件可以通过 defineAsyncComponent() API 中的 hydrate 选项来控制何时进行激活
在空闲时进行激活
import { defineAsyncComponent, hydrateOnIdle } from 'vue' | |
const AsyncComp = defineAsyncComponent({ | |
loader: () => import('./Comp.vue'), | |
hydrate: hydrateOnIdle(/* 传递可选的最大超时 */) | |
}) |
在元素变为可见时激活
import { defineAsyncComponent, hydrateOnVisible } from 'vue' | |
const AsyncComp = defineAsyncComponent({ | |
loader: () => import('./Comp.vue'), | |
hydrate: hydrateOnVisible() | |
}) |
自定义策略
import { defineAsyncComponent, type HydrationStrategy } from 'vue' | |
const myStrategy: HydrationStrategy = (hydrate, forEachElement) => { | |
// forEachElement 是一个遍历组件未激活的 DOM 中所有根元素的辅助函数, | |
// 因为根元素可能是一个片段而非单个元素 | |
forEachElement(el => { | |
// ... | |
}) | |
// 准备好时调用 `hydrate` | |
hydrate() | |
return () => { | |
// 如必要,返回一个销毁函数 | |
} | |
} | |
const AsyncComp = defineAsyncComponent({ | |
loader: () => import('./Comp.vue'), | |
hydrate: myStrategy | |
}) |
其他
请查看 Vue3官方文档 - 惰性激活,这里不再赘述
useId() 生成唯一应用ID
用于为无障碍属性或表单元素生成每个应用内唯一的 ID。在我们日常应用中,主要可以解决服务端和客户端生成的id不一样导致渲染报错的问题
<script setup> | |
import { useId } from 'vue' | |
const id = useId() | |
</script> | |
<template> | |
<form> | |
<label :for="id">Name:</label> | |
<input :id="id" type="text" /> | |
</form> | |
</template> |
data-allow-mismatch
如果客户端值不可避免地与其服务端对应值(例如日期)不同,我们可以使用属性 data-allow-mismatch 来避免由此产生的激活不匹配警告
<span data-allow-mismatch>{ { data.toLocaleString() }}</span> |
还可以指定特定类型。允许的值有:text,children (仅允许直接子组件不匹配),class,style,attribute
其他
useTemplateRef()
返回一个浅层 ref,可以更直观的绑定元素,同时也支持动态绑定
<script setup> | |
import { ref, useTemplateRef, onMounted } from 'vue' | |
const targetRef = ref('input1') | |
const inputRef = useTemplateRef<HTMLInputElement>(targetRef.value) | |
onMounted(() => { | |
inputRef.value.focus() | |
}) | |
</script> | |
<template> | |
<input ref="input1" /> | |
<input ref="input2" /> | |
</template> |
其他不常用的就不在说明了

关注灵活就业新业态,关注公账号:贤才宝(贤才宝https://www.51xcbw.com)
相关文章:
Vue3.5常用特性整理
Vue3.5 发布已近半年,抽空整理下常用的新增/改动特性 响应式 Props 解构 Vue3.5 中 Props 正式支持解构了,并添加了响应式跟踪 设置默认值 使用 JavaScript 原生的默认值语法声明 props 默认值 以前 const props withDefaults(defineProps<{ co…...
Android Studio:Application 和 Activity的区别
Application 和 Activity 是 Android 中非常重要的两个组件,它们分别负责不同的生命周期管理和应用的不同层次的操作。 Application 是应用级别的生命周期管理,它在整个应用运行时只有一个实例,负责应用的全局初始化和资源管理。Activity 是…...
深入解析“Self-Contained”——从技术到日常的全方位应用
深入解析“Self-Contained”——从技术到日常的全方位应用 一、引言 在阅读技术文档、编程指南或产品说明时,你可能经常看到 self-contained 这个短语。例如: Our end goal is a self-contained project containing two parts. https://howistart.org/p…...
2024年12月 Scratch 图形化(一级)真题解析 中国电子学会全国青少年软件编程等级考试
202412 Scratch 图形化(一级)真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题,共50分) 第 1 题 点击下列哪个按钮,可以将红框处的程序放大?( ) A. B. C. D. 标…...
llama.cpp GGML Quantization Type
llama.cpp GGML Quantization Type 1. GGML Quantization Type2. static const struct ggml_type_traits type_traits[GGML_TYPE_COUNT]3. Q#_K_M and Q#_KReferences 什么神仙妖魔,不过是他们禁锢异族命运的枷锁! GGUF https://huggingface.co/docs/hu…...
【深度学习框架】MXNet(Apache MXNet)
MXNet(Apache MXNet)是一个 高性能、可扩展 的 开源深度学习框架,支持 多种编程语言(如 Python、R、Scala、C 和 Julia),并能在 CPU、GPU 以及分布式集群 上高效运行。MXNet 是亚马逊 AWS 官方支持的深度学…...
游戏引擎学习第87天
当直接使用内存时,可能会发生一些奇怪的事情 在直接操作内存时,一些意外的情况可能会发生。由于内存实际上只是一个大块的空间,开发者可以完全控制它,而不像高级语言那样必须遵守许多规则,因此很容易发生错误。在一个…...
【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR
文章目录 指令格式(重点)1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…...
Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器
一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外,还有一个小众的市场,那就是多媒体展厅场景,这个场景目前处于垄断地位的软件是HirenderS3,做的非常早而且非常全面,都是通用的需求&…...
VSCode源码分析参考资料
VSCode Architecture Analysis - Electron Project Cross-Platform Best Practices 中文版 VSCode 架构分析 - Electron 项目跨平台最佳实践 Sihan Li博客上的vscode源码分析系列:分析了微服务架构、事件体系、资源管理、配置系统等 文召博客上的vscode 源码解析…...
html中的表格属性以及合并操作
表格用table定义,标签标题用caption标签定义;用tr定义表格的若干行;用td定义若干个单元格;(当单元格是表头时,用th标签定义)(th标签会略粗于td标签) table的整体外观取决…...
html的字符实体和颜色表示
在HTML中,颜色可以通过以下几种方式表示,以下是具体的示例: 1. 十六进制颜色代码 十六进制颜色代码以#开头,后面跟随6个字符,每两个字符分别表示红色、绿色和蓝色的强度。例如: • #FF0000:纯红…...
unordered_map/set的哈希封装
【C笔记】unordered_map/set的哈希封装 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】unordered_map/set的哈希封装前言一. 源码及框架分析二.迭代器三.operator[]四.使用哈希表封装unordered_map/set后言 前言 哈…...
运算符(C#)
运算符(C#) 算数运算符 - * / % //算数运算符// - * / %//这跟我们初中的运算符一样// 加号Console.WriteLine(12);//3int a 5 6;Console.WriteLine(a);//11// - 减号Console.WriteLine(6-3);//3int b 10 - 6;Console.WriteLine(b);//4// * 乘号Console.WriteL…...
idea中git的简单使用
提交,推送直接合并 合到哪个分支就到先切到哪个分支...
Fastdds学习分享_xtpes_发布订阅模式及rpc模式
在之前的博客中我们介绍了dds的大致功能,与组成结构。本篇博文主要介绍的是xtypes.分为理论和实际运用两部分.理论主要用于梳理hzy大佬的知识,对于某些一带而过的部分作出更为详细的阐释,并在之后通过实际案例便于理解。案例分为普通发布订阅…...
SQLite Update 语句详解
SQLite Update 语句详解 SQLite 是一款轻量级的数据库管理系统,以其简单、易用和高效的特点在全球范围内得到了广泛的应用。在 SQLite 中,UPDATE 语句是用于修改数据库表中记录的常用命令。本文将详细解析 SQLite 的 UPDATE 语句,包括其语法…...
【大数据技术】用户行为日志分析(python+hadoop+mapreduce+yarn+hive)
用户行为日志分析(python+hadoop+mapreduce+yarn+hive) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 本机PyCharm远程连接虚拟机Python 搭建完全分布式高可用大数据集群(MySQL+Hive)...
开发板上Qt运行的环境变量的三条设置语句的详解
在终端中运行下面三句命令用于配置开发板上Qt运行的环境变量: export QT_QPA_GENERIC_PLUGINStslib:/dev/input/event1 export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0 export QT_QPA_FONTDIR/usr/lib/fonts/设置成功后可以用下面的语句检查设置成功没有 echo $QT_QPA…...
vue3中el-input无法获得焦点的问题
文章目录 现象两次nextTick()加setTimeout()解决结论 现象 el-input被外层div包裹了,设置autofocus不起作用: <el-dialog v-model"visible" :title"title" :append-to-bodytrue width"50%"><el-form v-model&q…...
语言月赛 202412【顽强拼搏奖的四种发法】题解(AC)
》》》点我查看「视频」详解》》》 [语言月赛 202412] 顽强拼搏奖的四种发法 题目描述 在 XCPC 竞赛里,会有若干道题目,一支队伍可以对每道题目提交若干次。我们称一支队伍对一道题目的一次提交是有效的,当且仅当: 在本次提交…...
使用 Kotlin 将 Vertx 和 Springboot 整合
本篇文章目的是将 Springboot 和 Vertx 进行简单整合。整合目的仅仅是为了整活,因为两个不同的东西整合在一起提升的性能并没有只使用 Vertx 性能高,因此追求高性能的话这是在我来说不推荐。而且他们不仅没有提高很多性能甚至增加了学习成本 一、整合流…...
自定义数据集 使用scikit-learn中svm的包实现svm分类
引入必要的库 import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import accuracy_score, classification_report 生成自定义数据集 X, y ma…...
python:如何播放 .spx 声音文件
.spx 是 Speex音频编解码器的文件扩展名,它是一种开源的、免费的音频编解码器,主要用于语音压缩和语音通信领域。spx 文件通常用于语音记录、VoIP应用、语音信箱等场景。 .mp3 是一种广泛使用的音频格式,它采用了有损压缩算法,可…...
php的使用及 phpstorm环境部署
php语法 环境搭建:在小皮中新建网站,注意先填写域名再点击选择根目录。 成功创建网站后,打开发现forbidden,因为新建的网站里是空的,需要新建index.php文件----> 在Phpstorm中左上角打开文件,打开那个文…...
有用的sql链接
『SQL』常考面试题(2——窗口函数)_sql的窗口函数面试题-CSDN博客 史上最强sql计算用户次日留存率详解(通用版)及相关常用函数 -2020.06.10 - 知乎 (zhihu.com) 1280. 学生们参加各科测试的次数 - 力扣(LeetCode&…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.27 NumPy+Pandas:高性能数据处理的黄金组合
2.27 NumPyPandas:高性能数据处理的黄金组合 目录 #mermaid-svg-x3ndEE4hrhO6WR6H {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-x3ndEE4hrhO6WR6H .error-icon{fill:#552222;}#mermaid-svg-x3ndEE4hr…...
第一个3D程序!
运行效果 CPP #include <iostream> #include <fstream> #include <string> #include <cmath>#include <GL/glew.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtc/…...
NeuralCF 模型:神经网络协同过滤模型
实验和完整代码 完整代码实现和jupyter运行:https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 NeuralCF 模型由新加坡国立大学研究人员于 2017 年提出,其核心思想在于将传统协同过滤方法与深度学习技术相结…...
第二十三章 MySQL锁之表锁
目录 一、概述 二、语法 三、特点 一、概述 表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。 对于表级锁,主要分为以下三类: 1. 表锁 2. 元数…...
