【Vue3源码学习】— CH2.8 Vue 3 响应式系统小结

Vue 3 响应式系统小结

    • 1.核心概念
      • 1.1 Proxy和Reflect
      • 1.2 响应式API
      • 1.3 依赖收集与更新触发
      • 1.4 触发更新(Triggering Updates):
      • 1.5 副作用函数(Effect)
      • 1.6 计算属性和观察者
      • 1.7 EffectScope
      • 1.8 性能优化:
    • 2. 手动实现简单响应式系统
    • 3. 发散思考

Vue 3 的响应式系统利用现代 JavaScript 的特性,如 Proxy 和 Reflect,为开发者提供了一个强大且灵活的工具集,以简化响应式编程。这一节回顾了我们学习的关键概念,并展示了如何手动构建一个简单的响应式系统。

1.核心概念

1.1 Proxy和Reflect

Vue 3 采用 Proxy 来拦截对象操作,配合 Reflect 保证操作的默认行为。这使得 Vue 能够在数据访问或修改时执行自定义逻辑,实现自动的依赖跟踪和更新触发。

1.2 响应式API

通过 reactive、ref 等 API,Vue 允许开发者把普通对象转换成响应式对象,实现数据的自动更新。

1.3 依赖收集与更新触发

Vue 内部通过 track 和 trigger 函数管理依赖关系,确保数据变化时能自动通知并执行相关的副作用函数。

1.4 触发更新(Triggering Updates):

当响应式数据被修改时,Vue 通过trigger函数查找所有依赖于这个数据的副作用函数,并重新执行它们。这样,基于这些数据的视图或其他副作用就会被更新。

1.5 副作用函数(Effect)

Vue 3通过effect函数包装副作用(如渲染函数、计算属性等),使其能够自动响应数据的变化。每个副作用在执行时都会被ReactiveEffect类的实例封装,这个实例记录了副作用函数以及它所依赖的数据。

1.6 计算属性和观察者

计算属性和观察者也是通过副作用系统实现的。计算属性(computed)和观察者(watch)提供了更细粒度的响应式控制,优化性能同时保持数据更新的逻辑清晰。

1.7 EffectScope

effectScope 管理副作用的生命周期,尤其是在组件卸载时自动停止副作用,避免内存泄漏。

1.8 性能优化:

Vue 3的响应式系统使用了诸如WeakMap和Map这样的原生数据结构来存储依赖关系,减少了内存的使用,并优化了垃圾回收。同时,通过避免不必要的副作用执行和精细的依赖追踪,提高了更新的效率。

2. 手动实现简单响应式系统

在完整的学习了Vue3源码响应式系统部分之后,我们尝试以手动创建一个简化版的响应式系统来加深理解:

//响应式逻辑
let activeEffect = null;
const targetMap = new WeakMap();const reactive = (target) => {return new Proxy(target, handler);
}
const handler = {get(target, property, receiver) {track(target, property);return Reflect.get(target, property, receiver); // 确保返回属性的值},set(target, property, value, receiver) {const result = Reflect.set(target, property, value, receiver); // 设置新值trigger(target, property, value);return result;}
}
const track = (target, property) => {if (!activeEffect) return;let depsMap = targetMap.get(target);if (!depsMap) {depsMap = new Map();targetMap.set(target, depsMap);}let deps = depsMap.get(property);if (!deps) {deps = new Set(); // 使用 Set 存储唯一的副作用函数depsMap.set(property, deps);}deps.add(activeEffect);
}
const trigger = (target, property) => {const depsMap = targetMap.get(target)if (!depsMap) {return;}const deps = depsMap.get(property);deps.forEach(effectFn => {effectFn.run();})
}
class ReactiveEffect {constructor(fn) {this.fn=fn;}run() {try {activeEffect = this;this.fn();} finally {activeEffect = null;}}
}
const effect = (fn) => {const _effect = new ReactiveEffect(fn);_effect.run();return _effect;
}//应用
const status = reactive({count: 0
});
effect(() => {console.log(status.count);
});
status.count++;//执行和输出:
//0
//0

3. 发散思考

Vue的响应式系统和Backbone中的数据监听、发布-订阅模式在目的上确实非常相似,都是为了实现数据变化时自动更新视图或执行某些操作。它们都遵循了观察者模式的基本原则,即当数据(被观察者)发生变化时,能够自动通知所有依赖于这些数据的订阅者(观察者),并触发相应的更新逻辑。

Vue 的响应式系统与 Backbone 等传统模式的主要区别在于自动化的依赖追踪与更新触发机制。Vue的响应式系统利用ES6的Proxy和内部的依赖追踪机制来自动捕获依赖关系,并在响应式数据变化时自动触发更新。Vue 的设计使得开发者能够专注于业务逻辑,而无需手动管理数据监听和更新,极大地提升了开发效率和应用性能。
在这里插入图片描述

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

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

相关文章

登录系统演进、便捷登录设计与实现

作者 | 百度APP技术中台吧 导读 随着互联网、物联网和移动终端等技术的迅猛发展,登录认证面临着新的挑战和需求。虽然登录认证在信息系统中是传统且古老的组成部分,但未来的发展前景依然广阔。不论是用户登录、PC端、移动端还是智能设备的访问&#xff0…

14种建模语言(UML)图形

前言 UML 中有四种关系:依赖、关联、泛化和实现。这四种关系是 UML 模型中可以包含的基本关系事物。这里介绍14种UML图形:类图,对象图,包图,构件图,组合结构图,部署图,制品图,用例图…

DC电源模块的市场发展趋势分析

BOSHIDA DC电源模块的市场发展趋势分析 DC电源模块是一种将交流电转换为直流电的模块,广泛应用于各种电子设备中。随着科技的不断发展和电子产品的普及,DC电源模块市场也在不断扩大。本文将对DC电源模块的市场发展趋势进行分析。 第一,随着电…

【二叉树】Leetcode 437. 路径总和 III【中等】

路径总和 III 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节…

DOTS:Burst

目录 一:简介 1.1 Getting started 1.2 C# language support 1.2.1 HPC# overview 1.2.1.1 Exception expressions 1.2.1.2 Foreach and While 1.2.1.3 Unsupported C# features in HPC# 1.2.2 Static read-only fields and static constructor support 1.…

Mysql故障和优化

一、MySQL故障 二、MySQL优化 1.硬件优化: 2.数据库设计与规划 1.提前估计数据量,使用什么存储引擎 2.数据库服务器专机专用,避免额外的服务可能导致的性能下降和不稳定性 3.增加多台服务器,以达到稳定、高效的效果。主从同步、…

PPP+VPN综合实验

一、实验拓扑 二、实验划分 三、实验需求 四、实验结果 1.配置各端口和pc的IP: pc1: pc2: pc3: pc4: R1: [r1]inter g0/0/0 [r1-GigabitEthernet0/0/0]ip ad 192.168.1.2 24 [r1-GigabitEthernet0/0/0]int s4/0/0…

网站HTTPS证书是什么?有用吗?

什么是HTTPS证书? HTTPS证书,全称为安全套接层证书或传输层安全证书,是数字证书的一种。它由受信任的证书颁发机构签发,用于证明网站的身份,并为网站启用HTTPS(超文本传输安全协议)。 HTTPS证书…

天生强运的属龙人,在本命年要非常谨慎

​ 辰龙是十二生肖之一,地支的第五位。龙是一个神化了的象征,气宇轩昂,威武智慧,代表着神圣与无上、尊严与强大是不可战胜的。多数生肖属龙的人都是温文尔雅,风度翩翩的。无论在什么场合只要得到肯定,他们…

【Redis】redis集群模式

概述 Redis集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。实际使用中集群一般由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护&#…

正则表达式引擎库汇合

1.总览表格 一些正则表达式库的对比 index库名编程语言说明代码示例编译指令1Posix正则C语言是C标准库中用于编译POSIX风格的正则表达式库 posix-re.cgcc posix-re.c 2PCRE库C语言提供类似Perl语言的一个正则表达式引擎库。 一般系统上对应/usr/lib64/libpcre.so这个库文件&am…

【css】文本过长溢出一行不换行普通css以及antd实现

.text-box { white-space: nowrap; /* 防止文字换行 */ overflow: hidden; /* 隐藏超出div的内容 */ text-overflow: ellipsis; /* 当内容超出时,显示省略号 */ max-width: calc(100% - 80px); /* 假设按钮宽度为80px,则设置div的最大宽度为容器宽度…