Vue3响应式原理

Vue 3 的响应式系统基于 Proxy 对象实现,具有更高的性能和灵活性,相比 Vue 2 使用的 Object.defineProperty 有明显的改进。以下是 Vue 3 响应式原理的关键部分:


1. 核心机制

Vue 3 响应式系统的核心是 reactive API,它使用 Proxy 拦截对对象的访问和修改,从而实现数据的追踪和更新。

1.1 reactive 的实现
import { reactive } from 'vue';const state = reactive({count: 0,info: {name: 'Vue',version: 3}
});

在上述代码中:

  • reactive 会将传入的普通对象转换为响应式对象。
  • Vue 通过 Proxy 拦截对对象的操作(如 getset),从而实现依赖收集和变化通知。

1.2 依赖收集与追踪

响应式系统的工作过程可以分为以下几步:

  1. 依赖收集:当某个响应式属性被访问时,Vue 会记录哪个组件或函数依赖了该属性。
  2. 触发更新:当响应式属性的值发生变化时,Vue 通知所有依赖该属性的函数重新执行。

依赖收集是通过 Effect 函数 实现的:

import { effect } from 'vue';effect(() => {console.log(state.count);
});

在执行 effect 时,Vue 会自动订阅 state.count,因此当 state.count 的值发生变化时,该 effect 会重新运行。


2. Proxy 的核心拦截点

Vue 3 的响应式系统通过 Proxy 提供的拦截机制,完成以下操作:

2.1 get:读取属性

当访问对象的属性时,Vue 会触发 get 拦截器,从而完成依赖收集:

const handler = {get(target, key, receiver) {const result = Reflect.get(target, key, receiver);console.log(`读取属性 ${key}: ${result}`);return result;}
};
2.2 set:修改属性

当修改对象的属性时,Vue 会触发 set 拦截器,从而通知依赖更新:

const handler = {set(target, key, value, receiver) {const result = Reflect.set(target, key, value, receiver);console.log(`设置属性 ${key}: ${value}`);// 触发依赖更新return result;}
};
2.3 tracktrigger

Vue 3 将依赖追踪和触发分成了两个步骤:

  • track:在 get 中调用,用于记录依赖。
  • trigger:在 set 中调用,用于通知依赖更新。

3. 响应式工具

Vue 3 提供了一些内置工具和方法,帮助开发者处理响应式对象。

3.1 reactiveref
  • reactive:将对象或数组转换为响应式对象。
  • ref:用于包装单个值,使其具有响应式能力。
import { ref } from 'vue';const count = ref(0);effect(() => {console.log(count.value); // 监听 count 的变化
});
count.value++; // 触发更新
3.2 computed
  • computed 用于创建基于响应式数据的派生状态,并具有缓存功能。
import { computed } from 'vue';const doubled = computed(() => count.value * 2);
console.log(doubled.value); // 自动计算并缓存结果

4. 与 Vue 2 的对比

特性Vue 2 (Object.defineProperty)Vue 3 (Proxy)
支持的数据类型仅支持对象和数组支持对象、数组、Map、Set 等多种类型
深度响应式初始化时递归遍历对象按需追踪,性能更优
新增/删除属性响应式需要 Vue.setVue.delete原生支持
性能初始化开销较大,动态追踪效率低初始化开销小,动态追踪效率高

5. 总结

Vue 3 的响应式系统使用 Proxy 和优化的依赖追踪机制(tracktrigger),实现了:

  1. 更灵活的响应式能力(支持 Map、Set 等)。
  2. 更高的性能(按需追踪,避免冗余计算)。
  3. 更简洁的 API(无需手动处理新增/删除属性)。

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

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

相关文章

AVL树实现

1. AVL的概念 AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的 左右⼦树都是AV树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树, 通过控制⾼度差去控制平…

jvm发展历程介绍

初始阶段:JDK 1.0 - JDK 1.1 • 经典JVM:这是JVM的早期实现,主要特点是使用解释器(Interpreter)来逐行解释执行Java字节码。这种方式虽然简单直接,但执行效率相对较低。 • JIT编译器(Just-In-T…

准备阶段 Profiler性能分析工具的使用(一)

Unity 性能分析器 (Unity Profiler) 性能分析器记录应用程序性能的多个方面并显示相关信息。使用此信息可以做出有关应用程序中可能需要优化的事项的明智决策,并确认所做的优化是否产生预期结果。 默认情况下,性能分析器记录并保留游戏的最后 300 帧&a…

初学 flutter 环境变量配置

一、jdk(jdk11) 1)配置环境变量 新增:JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增:%JAVA_HOME%\bin2)验证是否配置成功(cmd运行命令) java java -version …

HTML 元素类型介绍

目录 1. 块级元素(Block-level Elements) 2. 行级元素(Inline Elements) 3. 行内块级元素(Inline-block Elements) 4. 表格相关元素 5. 列表相关元素 6. 表单相关元素 示例代码 示例效果 ​编辑 …

高危,Laravel参数注入漏洞安全风险通告

今日,亚信安全CERT监控到安全社区研究人员发布安全通告,披露了Laravel 参数注入漏洞(CVE-2024-52301)。在受影响的版本中,Application.php 文件的 detectEnvironment 函数直接使用了 $_SERVER[argv],但没有检查运行环境是否为 CLI…

表格数据处理中大语言模型的微调优化策略研究

论文地址 Research on Fine-Tuning Optimization Strategies for Large Language Models in Tabular Data Processing 论文主要内容 这篇论文的主要内容是研究大型语言模型(LLMs)在处理表格数据时的微调优化策略。具体来说,论文探讨了以下…

如何搭建C++环境--1.下载安装并调试Microsoft Visual Studio Previerw(Windows)

1.首先,打开浏览器 首先,搜索“Microsoft Visual Studio Previerw” 安装 1.运行VisualStudioSetup (1).exe 无脑一直点继续 然后就到 选择需要的语言 我一般python用pycharm Java,HTML用vscode(Microsoft Visual Studio cod…

数字化工厂 MES试点方案全解析(二)

生产过程监控与数据采集 在生产线上部署各类传感器、数据采集终端等设备,与 MES 系统相连,实时采集生产数据,如设备运行参数(温度、压力、转速等)、产品加工数据(尺寸、重量、加工时间等)、物料…

TCP vs UDP:如何选择适合的网络传输协议?

在网络通信中,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种非常重要的传输层协议。它们各有特点,适用于不同类型的应用场景。本文将详细探讨TCP和UDP协议的结构、优缺点及应用&…

Redis最终篇分布式锁以及数据一致性

在前三篇我们几乎说完了Redis的所有的基础知识以及Redis怎么实现高可用性,那么在这一篇文章中的话我们主要就是说明如果我们使用Redis出现什么问题以及解决方案是什么,这个如果在未来的工作中也有可能会遇到,希望对看这篇博客的人有帮助,话不多说直接开干 一.Hotkey以及BigKey…

docker搭建私有的仓库

docker搭建私有仓库 一、为什么要搭建私有的仓库? 因为在国内,访问:https://hub.docker.com/ 会出现无法访问页面。。。。(已经使用了魔法) 当然现在也有一些国内的镜像管理网站,比如网易云镜像服务、Dao…

1123--日期类

目录 一 java 1. Date类 2. calendar类 3. 第三代日期类‘ 3.1 常用方法 3.2 格式化操作 一 java 1. Date类 2. calendar类 3. 第三代日期类‘ 3.1 常用方法 3.2 格式化操作

07-Making a Bar Chart with D3.js and SVG

课程链接 Curran的课程,通过 D3.js 的 scaleLinear, max, scaleBand, axisLeft, axisBottom,根据 .csv 文件生成一个横向柱状图。 【注】如果想造csv数据,可以使用通义千问,关于LinearScale与BandScale不懂的地方也可以在通义千…

mysql根据日期查询没有的日期也要显示数据

先查询出日期数据(当前日期往前推12个月) select bb.datefrom (select num : num 1,date_format(adddate(date_sub(date_sub(curdate(),interval 12 month),interval 1 month),interval num month), %Y-%m) as datefrom mysql.help_topic,(select num : 0) as twhere addd…

计算机网络 实验六 组网实验

一、实验目的 通过构造不同的网络拓扑结构图并进行验证,理解分组转发、网络通信及路由选择的原理,理解交换机和路由器在子网划分中的不同作用。 二、实验原理 组网实验是指将多个计算机通过网络连接起来,实现数据的共享和通信。 组网需要考虑…

10-单表查询

SQL语言 sql语言分类 SQL类别主要动作DQL(Data Query Language)SELECT(通常与FROM、WHERE、GROUP BY、HAVING、ORDER BY等组合使用),用作数据chaxunDMLINSERT、UPDATE和DELETE,用作定义数据库记录(数据)TCLCOMMIT、ROLLBACK、SAVEPOINT、SET TRANSACTI…

深度学习每周学习总结J6(ResNeXt-50 算法实战与解析 - 猴痘识别)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结ResNeXt基本介绍 1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数:定义损失函数&…

采用python3.12 +django5.1 结合 RabbitMQ 和发送邮件功能,实现一个简单的告警系统 前后端分离 vue-element

一、开发环境搭建和配置 #mac环境 brew install python3.12 python3.12 --version python3.12 -m pip install --upgrade pip python3.12 -m pip install Django5.1 python3.12 -m django --version #用于检索系统信息和进程管理 python3.12 -m pip install psutil #集成 pika…

【H2O2|全栈】JS进阶知识(八)ES6(4)

目录 前言 开篇语 准备工作 浅拷贝和深拷贝 浅拷贝 概念 常见方法 弊端 案例 深拷贝 概念 常见方法 弊端 逐层拷贝 原型 构造函数 概念 形式 成员 弊端 显式原型和隐式原型 概念 形式 constructor 概念 形式 原型链 概念 形式 结束语 前言 开篇语…