Vitural Dom & diff算法 (一) 伪代码实现

428 查看

前言:

读React 源码大概是最幸福的事情,因为在社区里有数之不尽的高手都会给出自己很独到的见解,即使有不懂的地方也会能找到前人努力挖掘的痕迹。我反问自己,然后即使在这样优越的环境下,还不去读源码,是不是就太懒了。 # 我会乱说? #

约定

这一篇都通过伪代码实现,保证首先从总体上走通流程,后面的篇章都是基于这样一个流程去实现。

开始之前

这里必须明确一个概念,所谓的 自定义标签 都是由很多原生标签诸如<div>去实现的。

因此自定义标签就可以想象成

流程

  1. 创建虚拟DOM
  2. 真实DOM 连接 虚拟DOM
  3. 视图更新
  4. 计算 [ 新虚拟DOM ] 和 [ 旧虚拟DOM ] 的差异 ( diff )
  5. 根据计算的 差异, 更新真实DOM ( patch )

这里牵涉到两个词语 diff 和 patch,稍后再解释,这里简单理解为 [计算差异]和[应用差异]。

伪代码实现

注:虽然这是这个系列的第一篇,但这已经是第二遍写了。原因是第一遍想完整模拟的时候发现,自己对算法的了解太粗浅,深搜和最短字符算法都不懂,最近和死月大大请教,所以这里偏向思路多一点。

1. 这里我们期望的真实DOM结构是这样的,下面我们一步步实现

2. 创建虚拟DOM

3. 虚拟DOM不能够影响真实DOM,这里我们需要建立连接

最终目的得到这样的字符串,可以供真实DOM使用

简单实现 ( 这里需要记录一下每个DOM的id )