【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.mzph.cn/news/797756.shtml

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

相关文章

GPT-5将在6月发布前进行「红队进攻测试」

“GPT-5将在6月发布”的消息刷屏了AI朋友圈。这则消息之所以被无数人相信并转发,是因为已经有不少技术人员在社交平台上晒出了「红队进攻测试」邀请。 基于 GPT系列庞大的用户体量和影响力,OpenAI 将更加重视GPT-5 的安全性,作为GPT-5上市前的…

【编译原理】手工打造语法分析器

重点: 语法分析的原理递归下降算法(Recursive Descent Parsing)上下文无关文法(Context-free Grammar,CFG) 关键点: 左递归问题深度遍历求值 - 后续遍历 上一篇「词法分析器」将字符串拆分为…

水经微图网页版309项功能清单

让每一个人都有自己的地图! 水经微图(简称“微图”)网页版,是越来越受到大家的亲睐了! 就后台统计数据来看,日均IP数据在稳步增长,老访客的占比最高达35%以上。 在上上周,还分别有…

PMP考试费太贵,能不能自学?

最近6月PMP考试报名工作正在如火如荼的进行,可能大家对于考试费用已经有了基本了解,今天给大家分享一下PMP证书考下来需要花费多少?能不能自己学习? PMP是什么? PMP项目管理专业人士资格认证,由项目管理协…

uniapp - 微信小程序 - 使用uCharts的一些问题

文章目录 uniapp - 微信小程序 - 使用uCharts的一些问题一、开发者工具显示正常,真机调试统计图不随页面滚动二、数据过多开启滚动条,无法滑动滚动条三、饼图点击不显示提示窗/点击位置bug、多个同类型统计图点击不显示提示框问题四、 formatter 自定义 …

ArcGIS Pro怎么进行挖填方计算

在工程实施之前,我们需要充分利用地形,结合实际因素,通过挖填方计算项目的标高,以达到合理控制成本的目的,这里为大家介绍一下ArcGIS Pro中挖填方计算的方法,希望能对你有所帮助。 数据来源 教程所使用的…

Python—循环加强

1.使用循环打印等腰三角形 # 画三角形层数为n # 第i层有空格:n-i # 第i层有*:2*i-1 n int(input("层数:"))#层数n for i in range(1, n 1):#范围在1~n# 画空格for _ in range(1, n - i 1): # _不用显示,用于表示&a…

MySQL一条SQL语句的执行过程

MySQL一条SQL语句的执行过程可以大致分为以下几个步骤: mysq分层架构 为了理解这个问题,先从Mysql的架构说起,对于Mysql来说,大致可以分为3层架构。 网络连接层: 作为客户端和服务端的连接,连接器负责处…

Leetcode 17.电话号码的字母组合

题目 思路 输入的digits有几个数就有几层。 一层中有几个数则取决于输入的数字对应的字母有几个。 1.确定递归函数的返回值及参数: 其实参数不是一开始就确定好的,而是你在写递归函数的时候缺啥,就往进去传啥。 这里我就直接全部写出来。…

无线基本认识和配置

1、无线局域网 IEEE 802.11标准 根据应用范围分类 WPAN --- 个人无线网络 NFC、ZIgbee、Bluetooth WLAN --- 无线局域网 WiFi,使用到WPAN技术 WMAN --- 无线城域网 WiMax 802.16 WWAN --- 无线广域网 GSM、CDMA、WCDMA、LTE、5G、TD-SCDMA 2、…

2012年认证杯SPSSPRO杯数学建模C题(第一阶段)碎片化趋势下的奥运会商业模式全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 C题 碎片化趋势下的奥运会商业模式 原题再现: 从 1984 年的美国洛杉矶奥运会开始,奥运会就不在成为一个“非卖品”,它在向观众诠释更高更快更强的体育精神的同时,也在攫取着巨大的商业价值&#…

关东升老师力作!四本编程宝典,带你畅游编程世界

🌟《看漫画学C》:关东升老师以漫画的形式,让你在欢笑中轻松掌握C编程的核心知识。不再枯燥,不再难懂,让编程变得有趣又简单! 🎨《MATLAB科研绘图与学术图表绘制从入门到精通》:关东升…

c++的学习之路:15、list(2)

本章主要是讲模拟实现list,文章末附上代码。 目录 一、创建思路 二、构造函数 三、迭代器 四、增删 五、代码 一、创建思路 如下方代码,链表是由一块一块不连续的空间组成的,所以这里写了三个模板,一个是节点,一…

蓝桥杯第六届c++大学B组详解

前言: 看了很多博客以及视频讲解,感觉都不是很清楚,比较模棱两可,所以干脆自己一边想,一边写博客,也可帮助到其他人,都是根据自己的逻辑来尽量清楚简单的讲清楚题目,喜欢的不要吝啬三…

HTTP的介绍

一.什么是HTTP? Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 二.HTTP的特点 (1)基于TCP协议:面向连接,安全 (2)基于请求-响应模型的&…

卡奥斯工业互联网平台分析

一、 背景 卡奥斯是海尔推出的具有中国自主知识产权、全球首家引入用户全流程参与体验的工业互联网平台。其核心是大规模定制模式,通过持续与用户交互,将硬件体验变为场景体验,将用户由被动的购买者变为参与者、创造者,将企业由原…

【1】初识 Python

【1】初识 Python 1、编程语言(1) 语言(2) 编程语言(3) 如何利用编程语言与计算机交流(4) 常见的编程语言(5) 语法 2、Python 简介(1) 什么是 Python(2) Python 能做什么(3) Python 的由来(4) Python的特点① 语法精简② 生态好,开发效率高③ Python开发初体验&…

练习 21 Web [GXYCTF2019]BabySQli

SQL联合查询,注意有源码看源码,Base64以及32的区别,MD5碰撞 打开后有登录框,先随意登录尝试 只有输入admin才是返回wrong pass! 其他返回wrong user 所以用户名字段一定要输入admin 养成好习惯,先查看源码…

删除mysql表卡死 , 打不开,一直转圈圈

最近用navicat删除某一张表时,直接卡死转圈圈,导致navicat直接无响应, 想着是不是自己navicat有问题,换同事电脑来删这张表,还是同样问题。 多次尝试才整明白,根本不是navicat的问题.是mysql 的表锁死了! 如果频繁的对…

华三Sec Path

1、设备特点 外观: 功能特点: 安全特性: vFW的默认账号密码:admin 2、安全区域 1)相同安全级别的集合 2)默认的安全域 【1】区域 trust、untrust、local(所有有接口属于local,…