当前位置: 首页 > article >正文

vue3.2响应式优化

Vue 3.2 在响应式方面做了诸多优化,进一步提升了性能,下面为你详细介绍:

1. shallowReactiveshallowRef 的性能优势

  • 原理shallowReactiveshallowRef 是浅层响应式 API。shallowReactive 仅对对象的第一层属性进行响应式处理,而 shallowRef 只对 .value 的赋值操作进行响应式跟踪,不会递归地将嵌套对象转换为响应式对象。
  • 性能提升体现:在处理大型数据结构时,如果只需要对对象的浅层属性进行响应式更新,使用 shallowReactiveshallowRef 可以避免对深层嵌套对象进行不必要的代理转换,减少了初始化时的性能开销。例如,当你有一个包含大量嵌套数据的对象,但只需要监听其顶层属性的变化时,使用 shallowReactive 能显著提高性能。
<template><div><button @click="updateTopLevel">Update Top Level</button><p>{{ state.topLevelProp }}</p></div>
</template><script setup>
import { shallowReactive } from 'vue';const state = shallowReactive({topLevelProp: 'Initial Value',nested: {deepProp: 'Deep Value'}
});const updateTopLevel = () => {state.topLevelProp = 'New Value';
};
</script>

2. markRaw 减少响应式开销

  • 原理markRaw 函数可以标记一个对象,使其永远不会被转换为响应式对象。当你有一些大型的第三方库对象或者不需要进行响应式处理的对象时,可以使用 markRaw 来避免 Vue 对其进行不必要的代理包装。
  • 性能提升体现:避免了对这些对象进行响应式转换所带来的性能损耗,同时也减少了内存占用。例如,在引入一个大型的图表库对象时,使用 markRaw 可以防止 Vue 对其进行递归代理,从而提高应用的性能。
<template><div><!-- 使用标记为原始的对象 --></div>
</template><script setup>
import { markRaw } from 'vue';
import LargeLibraryObject from 'large-library';const rawObject = markRaw(LargeLibraryObject);
</script>

3. 响应式系统的优化

  • 原理:Vue 3.2 对响应式系统的内部实现进行了优化,减少了依赖收集和触发更新时的开销。在依赖收集过程中,采用了更高效的数据结构和算法,使得追踪依赖的过程更加快速和准确。
  • 性能提升体现:在复杂的组件树中,当数据发生变化时,能够更快地确定哪些组件需要更新,从而减少不必要的重新渲染。例如,在一个包含大量嵌套组件的应用中,当某个数据发生变化时,响应式系统可以更精准地找到依赖该数据的组件,避免了对整个组件树的遍历和重新渲染。

4. toReftoRefs 的高效使用

  • 原理toReftoRefs 用于创建响应式引用,它们可以在不失去响应性的情况下,将对象的属性单独提取出来。toRef 可以创建单个属性的响应式引用,而 toRefs 可以将对象的所有属性转换为响应式引用。
  • 性能提升体现:在解构响应式对象时,使用 toRefs 可以避免失去响应性,同时也减少了因解构而导致的依赖重新收集和更新的开销。例如,在组件中使用 toRefs 解构 props 对象时,可以确保在父组件更新 props 时,子组件能够正确响应变化,而不需要额外的性能开销。
<template><div><p>{{ propRef }}</p></div>
</template><script setup>
import { toRef } from 'vue';
const props = defineProps({myProp: String
});
const propRef = toRef(props, 'myProp');
</script>

综上所述,Vue 3.2 在响应式方面的这些优化措施,使得开发者能够更灵活地控制响应式数据的创建和使用,从而提高应用的性能和响应速度。

数据结构优化
Vue 3 在依赖收集过程中采用了一些高效的数据结构和算法,以提升追踪依赖的速度和准确性,下面为你详细介绍:

1. WeakMap

原理

WeakMap 是 JavaScript 中的一种数据结构,它的键必须是对象,并且这些对象是弱引用的。这意味着如果没有其他地方引用这些对象,它们可以被垃圾回收机制自动回收,而不会造成内存泄漏。

在 Vue 3 中的应用

在 Vue 3 的响应式系统里,WeakMap 被用于存储对象和其对应的 Dep(依赖)对象之间的映射关系。当一个响应式对象被创建时,Vue 会为其在 WeakMap 中创建一个对应的 Dep 对象,用于存储依赖该对象的副作用函数(如组件的渲染函数)。这样,当对象的属性发生变化时,Vue 可以通过 WeakMap 快速找到对应的 Dep 对象,进而通知所有依赖该对象的副作用函数进行更新。

示例代码(简化示意)
const targetMap = new WeakMap();function track(target, key) {let depsMap = targetMap.get(target);if (!depsMap) {depsMap = new Map();targetMap.set(target, depsMap);}let dep = depsMap.get(key);if (!dep) {dep = new Set();depsMap.set(key, dep);}// 假设 activeEffect 是当前正在执行的副作用函数if (activeEffect) {dep.add(activeEffect);}
}function trigger(target, key) {const depsMap = targetMap.get(target);if (depsMap) {const dep = depsMap.get(key);if (dep) {dep.forEach(effect => effect());}}
}

2. Map

原理

Map 是 JavaScript 中的一种键值对数据结构,它允许使用任意类型的值作为键。与普通对象不同,Map 可以更方便地进行键值对的管理和查找操作。

在 Vue 3 中的应用

在上述 WeakMap 的基础上,每个响应式对象对应的 Dep 对象存储在 Map 中,键是对象的属性名,值是一个 Set,用于存储依赖该属性的副作用函数。通过 Map,Vue 可以快速定位到对象的某个属性对应的依赖集合,从而在属性值发生变化时通知这些依赖进行更新。

3. Set

原理

Set 是 JavaScript 中的一种集合数据结构,它存储唯一的值,不允许重复。Set 提供了高效的添加、删除和查找操作。

在 Vue 3 中的应用

在 Vue 3 的依赖收集过程中,Set 被用于存储依赖某个属性的副作用函数。当一个属性被访问时,会将当前正在执行的副作用函数添加到该属性对应的 Set 中;当属性值发生变化时,会遍历这个 Set 并执行其中的所有副作用函数。使用 Set 可以确保每个副作用函数只被添加一次,避免重复执行。

4. 高效的算法优化

依赖收集的懒加载

Vue 3 采用了懒加载的方式进行依赖收集,即只有在真正访问一个响应式对象的属性时,才会进行依赖收集。这样可以避免在初始化时对所有属性进行不必要的依赖收集,减少了性能开销。

依赖更新的优化

在通知依赖更新时,Vue 3 会对副作用函数进行排序和批量处理,避免不必要的重复渲染。例如,对于嵌套组件的更新,会先更新父组件,再更新子组件,确保更新过程的高效性。

综上所述,Vue 3 通过 WeakMapMapSet 等数据结构以及一些高效的算法优化,实现了快速、准确的依赖收集和更新机制,提升了响应式系统的性能。

相关文章:

vue3.2响应式优化

Vue 3.2 在响应式方面做了诸多优化&#xff0c;进一步提升了性能&#xff0c;下面为你详细介绍&#xff1a; 1. shallowReactive 和 shallowRef 的性能优势 原理&#xff1a;shallowReactive 和 shallowRef 是浅层响应式 API。shallowReactive 仅对对象的第一层属性进行响应式…...

【Linux】线程概念与控制

线程概念与控制 一.Linux线程概念1.什么是线程&#xff1f;2.分页式存储管理1.虚拟地址和页表的由来2.物理内存管理3.页表4.页目录结构5.两级页表的地址转换6.缺页中断(异常) 3.线程的优点(面试题)4.线程的缺点5.线程异常6.线程用途 二.Linux进程VS线程1.进程和线程2.进程的多个…...

零基础学习Python之循环详解:从入门到实践_我的学习Python记录11

零基础学习Python之循环详解&#xff1a;从入门到实践_我的学习Python记录11 一、前言 最近我在学习Python&#xff0c;发现很多编程概念和用法都让我感到陌生&#xff0c;尤其是循环这个概念。今天&#xff0c;我将分享我学到的循环知识&#xff0c;希望能帮助到和我一样的初…...

电子电路中,正负双电源供电的需求原因

1. 允许信号双向摆动 - **交流信号的处理**&#xff1a;许多电路&#xff08;如音频放大器、运算放大器&#xff09;需要处理正负交替变化的交流信号&#xff08;例如声音信号、传感器输出&#xff09;。如果仅用单正电源&#xff08;如12V&#xff09;&#xff0c;信号的“负…...

ROS环境搭建

ROS首次搭建环境 注&#xff1a;以下内容都是在已经安装好ros的情况下如何搭建workplace 一、创建工作空间二、创建ROS包三、注意 注&#xff1a;以下内容都是在已经安装好ros的情况下如何搭建workplace 如果没有安装好&#xff0c;建议鱼香ros一步到位:鱼香ROS 我也是装了好久…...

java后端开发day26--常用API(一)

&#xff08;以下内容全部来自上述课程&#xff09; 1.Math 1.简单介绍 是一个帮助我们用于进行数学计算的工具类私有化构造方法&#xff0c;所有的方法都是静态的 2.常用方法 不要背&#xff0c;忘了就查文档。 3.练习题 1.判断一个数是否为质数&#xff08;优化版&am…...

SpringBoot接口自动化测试实战:从OpenAPI到压力测试全解析

引言&#xff1a;接口测试的必要性 在微服务架构盛行的今天&#xff0c;SpringBoot项目的接口质量直接影响着系统稳定性。本文将分享如何通过自动化工具链实现接口的功能验证与性能压测&#xff0c;使用OpenAPI规范打通测试全流程&#xff0c;让您的接口质量保障体系更加完备。…...

分布式中间件:Redis介绍

目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串&#xff08;String&#xff09; 哈希&#xff08;Hash&#xff09; 列表&#xff08;List&#xff09; 集合&#xff08;Set&#xff09; 有序集合&…...

Python中文自然语言处理库SnowNLP

SnowNLP 介绍 SnowNLP 是一个基于 Python 的中文自然语言处理库&#xff0c;专为处理中文文本而设计。它受到 TextBlob 的启发&#xff0c;但与 TextBlob 不同的是&#xff0c;SnowNLP 没有使用 NLTK&#xff0c;所有的算法都是自己实现的&#xff0c;并且自带了一些训练好的字…...

Linux-计算机网络.udp

1.收发函数: read&#xff08;&#xff09;/write () ///通用文件读写&#xff0c;可以操作套接字。 recv(,0) /send(,0) ///TCP 常用套机字读写 recvfrom()/sendto() ///UDP 常用套接字读写 ssize_t recv(int sockfd, void *buf, size_t len, …...

【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法

【大厂AI实践】清华&#xff1a;清华古典诗歌自动生成系统“九歌”的算法 &#x1f31f; 嗨&#xff0c;你好&#xff0c;我是 青松 &#xff01; &#x1f308; 自小刺头深草里&#xff0c;而今渐觉出蓬蒿。 文章目录 **01 自动作诗缘起****1. 诗歌自动写作** **02 九歌的模型…...

Docker安装Postgres_16数据库

PostgreSQL简介 PostgreSQL 是一个功能强大、开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其可靠性、功能丰富性和可扩展性而闻名。它支持复杂的查询、事务完整性、并发控制以及多种数据类型和扩展功能&#xff0c;适用于各种规模的应用程序; 适用传…...

VSCode 移除EmmyLua插件的红色波浪线提示

VSCode 中安装插件EmmyLua&#xff0c;然后打开lua文件的时候&#xff0c;如果lua代码引用了C#脚本的变量&#xff0c;经常出现 “undefined global variable: UnityEngineEmmyLua(undefined-global)” 的红色波浪线提示&#xff0c;这个提示看着比较烦人&#xff0c;我们可以通…...

快慢指针【等分链表、判断链表中是否存在环】

一、等分链表&#xff1a;找到链表的中间节点 Java 实现 class ListNode {int val;ListNode next;ListNode(int val) {this.val val;this.next null;} }public class MiddleOfLinkedList {public ListNode findMiddleNode(ListNode head) {if (head null) {return null;}L…...

doris:阿里云 DLF

阿里云 Data Lake Formation(DLF) 是阿里云上的统一元数据管理服务。兼容 Hive Metastore 协议。 什么是 Data Lake Formation 因此我们也可以和访问 Hive Metastore 一样&#xff0c;连接并访问 DLF。 连接 DLF​ 创建 DLF Catalog​ CREATE CATALOG dlf PROPERTIES ("…...

大模型巅峰对决:DeepSeek vs GPT-4/Claude/PaLM-2 全面对比与核心差异揭秘

文章目录 一、架构设计深度解剖1.1 核心架构对比图谱1.2 动态MoE架构实现架构差异分析表 二、训练策略全面对比2.1 训练数据工程对比2.2 分布式训练代码对比DeepSeek混合并行实现GPT-4 Megatron实现对比 2.3 关键训练参数对比 三、性能表现多维评测3.1 基准测试全景对比3.2 推理…...

C语言基础知识02

格式化输入输出 函数名&#xff1a;printf&#xff08;&#xff09; 格式控制符&#xff1a;%c //把数据转换成字符型 cahr %d //把数据转换为有符号十进制整型 int short %ld // long %f //把数据转成单精度浮点型 flot %d //double %s …...

Linux的进程观:简单性如何成就强大性(三)

1. 环境变量 1.1. 基本概念 环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数。 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪⾥&#xff0c;但是照样可以链接…...

element-ui infiniteScroll 组件源码分享

简单分享 infiniteScroll 组件源码&#xff0c;主要有以下四个方面&#xff1a; 1、infiniteScroll 页面结构。 2、infiniteScroll 组件属性。 3、组件内部的方法。 4、存在的问题。 一、infiniteScroll 页面结构&#xff1a; 二、页面属性。 2.1 infinite-scroll-disab…...

vulnhub靶场之【digitalworld.local系列】的bravery靶机

前言 靶机&#xff1a;digitalworld.local-bravery&#xff0c;IP地址为192.168.10.8 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 kali采用VMware虚拟机&#xff0c;靶机采用virtualbox虚拟机&#xff0c;网卡都为桥接模式 这里官方给的有两种方式&#xff0c;…...

SpringBoot 整合mongoDB并自定义连接池,实现多数据源配置

要想在同一个springboot项目中使用多个数据源&#xff0c;最主要是每个数据源都有自己的mongoTemplate和MongoDbFactory。mongoTemplate和MongoDbFactory是负责对数据源进行交互的并管理链接的。 spring提供了一个注解EnableMongoRepositories 用来注释在某些路径下的MongoRepo…...

部署Joplin私有云服务器postgres版-docker compose

我曾经使用过一段时间 Joplin&#xff0c;官方版本是收费的&#xff0c;而我更倾向于将数据掌握在自己手中。因此&#xff0c;在多次权衡后&#xff0c;我决定自己搭建 Joplin 服务器并进行尝试。 个人搭建的版本与数据库直连&#xff0c;下面是使用 Docker Compose 配置数据库…...

C++20 标准化有符号整数:迈向更可预测的整数运算

文章目录 一、背景&#xff1a;为什么需要标准化&#xff1f;二、2 的补码&#xff1a;原理与优势&#xff08;一&#xff09;2 的补码原理&#xff08;二&#xff09;2 的补码的优势 三、C20 的变化&#xff1a;明确 2 的补码四、如何利用这一特性优化代码&#xff08;一&…...

npm ERR! code 128 npm ERR! An unknown git error occurred

【问题描述】 【问题解决】 管理员运行cmd&#xff08;右键window --> 选择终端管理员&#xff09; 执行命令 git config --global url.“https://”.insteadOf ssh://git cd 到项目目录 重新执行npm install 个人原因&#xff0c;这里执行npm install --registryhttps:…...

【uniapp】子组件和父组件双向绑定,vue3已废除sync写法,v-model代替

vue3已废除sync写法&#xff0c;v-model代替 实现state的值可以从子组件传递给父组件&#xff0c;也可以从父组件传递给子组件 文件地址pages/about/about.vue <template><view><button size"mini" click"clickBtn">开启{{mystate}}<…...

playbin之Source插件加载流程源码剖析

之前我们有讲解过uridecodebin的setup_source中会创建source插件&#xff0c;关键函数&#xff1a; /* create and configure an element that can handle the uri */ source gen_source_element (decoder); /** Generate and configure a source element.** Returns: (tra…...

泵吸式激光可燃气体监测仪:快速精准守护燃气管网安全

在城市化进程加速的今天&#xff0c;燃气泄漏、地下管网老化等问题时刻威胁着城市安全。如何实现精准、高效的可燃气体监测&#xff0c;守护“城市生命线”&#xff0c;成为新型基础设施建设的核心课题。泵吸式激光可燃气体监测仪&#xff0c;以创新科技赋能安全监测&#xff0…...

Stiring-PDF:开源免费的PDF文件处理软件

Stiring-PDF是一款开源免费且比较好用的PDF文件处理工具。 Stiring-PDF官网网址为&#xff1a;https://www.stiringpdf.com/。Stiring-PDF是一款专业的PDF文件处理工具&#xff0c;支持Windows和macOS操作系统&#xff1b;提供丰富的PDF编辑和转换功能&#xff0c;适用于日常工…...

Cherno C++ P60 为什么不用using namespace std

这篇文章我们讲一下之前写代码的时候的一个习惯&#xff0c;也就是不使用using namespace std。如果我们接触过最早的C教程&#xff0c;那么第一节课都会让我们写如下的代码&#xff1a; #include<iostream>using namespace std;int main() {cout << "Hello …...

大模型微调实验记录(一)数据探索

文章目录 概要整体架构流程前期的技术探索技术构造技术细节小结 概要 根据之前博客使用的docker技术&#xff0c;如果换公司了&#xff0c;我可能就要重新搭建环境了&#xff0c;哎&#xff0c;公司没资源给我&#xff0c;给我一台带不走的电脑&#xff0c;哎&#xff0c;这可…...