vue3.5新特性

vue在2024.09.03发布了3.5正式版本,其中包含多方面的升级和优化

性能优化

响应式系统重构优化,在内存占用、性能方面均有收益

Memory Usage Improvements

Given a test case with 1000 refs + 2000 computeds (1000 chained pairs) + 1000 effects subscribing to the last computed, comparing the total memory used by these class instances:

  • Before (3.4.19): 1426k
  • After (this PR): 631k (-56%)

Performance Comparison

Reasonable gains across the board, most notably for single ref invoking multiple effects (+118%~185%) and reading multiple invalidated computeds (+176%~244%).

  • 单个 ref 调用多个 effects:当一个 ref(Vue 中的响应式数据)被多次使用并触发多个副作用(effects)时,性能提升了118%到185%。这意味着在 Vue 的新优化下,相同的操作现在比以前快了将近两倍。
  • 读取多个无效的计算属性:计算属性是基于响应式数据的缓存值。当这些计算属性由于依赖的数据改变而变得无效时,重新读取这些属性的性能提升了176%到244%。这表明在处理多次读取失效的计算属性时,性能有了非常明显的提升

响应式相关

defnieProps支持解构

  • 之前defineProps不支持解构,相比之前,支持解构后,不失响应式特性
const { count } = defineProps(['count'])

watch onWatcherCleanup支持注册清理函数

  • Watch api中,监听对象发生变化后,清理副作用不再使用的引用,避免内存泄漏
watch(id, async (newId, oldId) => {const { response, cancel } = doAsyncWork(newId)// `cancel` will be called if `id` changes, cancelling// the previous request if it hasn't completed yetonWatcherCleanup(cancel)data.value = await response
})
function doAsyncWork(id: string) {const source = new AbortController();const { signal } = source;const response = fetch(`/api/data?id=${id}`, { signal });return { response, cancel: () => source.abort() };
}
  • 和onEffectCleanup的区别,不在watch中用,就不会被注册生效
<script setup>
watchEffect(async () => {data1.value = await queryAsyncData('api1', id.value)data2.value = await queryAsyncData('api2', id.value)
})// When getting called outside of the scope of Watch API,
// since there is no active effect scope,
// therefore the cleanup callback for cancel will not be registered
async function pull() {data3.value = await queryAsyncData('api3', id.value)
}
pull()
</script>

watch deep支持数字

// infinite depth
watch(src, () => {}, { deep: true })// explicit depth
watch(src, () => {}, { deep: 1 })

新增pause/resume方法 控制effect执行

  • 主要是为了避免一些不必要的副作用执行以提升性能,比如keep-alive组件,暂停deactive非激活状态下的副作用执行,或者结合IntersectionObserver延迟执行副作用场景
const { stop, resume, pause } = watch(refs,callback)stop()resume()pause()

onEffectCleanup支持注册清理函数

  • 利用副作用,清除监听、定时器等不再使用的引用,避免内存泄漏
export function queryAsyncData(api, id) {const { response, cancel } = doAsyncWork(api, id)// `cancel` will be called if this function get called in Watch API and the effect source changed// so that previous pending request will be cancelled// if not yet completedif (getCurrentEffect()) {onEffectCleanup(cancel)}return response
}
// in component setup or vapor render
watchEffect(() => {on(el1, eventName.value, handler)on(el2, eventName.value, handler)
})// in runtime-vapor pkg
function on(el, event, handler) {el.addEventListener(event, handler)if (getCurrentEffect()) {onEffectCleanup(() => {el.removeEventListener(event, handler)})}
}

add failSilently argument for onScopeDispose

  • onScopeDispose 用于在组件销毁时自动清除定时器,避免内存泄漏
import { ref, onScopeDispose } from 'vue';export default {setup() {const timer = ref(null);function startTimer() {timer.value = setInterval(() => {console.log('Timer is running');}, 1000);}// 当作用域销毁时,清除定时器onScopeDispose(() => {clearInterval(timer.value);},true);startTimer();return {timer,};},
};
  • 新增参数,支持静默告警
    • 其实就是提供了屏蔽告警日志的参数

其他新特性

useId

  • 主要是为了创建唯一的id用在dom属性上,每次调用 useId()都会创建唯一的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>

useTemplateRef

  • 以往用ref既是用于响应式数据的,又用在dom上,就会会造成疑惑,所以专门有这个处理dom
<script setup>
import { useTemplateRef, onMounted } from 'vue'const inputRef = useTemplateRef('input')onMounted(() => {inputRef.value.focus()
})
</script><template><input ref="input" />
</template>
app.onUnmount()
  • 卸载时一些处理,比如清理不必要的引用等
function install(app: App) {function cleanupSomeSideeffect() {/* ...*/}//清理app.onUnmount(cleanupSomeSideffect);
}app.config.throwUnhandledErrorInProduction
- 主要为了生产环境下抛出错误
app.config.throwUnhandledErrorInProduction = true

自定义元素

  • Vue对Web Components的支持,使得开发者可以创建自定义元素,这些元素可以跨框架使用,甚至在不使用Vue.js的项目中也可以使用。

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

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

相关文章

【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析

文章目录 C string 类详解&#xff1a;从入门到精通前言第一章&#xff1a;C 语言中的字符串 vs C string 类1.1 C 语言中的字符串1.2 C string 类的优势 第二章&#xff1a;string 类的构造与基础操作2.1 string 类的构造方法2.1.1 示例代码&#xff1a;构造字符串 2.2 string…

二期 1.4 Nacos安装部署 - Window版

本文目录 Nacos支持三种部署模式环境准备下载Nacos启动登录服务注册与查看Nacos支持三种部署模式 单机模式 - 用于测试和单机试用。集群模式 - 用于生产环境,确保高可用。多集群模式 - 用于多数据中心场景。以 Window单机模式 抛转引玉,其它部署方式参考官方文档: https://n…

使用Python实现深度学习模型:智能电影制作与剪辑

随着人工智能技术的飞速发展,深度学习在各个领域的应用越来越广泛。在电影制作与剪辑领域,深度学习技术也展现出了巨大的潜力。本文将介绍如何使用Python实现一个简单的深度学习模型,用于智能电影制作与剪辑。我们将使用TensorFlow和Keras库来构建和训练模型,并展示如何应用…

部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现

部署资源 AUTODL 使用最小3080Ti 资源&#xff0c;cuda > 12.0使用云服务器&#xff0c;部署fastGPT oneAPI&#xff0c;M3E 模型 操作步骤 配置代理 export HF_ENDPOINThttps://hf-mirror.com下载qwen2模型 - 如何下载huggingface huggingface-cli download Qwen/Qwen2-…

Python编程入门指南

本文为初学者提供了全面的Python编程入门指南&#xff0c;涵盖了基础语法、控制结构、函数、数据结构、文件操作、异常处理、模块与包、面向对象编程以及一些高级特性&#xff0c;帮助读者快速掌握Python编程的核心知识。通过详细解释Python编程的各个方面&#xff0c;文章旨在…

flutter遇到问题及解决方案

目录 1、easy_refresh相关问题 2、 父子作用域关联问题 3. 刘海屏底部安全距离 4. 了解保证金弹窗 iOS端闪退 &#xff08;待优化&#xff09; 5. loading无法消失 6. dialog蒙版问题 7. 倒计时优化 8. scrollController.offset报错 9. 断点不走 10.我的出价报红 11…

Python3爬虫教程-HTTP基本原理

HTTP基本原理 1&#xff0c;URL组成部分详解2&#xff0c;HTTP和HTTPS3&#xff0c;HTTP请求过程4&#xff0c;请求&#xff08;Request&#xff09;请求方法&#xff08;Request Method&#xff09;请求的网址&#xff08;Request URL&#xff09;请求头&#xff08;Request H…

Redmi Note 7 Pro(violet)免授权9008文件分享及刷机教程

获取文件 关注微信公众号 heStudio Community回复 violet_9008 获取下载链接。 刷机教程 下载搞机助手&#xff08;可以从上方文件中获取&#xff09;并安装。手机按音量减键和电源键进入 Fastboot 模式&#xff0c; 打开搞机助手&#xff0c;点击进入 9008 模式 等待手机…

IDEA 关闭自动补全功能(最新版本)

文章目录 一、前言二、关闭自动补全三、最终效果 一、前言 在最新的 IDEA 中发布了自动补全功能&#xff0c;当你输入代码时&#xff0c;IDEA 会自动显示你可能想输入的代码&#xff0c;减少手动输入的工作量&#xff0c;它会根据上下文提供正确的选项&#xff0c;提高代码的准…

Java-数据结构-二叉树-习题(三)  ̄へ ̄

文本目录&#xff1a; ❄️一、习题一(前序遍历非递归)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️二、习题二(中序遍历非递归)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️三、习题三(后序遍历非递归)&#xff1a; ▶ 思路&#xff1a; …

C++——打印以下图案:用字符数组方法。

没注释的源代码 #include <iostream> using namespace std; int main() { char a[5]{*,*,*,*,*}; for(int i0;i<5;i) { for(int j0;j<i;j) { cout<<" "; } for(int k0;k<5;k) …

vue使用PDF.JS踩的坑--部署到服务器上显示pdf.mjs viewer.mjs找不到资源

之前项目使用的pdf.js 是2.15.349版本&#xff0c;最近换了一个4.6.82的版本&#xff0c;在本地上浏览文件运行的好好的&#xff0c;但是发布到服务器&#xff08;IIS&#xff09;上打不开文件&#xff0c;控制台提示找不到pdf.mjs viewer.mjs。 之前使用的2.15.349pdf和viewer…

Git使用手册

1、初识Git 概述&#xff1a;Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理项目版本管理。 知识点补充&#xff1a; 版本控制&#xff1a;一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 分布式&#xff1a;每个人…

oracle 多表查询

3.6多表查询 当查询的数据并不是来源一个表时&#xff0c;需要使用多表连接操作完成查询。多表连接查询通过表之间的关联字段&#xff0c;一次查询出多个表的数据。 3.6.1等值连接 等值连接也称为简单连接(Simple Joins)或者内连接(Inner Join)。通过等号来判断连接条件中的数据…

M9410A VXT PXI 矢量收发信机,300/600/1200MHz带宽

M9410A PXI 矢量收发信机 -300/600/1200MHz带宽- M9410A VXT PXI 矢量收发信机&#xff0c;300/600/1200MHz带宽支持 5G 的 PXI 矢量收发信机&#xff08;VXT&#xff09;是一个 2 插槽模块&#xff0c;具有 1.2 GHz 的瞬时带宽 主要特点 Keysight M9410A VXT PXIe 矢量收发…

切换笔记本键盘的启用与禁用状态

使用批处理脚本切换笔记本键盘的启用与禁用状态 背景描述详细步骤及代码解释1. 在管理员模式下运行脚本2. 脚本内容3. 解释 背景描述 在笔记本电脑中&#xff0c;在外接键盘的时候&#xff0c;有时我们希望禁用内置键盘&#xff0c;防止意外按键。Windows 系统中&#xff0c;键…

Leetcode 1039. 多边形三角形剖分的最低得分 枚举型区间dp C++实现

问题&#xff1a;Leetcode 1039. 多边形三角形剖分的最低得分 你有一个凸的 n 边形&#xff0c;其每个顶点都有一个整数值。给定一个整数数组 values &#xff0c;其中 values[i] 是第 i 个顶点的值&#xff08;即 顺时针顺序 &#xff09;。 假设将多边形 剖分 为 n - 2 个三…

【QML】Button图标设置透明颜色,会变模糊有阴影

原图效果 1. 透明 1.1 效果 1.2 代码 Button{id: _mBtnwidth: parent.widthheight: parent.heightbackground: Rectangle{id: _mBgradius: 5antialiasing: truecolor: "white"}icon{source: _mRoot._mIconSourcecache: falsecolor: "transparent" //透明…

企微私域助手:重塑企业营销新生态的智能引擎

在数字化浪潮席卷全球的今天&#xff0c;企业营销已不再局限于传统渠道的广撒网模式&#xff0c;而是更加注重精细化运营与高效转化。企业微信&#xff08;简称“企微”&#xff09;作为连接企业内外、打造私域流量的重要平台&#xff0c;正逐步成为企业营销的新蓝海。而企微私…

[spring]MyBatis介绍 及 用MyBatis操作简单数据库

文章目录 一. 什么是MyBatis二. MyBatis操作数据库步骤创建工程创建数据库创建对应实体类配置数据库连接字符串写持久层代码单元测试 三. MyBatis基础操作打印日志参数传递增删改查 四. MyBatis XML配置文件配置链接字符串和MyBatis写持久层代码方法定义Interface方法实现xml测…