# 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>
其他不常用的就不在说明了
# Vue3.5常用特性整理的更多相关文章
- 【linux】---常用命令整理
linux常用命令整理 一.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: l ...
- vue3.0新特性以及进阶路线
Vue3.0新特性/改动 新手学习路线 ===> 起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要 ...
- 探索ASP.NET MVC5系列之~~~4.模型篇---包含模型常用特性和过度提交防御
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- ES6的一些常用特性
由于公司的前端业务全部基于ES6开发,于是给自己开个小灶补补ES6的一些常用特性.原来打算花两天学习ES6的,结果花了3天才勉强过了一遍阮老师的ES6标准入门(水好深,ES6没学好ES7又来了...) ...
- NiosII常用函数整理
NiosII常用函数整理 IO操作函数函数原型:IORD(BASE, REGNUM) 输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量函数说明:从基地址为BASE的设备中读取寄存器中偏 ...
- MAC机常用快捷键整理表格
MAC机常用快捷键整理表格 范围 快捷键 说明 图形 (Command 键)在某些 Apple 键盘上,此键也可能为标志() Control (Control 键) Alt Opt ...
- sublime常用快捷键整理(未完待续)
sublime常用快捷键整理: 基本操作 cmd+o 打开文件 cmd+w 关闭当前tab cmd+n 打开新页 cmd+shift+n 打开刚刚关闭的页签 一.选择命令 1.多个单词选择 cmd+d ...
- zendStudio常用快捷键整理
在来一发zendstudio的常用快捷键整理,今天心情不错哈哈 Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ct ...
- 常用DOM整理
常用DOM整理 前言: html为document搭建了一棵DOM树,这棵树就是有一系列Node节点所构成的.他为我们定义了文档的结构. Node类型: Node.ELEMENT_NODE(1); ...
- MVC常用特性
MVC常用特性使用 简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将 ...
随机推荐
- langchain_chatchat+ollama部署本地知识库,联网查询以及对数据库(Oracle)数据进行查询
langchain_chatchat+ollama部署本地知识库,联网查询以及对数据库(Oracle)数据进行查询 涉及的内容其实挺多的,所以尽量减少篇幅 目录 langchain_chatchat+ ...
- jenkins拉取github代码报错问题解决
问题起因: 踩坑踩坑 用jenkins拉取github项目的代码时,配置完成点击构建时,报错信息为:Couldn't find any revision to build. Verify the re ...
- Java 日志缓存机制的实现
本文介绍了 Java 日志机制,并通过扩展日志功能,实现日志缓存.同时,可以动态控制日志信息打印到日志文件的级别,从而提高了日志的灵活性,给产品质量带来更大的帮助.文章主要围绕 MemoryHandl ...
- 使用 ASM 实现 Java 语言的“多重继承”
问题的提出 在大部分情况下,需要多重继承往往意味着糟糕的设计.但在处理一些遗留项目的时候,多重继承可能是我们能做出的选择中代价最小的.由于 Java 语言本身不支持多重继承,这常常会给我们带来麻烦,最 ...
- manim边做边学--圆柱体
Cylinder是Manim中用于创建圆柱体对象的类. Cylinder类在制作数学.物理或工程领域的动画时,可用于以下的场景中: 演示几何概念:使用Cylinder类创建圆柱体,并通过改变其参数和方 ...
- 理解Java BlockingQueue
数据结构与算法是天生一对. BlockingQueue叫做阻塞队列,在Java线程池相关的实现中有广泛的使用. BlockingQueue实现的功能如下: 当队列为空时,往队列中读数据将被阻塞. 当队 ...
- 使用 Visual Studio 调试器附加到正在运行的进程
使用 Visual Studio 调试器附加到正在运行的进程 使用场景 当项目在测试环境上有bug,需要运行代码调试一下,这时就需要在测试环境上安装一个调试工具,然后在本地运行代码,远程链接到测试环境 ...
- 教你自创工作流,赋予AI助理个性化推荐超能力
之前,我们已经完成了工作流的基本流程和整体框架设计,接下来的任务就是进入实际操作和实现阶段.如果有同学对工作流的整体结构还不够熟悉,可以先参考一下这篇文章,帮助你更好地理解和掌握工作流的各个部分: 本 ...
- MarkDown文档的编写
MarkDown的基本语法 MarkDown的标题语法 通过#进行创建标题,#的数量控制标题的级别 MarkDown的段落语法 通过空白行将一行或者多行文本进行分隔 MarkDown的强调语法 粗 ...
- 《前端运维》一、Linux基础--12网络
这是linux部分的最后一篇内容,我们一起来学习下Linux网络. 我们先看些命令吧: ifconfig,查看与配置网络状态. netstat,查询网络状态,常用选项如下: -t,列出TCP协议端口 ...