1.1 React 核心概念 1.13 diff算法源码分析

 博客:::

https://juejin.cn/post/6844903607913938951

https://baijiahao.baidu.com/s?id=1660483397909568142&wfr=spider&for=pc

https://www.pianshen.com/article/1930259573/

https://blog.csdn.net/qq_36407875/article/details/84965311

视频1(源码分析):https://www.bilibili.com/video/BV1dV411a7mT?p=4

视频2 (整体介绍 vue中): https://www.bilibili.com/video/BV1G7411N7Ef?from=search&seid=7770427632076433111

视频3 (汇总介绍 vue): https://www.bilibili.com/video/BV127411P7zi?p=3

还没有看的视频:https://www.bilibili.com/video/BV1zk4y1y7sD?p=4

react16 fiber 把树变成了链表!翻转二叉树,被谷歌拒绝了,https://www.bilibili.com/video/BV1Jz411i7VD

1 生成node。 h函数会通过算法返回 一个vnode、节点,vnode 节点保存6个属性。

传递:

返回:sel选择器,  chilren和text只会有一个(要么是数组,要么是字符串),elm渲染真实dom元素,key

 

  typeof:Symbol(react.element)

  • key (null)
  • props({id:'title'}
  •   ref (null)
  •  type( 'h1')

 _owner:null, _store, _self,  _source,_proto_

2 patch函数:patch 函数在文档中的使用,

  在首次渲染的时候执行一次,vnode执行到容器里面来。

  在第二次执行的时候。会比较两次是否同一个vnode。把新的vnode替换成老的 vnode。

   patch函数由init函数构造而来。 patch(container ,  vnode)

代码如下:

patch: 接受两次参数。Vnode 和Element类型,  vnode类型。

  

1 如果是首次的话,就是接受DOM元素,创建一个空的vnode,并且关联DOM元素。

代码如下:

 2 .1第一个参数是否是相同的的函数。 第一个key和select是否相同。只需要更新就好。

标签名相同,key相同,认为是相同的节点,不继续深度比较。

2.2 如果不相同: createElm vnode.elm,则会插入, 然移除老的元素。

3 patchVnode函数:

1 执行hoock。

2 设置vnode关联的DOM元素。 

1 如果一个  无text就,有children,

 新的有childe 老的有child。 都有。 update Chidren。

老的有text,

text就需要清空掉。 

老的有chilren,新的无children。 remove。

老的

2 如果一个有text 无children,

 如果 text 不相等。

 老的和新的不相等。

3updateChildren, 新旧vode 都有children。需要update。

someVnode判断是否相等。

 总结 :;

patch,对比oldVnode和新的渲染结果newVnode,这个过程成为patch。(打补丁,patch)

 patchVnode 是diff发生的地方!深度优先,同级比较。 

高效性!updateChilren:收尾两次判断,遍历。

两组子节点: 收尾节点,做4次对比。

原文地址:https://www.cnblogs.com/hacker-caomei/p/14412773.html