带你彻底弄懂 vue3.6 数据响应式系统 alien-signals (上集)

96 阅读4分钟

带你彻底弄懂 vue3.6 数据响应式系统 alien-signals

一、前置知识

什么是 signal

signal 是响应式系统中的基本状态单元,每个 signal 包含了原始值,依赖链条和订阅链条。每当原始值值更新了,所有的订阅者都会自动触发更新。同理,依赖链条上的 signal 有更新,当前 signal 也会触发更新。而包括 alien-signals 在内的响应式系统优化目标,就是通过数据结构及算法设计,让这些链条的通讯变得更快。 e1ea679973a53a4397e9174e9f3c42db.png

什么是 图

在多节点拓扑关系中,可以通过图去描述,譬如向这个关系中,我们可以通过一张二维表去描述,这样一来,横向看是每个节点的出度,相当于响应式系统中的订阅链条,而纵向看就是每个节点的入度,相当于响应式系统中的依赖链条。这个大家先记住,能辅助大家更好的理解后面要讲的内容。 90aa4bab808c514950e2b858fc1a8261.png

什么是数据关系

关于建立数据关系,我们就必须参考一下数据库了,这是最接近数据的。我们用 mysql 为例,如果班级和学生是一对多的关系,往往我们会通过学生表上的班级 id 字段,关联起班级和学生两张表之间的数据关系。 4d2a4b0faa02b8b38460c6bd78c0c422.png 这里有同学会可能会问,在班级表上设定一个 students 字段去存储 学生 id 列表 是不是也可以?从数据关系上看,原则上没问题,但这样对于数据库的查询是非常不友好的,所以往往在做数据库设计不会采取这种方式。 51c5470377db11e6f5fef1d5d25268b8.png 但如果一旦遇到多对多的情况,就难免会出现这样的情况了,要不在班级表上存储学生列表,要不就要在学生表上存储班级列表,甚至为了优化查询,有时候两边都需要冗余对方信息,这样对于查询不友,也极大的增加了维护成本,譬如解除一段关系,就需要 2 边数据一起改,新增一段关系,也是一样。 45bbc2a70df8b6385abe764e30913f45.png 为了解决这个问题,在数据库设计上,我们往往会新增一张 班级-学生-关系表 去维护两份实体数据之间的关系,把实体与关系之间分割开,创建和消除关系都在关系表中操作,既提高了效率也降低了维护成本。 b4f0cb75f07352555aa0ac6077809358.png

二、响应式数据 依赖构建 - 过程分析

codeimage-snippet_20.png step1: 7f1de0d324ff1d7fb9bc53244a10fbe7.png step2: a20537a0abea46c9ea0cfcafe1ef7a34.png step3: 6bcddd1eb3fa00ab58162ec797ed4b28.png step4: 22e417c4c50033eb1a3687f9fc80c939.png step5:双向链表 c58ebf18ee236ea234a2ed15cd71b8ea.png step6:终局 930984a017d4db886f64b48b88a29a29.png 通过双向链表,构建起各个 signal 之间的 依赖和订阅 关系。横向看是每个 signal 的订阅关系,相当于一张图中节点的出度。纵向看是每个 signal 的依赖关系,相当于一张图中节点的入度,清晰表达了各个节点之间的依赖关系。

这样做的好处:

内容占用率更低,不用在像以前一样,在建立依赖关系时额外创建 set ,开辟新的内存空间。 b563c6cdfcdd2a3343b7b0ea51bd5d6f.png 这也引申了第二个优势,如何在数组中处理删除是非常损耗性能的,依赖关系的时候也会更加方便,Link 节点相当于数据库设计中的关系表,signal 间的关系只需要新增或切断 link 即可。 a61f932a19e63b39c2edf3ff5f77e961.png

三、响应式数据 依赖构建 - 源码分析

1.png

3 个核心方法 startTracking-endTracking(化简)

2.png

step1(apiWatch->watch->effect)

207c6acd35e2dea5c417d79ab319f432.png

step2

83f5c77a94fe965cc13588adca1d4863.png

step3

ab8f31791dba87fe9ffcaef8168d40d0.png

step4

edd9861d207571ee4791bc5532a1ecc3.png

step5

e0832d7efe71971af89b2ddb871f4089.png

step6

9589b6012c93a72a21bbca9da555c7b9.png

四、响应式数据信号转播-过程分析

3.png

step1:

c5599029686dab3442ab364ff984a32d.png

step2

0547e492bf166b109b0af51a24b96660.png

step3

46f220ec6026b603a67af6966718db99.png

step4

5a8aaf402201fb587d11cf58378c624b.png

step5

833c57986b1a4ff82daee9da938449ad.png

step6

9fbe7a8d245256d5571d51581f402260.png

Vue3.6 数据响应式系统的 alien-signals(上集) 核心逻辑,到这里就先拆解完啦 ~ 从原理到基础用法,相信你已经对这个新特性有了清晰的认知。

如果还没看够,或者在实际开发中遇到了 alien-signals 的使用难题,别担心!【ZTeam 前端全栈进阶圈】里有超多同频开发者,每天都在分享响应式技术的深度解析、踩坑经验,不管是 Vue3.6 的新特性疑问,还是前端开发的其他难题,在这里都能找到解决方案。

现在加入还能领取专属优惠券,花更少的钱,和大家一起攻克编程难关、提升技术实力 ~ 感兴趣的话,不妨来社区里和我们一起交流进阶!

优惠券链接 🔗t.zsxq.com/Itt0z

知识星球链接🔗 t.zsxq.com/rI2ZJ