# Vue3.5常用特性整理

news/2025/1/24 10:33:32/文章来源:https://www.cnblogs.com/weizwz/p/18689185

Vue3.5 发布已近半年,抽空整理下常用的新增/改动特性

响应式 Props 解构

Vue3.5 中 Props 正式支持解构了,并添加了响应式跟踪

设置默认值

使用 JavaScript 原生的默认值语法声明 props 默认值

以前

const props = withDefaults(defineProps<{count?: numbermsg?: string}>(),{count: 0,msg: 'hello'}
)

现在

const { count = 0, msg = 'hello' } = defineProps<{count?: numbermessage?: 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>

还可以指定特定类型。允许的值有:textchildren (仅允许直接子组件不匹配),classstyleattribute

其他

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>

其他不常用的就不在说明了

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

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

相关文章

IDEA如何将一行上移或者下移

前言 大家好,我是小徐啊。我们在使用IDEA开发Java应用的时候,都会使用到IDEA的快捷键。这些快捷键帮助我们提高了开发的效率。今天,我要介绍下,在IDEA中如何将某一行代码上移或者下移。这个技巧在我们编写代码的时候还是很有效的。 如何下移一行代码 首先,我们需要打开IDE…

NFS动态存储实战案例

NFS动态存储实战案例Kubernetes 不包含内部 NFS 驱动。你需要使用外部驱动为 NFS 创建 StorageClass。卷插件 内置配置器 配置示例AzureFile ✓ Azure FileCephFS - -FC - -FlexVolume - -iSCSI - -Local - LocalNFS - NFSPortworxVolume ✓ Portworx VolumeRBD ✓ Ceph RBDVsp…

为什么Claude AI在与ChatGPT的竞争中落后——尽管产品更优越

Claude广告由Anthropic开发的Claude AI因其技术能力受到赞誉,有些用户声称它在上下文理解和处理更大文本输入方面优于ChatGPT。然而,一个强大的产品并不一定能直接转化为市场主导地位。尽管Claude AI具有潜力,但在ChatGPT主导的竞争市场中,它却难以获得关注。 问题不在于技…

STM32 IAP(OTA)

一、背景知识STM32启动流程(从内部flash启动)[1]正常情况下,程序从Flash启动时的流程如下:(转载自) https://blog.csdn.net/qq_42190402/article/details/139671333程序从Flash启动,根据中断向量表找到复位中断处理函数的地址。(0x0800 0004处是中断向量表的起始地址,也…

稀疏基因组学:大规模基因组分析的新范式

随着基因测序技术的飞速发展,我们面临着一个巨大的挑战:如何高效地处理和分析海量的基因组数据。 2025年1月21日,发表在《Nature Communications》上的一篇论文提出了一个名为“稀疏化基因组学”(Sparsified Genomics)的新概念,通过系统性地排除基因组序列中的大量碱基,…

【译】我们最喜欢的2024年的 Visual Studio 新功能

去年,Visual Studio 团队发布了许多新的面向开发人员的改进和 AI 集成,其中许多直接来自您在开发者社区的反馈。在这篇文章中,我们将重点介绍2024年团队最喜欢的功能,这些功能可以提高生产力,简化工作流程,并增强您的编码体验。让我们开始吧! 图像悬停预览:立即看到您的…

如何修改PHP网站的名称,以确保名称准确且符合品牌形象?

修改PHP网站的名称是一个重要的任务,它不仅关系到网站的准确性和专业性,还影响到用户体验和品牌形象。以下是详细的步骤和建议:备份现有文件:在进行任何修改之前,务必备份网站的原始文件和数据库,以防止意外情况发生。 确定修改位置:通常,网站名称位于模板文件中,如he…

【分享】晶尊微MC802:打造炫酷触控发光方案,轻松点亮创意未来

MC802 带 2 个自校正容性触摸按键功能和 4 个 I/O 口的单片机,是以 EPROM 作为记忆体的 8 位微控制器,专为多 IO 产品的应用而设计。最近,科技圈出现这样一个好东西。它不仅能随时为手机、耳机等充电设备提供应急充电,还能瞬间变身露营灯、氛围灯、台灯,满足不同场景下的需…

二-2、代码生成-swagger

地址 http://192.168.0.115:39999/swagger-ui.html?docExpansion=none/ 位置步骤配置数据库数据Cb-SYSMICROSERVICE(微服务)Cb-SYSRELATIONTABLE(表)生成代码传参 { "author": "jmc",--作者 "lngmsid": 207,--SYSMICROSERVICE表ID "ln…

为什么PHP无法正常修改网站?

PHP无法正常修改网站可能有多种原因,以下是一些常见的问题和解决方法:文件权限问题:确保PHP脚本有足够的权限来修改网站文件。检查文件和文件夹的权限设置,确保PHP进程有权读取、写入和执行相关文件。路径问题:确认PHP脚本中使用的文件路径是正确的。如果路径错误,PHP将无…

如何修改后台网站底部信息?

要修改后台网站底部信息,通常可以按照以下步骤进行:登录到后台管理系统:使用管理员账号和密码登录到网站的后台管理系统。找到页面编辑功能:在后台管理系统中,找到可以编辑页面内容的功能或模块。这可能是一个可视化编辑器、HTML编辑器或其他类似的工具。定位到底部区域:…

如何修改PHP网站的页面内容?

要修改PHP网站的页面内容,通常可以按照以下步骤进行:确定要修改的页面:首先,明确您想要修改的具体页面。这可能是首页、产品页面、文章页面等。找到页面文件:根据页面的类型和位置,找到对应的PHP文件。这些文件通常位于网站的根目录或特定的文件夹中。备份文件:在进行任…