提前解锁 Vue 3.5 的新特性

Vue 3.5 是 Vue.js 新发布的版本,虽然没有引入重大变更,但带来了许多实用的增强功能、内部优化和性能改进。

1. 响应式系统优化

Vue 3.5 进一步优化了响应式系统的性能,并且减少内存占用。尤其在处理大型或深度嵌套的响应式数组时,性能提高了 10 倍。

举个 🌰

<template><div><p v-for="item in deepArray" :key="item.value">{{ item.value }}</p></div>
</template><script setup>
import { reactive } from 'vue'// 创建一个大型的深度嵌套数组,测试响应式系统的优化效果
const deepArray = reactive([...Array(10000)].map(() => reactive({ value: Math.random() })))
</script>

在这个示例中,我们创建了一个包含 10000 个深度嵌套对象的数组。Vue 3.5 对这种场景的内存和性能进行了优化,可以在大量操作和变化时观察到更流畅的响应式处理。

2. 响应式 Props 解构

在 Vue 3.5 中,响应式 props 解构默认启用。在使用 defineProps 时,可以像处理普通 JavaScript 对象那样解构 props,并且解构后的变量保持响应式。

之前的方式:

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

新方式:

const { count = 0, msg = 'hello' } = defineProps<{ count?: number; msg?: string }>()

解构后的变量 count 和 msg 在模板中使用时会自动保持响应式,且不需要显式地调用 toRefs。

但我没有成功在 Vue 3.5 的项目下运行成功,还需要研究一下 o(╥﹏╥)o。

3. 服务器渲染(SSR)改进

3.1 懒加载补水(Lazy Hydration)

Vue 3.5 引入了懒加载补水功能,使用 defineAsyncComponent() 可以控制异步组件的水合时机。例如:允许异步组件在首次可见时才进行补水操作,减少初次渲染的资源消耗。

3.1.1 解释一下补水(水合操作)!!

补水(Hydration)是一个与服务器端渲染(SSR)相关的术语。

在 SSR 中,Vue 会在服务器上预先渲染组件的 HTML,并将其发送到浏览器。当页面加载时,客户端的 JavaScript 代码会接管这些已经存在的 HTML 元素,并将它们变为动态响应式,这个过程就被称为水合操作(Hydration)

补水(水合操作)的意义

水合操作的主要目的是将服务器端预渲染的静态 HTML 客户端的动态 JavaScript 逻辑连接起来,使页面在首次加载时可以快速显示内容,同时在客户端加载完 JavaScript 之后,页面可以正常交互。这种做法提高了页面的首次加载速度用户体验,特别是在网络环境较差或页面较为复杂时。

补水与懒加载补水

1、普通补水

页面加载时,所有的静态 HTML 会立即被客户端 JavaScript "接管"。这种做法可能会导致在页面初次渲染时,客户端需要同时处理大量的水合任务,从而影响性能。

2、懒加载补水

Vue 3.5 引入的懒加载补水功能指,只在组件首次出现在视口中时才进行水合操作。这样可以减少页面初次渲染时的性能开销,只在需要时才补水,特别适合异步加载的组件或在页面滚动到可见区域时才需要的内容。

举个 🌰

假设我们有一个异步加载的组件 AsyncComponent.vue,在普通补水情况下,这个组件在 SSR 中生成的 HTML 会在页面加载时立即被水合,无论用户是否滚动到该组件的可见区域。而在懒加载补水的情况下,只有当用户滚动到组件可见时,才会触发水合。

App.vue

<template><div class="container"><AsyncComp v-if="visible" /><button @click="toggleVisibility">Toggle Component</button></div>
</template><script setup>
import { ref } from 'vue'
import { defineAsyncComponent, hydrateOnVisible } from 'vue'const visible = ref(false)
const toggleVisibility = () => {visible.value = !visible.value
}
const AsyncComp = defineAsyncComponent({loader: () => import('./components/AsyncComponent.vue'), // 模拟异步加载的组件hydrate: hydrateOnVisible() // 只有在组件可见时才进行水合
})
</script>

AsyncComponent.vue  

<template><div>异步加载的组件</div>
</template>

展示为:

3.2 useId( ) API

useId( ) 是一个新 API,专门为生成在服务器和客户端渲染过程中保持稳定的唯一 ID。这对于生成表单元素和可访问性属性的 ID 非常有用。

举个 🌰

<template><form><label :for="id">Name:</label><input :id="id" type="text" /></form>
</template><script setup>
import { useId } from 'vue'
// 使用 useId 生成一个唯一的 id
const id = useId()
console.log("~ id:", id)
</script>

此功能确保生成的 ID 在 SSR 和客户端渲染时保持一致,确保表单和可访问性属性不会因不匹配导致警告或错误。

4. 自定义元素改进 

Vue 3.5 对 defineCustomElement() API 进行了增强,使 Vue 创建 Web Components 更加灵活。

举个 🌰 App.vue

<template><div class="container"><!-- Vue 自定义元素可以像普通 HTML 元素一样使用 --><my-element title="使用自定义元素" description="这是通过 Vue 定义的 Web Component。"></my-element><br /><my-element /></div>
</template><script setup>
import { defineCustomElement } from 'vue'
import MyElement from './components/MyElement.ce.vue'// 使用 defineCustomElement 注册组件
const MyElementCustom = defineCustomElement(MyElement, {shadowRoot: false,
})
// 通过 customElements.define 注册为自定义元素
customElements.define('my-element', MyElementCustom)
</script>

MyElement.ce.vue

<template><div><h1>{{ title }}</h1><p>{{ description }}</p></div>
</template><script>
export default {props: {title: {type: String,default: '默认标题'},description: {type: String,default: '这是自定义元素的描述内容'}}
}
</script>

 展示为:

4.1 解释一下 .ce.vue

在 Vue.js 中,.ce.vue 文件名中的.ce 通常表示自定义元素(Custom Element)。这种命名方式并不是 Vue 官方强制要求的,而是一种约定俗成的命名规范,用于区分普通的 Vue 组件和用来创建Web Components的自定义元素组件。

自定义元素在许多场景中很有用,特别是希望在多个框架之间共享组件,或者希望组件能够独立运行时,Web Components 是一个很好的选择。而 .ce.vue 文件命名则帮助开发者清楚地知道这个 Vue 组件是为生成 Web Components 而设计的。

5. 新增 useTemplateRef( )

Vue 3.5 引入了 useTemplateRef() API,它允许动态地获取模板引用,特别适用于引用 ID 动态变化或条件变化的场景。相较于传统的 ref,useTemplateRef 可以在运行时根据不同的条件动态更新引用,而不是依赖于静态的 ref 属性。

举个 🌰

<template><input ref="inputRef" type="text" />
</template><script setup>
import { useTemplateRef } from 'vue'// 获取动态引用的 input
const inputRef = useTemplateRef('inputRef')// 在生命周期中可以访问这个引用
onMounted(() => {inputRef.value.focus()
})
</script>

6. 延迟传送(defer Teleport)

Vue 内置 <Teleport> 组件在传送内容时,要求目标元素在组件挂载时已经存在。Vue 3.5 引入了 defer 属性,许传送内容到后才渲染的目标元素。

举个 🌰

<template><div class="container"><Teleport defer to="#dynamic-target"><p>传送内容...</p></Teleport><div id="dynamic-target"></div></div>
</template><script setup>
import { onMounted } from 'vue'
onMounted(() => {setTimeout(() => {// 模拟目标元素动态渲染document.getElementById('dynamic-target').innerHTML = '<div>目标元素已渲染</div>'}, 1000)
})
</script>

展示为: 

这里 Teleport 组件会等待目标元素(#dynamic-target)渲染后再将内容传送过去,可以解决传送目标先于组件渲染的问题。

7. 新增 onWatcherCleanUp()

Vue 3.5 引入了 onWatcherCleanup() API,用于在清理 watch 时注册回调函数。例如,可以在 watch 的回调中清理过时的网络请求。

举个 🌰

<template><div><button @click="id++">更改 ID</button><p>当前 ID: {{ id }}</p></div>
</template><script setup>
import { ref, watch, onWatcherCleanup } from 'vue';const id = ref(1);
// 监控 id 的变化,并在 watcher 停止时清理过时的网络请求
watch(id, (newId) => {const controller = new AbortController();// 发起网络请求fetch(`/api/data/${newId}`, { signal: controller.signal }).then((response) => {if (!response.ok) {throw new Error(`网络请求失败: ${response.status}`);}return response.json(); // 解析 JSON}).then((data) => {console.log('获取的数据:', data);}).catch((error) => {if (error.name === 'AbortError') {console.log('请求被取消');} else {console.error('发生错误:', error);}});// 注册清理函数,取消旧的请求onWatcherCleanup(() => {controller.abort();});
});
</script>

此功能允许在 watch 停止追踪时自动执行清理操作,避免资源泄漏。

8. 总结

Vue 3.5 版本提供了多项增强功能,包括响应式系统的性能优化、响应式 props 解构、SSR 改进、自定义元素支持的扩展等,优化内存、提升性能的同时也提升了 Vue 的开发体验。

有些内容可能不是很详细,大家感兴趣的话,可以自行研究一下。

在此之前:需要确保项目使用的是 Vue 3.5。可以使用以下命令更新项目中的 Vue 版本:

npm install vue@latest
# or
yarn add vue@latest

然后,检查项目中的 package.json,确认 Vue 版本已经更新到 3.5 或更高:

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

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

相关文章

【论文阅读】Grounding Language with Visual Affordances over Unstructured Data

Abstract 最近的研究表明&#xff0c;大型语言模型&#xff08;llms&#xff09;可以应用于将自然语言应用于各种各样的机器人技能。然而&#xff0c;在实践中&#xff0c;学习多任务、语言条件机器人技能通常需要大规模的数据收集和频繁的人为干预来重置环境或帮助纠正当前的…

unix中如何查询和修改进程的资源限制

一、前言 一个进程在运行时&#xff0c;会用到各种资源&#xff0c;比如cpu的使用时间、内存空间、文件等等。那么&#xff0c;一个进程能够占用多少资源呢&#xff1f;cpu使用的时间有多长&#xff1f;进程空间有多大&#xff1f;能够创建多少个文件&#xff1f;这个就是本文…

【数据结构】设有一带头结点的单链表,编程将链表颠倒过来。要求不用另外的数 组或结点完成。

编程题: 设有一带头结点的单链表,编程将链表颠倒过来。要求不用另外的数 组或结点完成。 分析: 该算法通过维护三个指针(prev、curr 和 next)逐步遍历单链表,实现链表的逆转。在遍历过程中,curr 的 next 指针被更新为指向 prev,逐步反转指向。最终,头结点的 next 指针…

用户态缓存:高效数据交互与性能优化

目录 1. 用户态缓存区工作背景 1.1 为什么每条连接都需要读写缓存区 1.1.1 读缓存区&#xff08;Read Buffer&#xff09; 1.1.2 写缓存区&#xff08;Write Buffer&#xff09; 1.2 用户态缓存区的工作流程 1.3 用户态缓存区的重要性 2. UDP 和 TCP 的设计差异 2.1 UD…

Python模块和包:标准库模块(os, sys, datetime, math等)②

文章目录 一、os 模块1.1 获取当前工作目录1.2 列出目录内容1.3 创建和删除目录1.4 文件和目录操作 二、sys 模块2.1 获取命令行参数2.2 退出程序2.3 获取 Python 版本信息 三、datetime 模块3.1 获取当前日期和时间3.2 日期和时间的格式化3.3 日期和时间的运算 四、math 模块4…

私有化聊天软件成为企业内部通讯新趋势

在数字化转型浪潮的推动下&#xff0c;企业对于高效、安全、灵活的内部通讯需求日益增长。传统的电子邮件、电话会议等沟通方式已难以满足现代企业对即时性、协作性和信息安全性的要求。因此&#xff0c;私有化聊天工具作为企业内部通讯的定制化解决方案&#xff0c;正逐渐成为…

我的数据库第一课:从懵懂到启迪

我的数据库第一课&#xff1a;从懵懂到启迪 前言 在数字化浪潮席卷全球的今天&#xff0c;数据库作为IT技术的“活化石”&#xff0c;已经成为不可或缺的基础设施。特别是在国内&#xff0c;随着经济的飞速发展和信息化建设的推进&#xff0c;数据库技术也经历了从无到有、从…

企业微信用户授权与校验完整对接流程

Hello&#xff01;欢迎各位新老朋友来看小弟博客&#xff0c;祝大家事业顺利&#xff0c;财源广进&#xff01;&#xff01; 主题&#xff1a;企业微信用户授权与校验完整对接流程 一&#xff1a;构造第三方应用授权链接 如果第三方应用需要在打开的网页里面携带用户的身份信息…

解锁数字转型新纪元:Vatee万腾平台,您的智能加速与策略智库

在数字经济时代的大潮中&#xff0c;企业的数字化转型已不再是选择题&#xff0c;而是必答题。面对这一挑战&#xff0c;Vatee万腾平台以其卓越的技术实力和前瞻性的战略视野&#xff0c;成为了众多企业加速数字化转型、实现智能化升级的得力助手和智囊团。 加速转型&#xff…

个人量化成功之路-----用代码一键画图Donchian Channel(唐奇安通道指标)

Donchian Channel&#xff08;唐奇安通道指标&#xff09;是用于交易突破的最古老、最简单的技术指标之一。是由Richard Donchian 提出的一个由三条线&#xff08;上阻力线、下支撑线、中心线&#xff09;组成的通道指标。 一般来说&#xff0c;唐奇安通道的宽度越宽&#xff0…

ISSCC34.7解析一种具备内存编码与刷新功能的eDRAM查找表数字存内计算芯片

一、引言 1. DCIM概述 数字存内计算&#xff08;Digital Computing-in-Memory, DCIM&#xff09;是一种将计算操作直接集成到存储单元中的新兴计算架构。传统计算模型&#xff08;冯诺依曼架构&#xff09;中的计算和存储是分离的&#xff0c;数据必须频繁在存储器和处理单元…

FastDFS的docker部署及实现头像上传

FastDFS的使用并实现头像上传 一、FastDFS概述二、安装FastDFS1. 拉取镜像2. 安装tracker3. 安装storage4. NGINX服务启动三、配置和依赖配置依赖四、头像上传一、FastDFS概述 概述 上传交互过程 两个服务:Tracker Server 和Storage Server Tracker Server 跟踪服务,负责调…

UNRAID系统忘记密码解决办法

前言 unraid系统自己通过命令修改密码以后&#xff0c;怎么也进不去了。 这次带来如何重置密码 操作

着色器 简介

着色器&#xff08;Shader&#xff09;是运行在 GPU 上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说&#xff0c;着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序&#xff0c;因为它们之间不能相互通信&#xff1b;它们之间…

C语言进阶【5】---数据在内存中的存储【2】(小数存储很难吗?)

本章概述 本章引要练习 浮点数的存储浮点数的取出小补充题目解析彩蛋时刻&#xff01;&#xff01;&#xff01; 本章引要 常见的浮点数&#xff1a;3.1415&#xff0c;1E10等。其中&#xff0c;1E10是科学计数法的形式&#xff0c;它也就等于1*10^10。小数数据类型&#xff1…

猫头虎 分享已解决Bug || Uncaught (in promise) ReferenceError: proxy is not defined 解决方案

&#x1f42f; 猫头虎 分享已解决Bug || Uncaught (in promise) ReferenceError: proxy is not defined 解决方案 今天猫头虎带您探讨一个开发中常见但让人头疼的错误&#xff1a;Uncaught (in promise) ReferenceError: proxy is not defined。 很多前端开发者在工作中都会遇…

中国书法—孙溟㠭浅析碑帖《爨宝子碑》

中国书法——孙溟㠭浅析碑帖《爨宝子碑》 《爨宝子碑》 全称是《晋故振威将军建宁太守爨宝子之墓》&#xff0c;此碑刻于东晋大亨四年&#xff08;公元405年&#xff09;属楷书体。 《爨宝子碑》 《爨宝子碑》 至清朝乾隆四十三年&#xff08;1778年&#xff09;在云南南宁&…

基于C#+SQL Server2005(WinForm)图书管理系统

图书管理系统 一、 首先把数据库脚本贴出来(数据库名为library) USE [library] GO /****** Object: Table [dbo].[books] Script Date: 06/12/2016 11:27:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[books]([bNum] [nvarchar](10…

Σ-Δ模数转换器(ADC)揭秘(2)

5. Maxim的Σ-Δ ADC 新型高度集成Σ-Δ ADC以最少数量的外部元件处理小信号。例如&#xff0c;MAX1402芯片包括众多功能&#xff0c;被作为片上系统(图12)。器件在工作模式下的静态电流低至250A(关断模式下为2A)&#xff0c;480sps速率时的精度为16位&#xff0c;4800sps速率…

英语六级-学习

01 英语分值比例 02听力学习 听力练习&#xff0c;基础好选择标准VOA和BBC。基础差选择VOA慢速。 听力内容包括不受政治争议的内容&#xff0c;社会生活类(奇闻趣事、日常生活)、经济类(商务、职场相关)、环保类、互联网类---------根据各类主题快速找到录音材料中心点。 研…