在上一篇文章中,初步的实现了React的 State,本文将实现虚拟DOM的数据更新及render。
vdom
对于 wgwCreateElement中,ElementWrapper和TextWrapper 基本上都是针对于root的操作。
ElementWrapper
针对与ElementWrapper上所有的方法,可以理解为都是root这个真实dom的一个代理。
实现vdom虚拟dom的话,就需要将这些真实dom的代理去掉。
创建ElementWrapper vdom
主要包含三样: type
, props
, children
。
- type 在构造函数中将type存起来;
- props 改写当前setAttribute
- children 改写当前children
1 | // 为了看到vdom比较干净才这样写,后续将重构 |
TextWrapper
1 | get vdom() { |
如果对象上没有方法,是不能够完成dom的重绘的,需要改写vdom
使用vdom创建一个新的dom树
- 去除this.root 的实dom操作;
- vdom return this
- 在render to dom 中的创建this.root
1 | [REDDER_TO_DOM](range) { |
vdom比对
因为dom要更新,所以会使用到renderToDom函数。
及想要实现vdom的比对,需要在render之前进行。
核心
- 只对比对应位置的vdom是不是同一类型的节点
- 更高层级的修改,如两个dom的顺序调换,在真是的react中会采用更好的vdom算法,
- 此处只是为了讲解vdom的原理,不做深层次的展开
1 | update() { |
在真实的react中,事件是由一个事件管理中心的方式去处理的,对DOM的依赖更小,能做到更精准的去更新位置。
以上。写的有点着急了,后续有时间了再扩展完善。
完整代码仓库地址