首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

React源码学习入门(十二)DOM组件更新流程与Diff算法

DOMComponent完成,而setState后,触发到DOM的更新入口是receiveComponent,源码在src/renderers/dom/shared/ReactDOMComponent.js...key是由组件的key生成的,当我们没有指定key的时候,它是这样: 当我们设置key的时候,它是这样: 它的生成函数位于src/shared/utils/traverseAllChildren.js...它完全是根据相同的key来diff,没设置key的话,其实是通过数组下标来进行(源码位于src/renderers/shared/stack/reconciler/ReactChildReconciler.js...,这个条件是必然的,因为在之前reconcile的时候我们就已经把prevChild更新为nextChild了,除非nextChild是全新节点或者删除节点的情况。...这里所有的操作均会被推到队列里面去,最终通过processQueue来执行,它的源码位于src/renderers/dom/client/utils/DOMChildrenOperations.js

59830
您找到你想要的搜索结果了吗?
是的
没有找到

彻底读懂VUE3 VDOM DIFF - 上

那这个时候我们也不用DOM了,而是自己去定义个js对象,对象中的key:value呢就包括我们属性名与属性值,每个js对象都对应一个DOM节点。...到这里,相信机智的你已经猜到了,这个我们自己定义的js对象就是传说中的屋子,哦,不对,是传说中的VDOM。 最近刚又看完《奇友》,台词里的《传说中的屋子》实在是太洗脑了。...const s1 = i; const s2 = i; const keyToNewIndexMap = new Map(); for (i = s2; i <= e2; i++) { const nextChild...= c2[i]; keyToNewIndexMap.set(nextChild.key, i); } 学过React VDOM DIFF的可以再来思考一个问题,React中也用到了Map,只不过是把...[i] === 0) { mountElement(nextChild.key); } else { // 可能move } } 通过上面的代码,相信大家对mountElement

34320

第五篇:组件更新:完整的 DOM diff 流程是怎样的?(下)

= c2[i] keyToNewIndexMap.set(nextChild.key, i) } } 新旧子序列是从 i 开始的,所以我们先用 s1、s2 分别作为新旧子序列的开始索引...== increasingNewIndexSequence[j]) { move(nextChild, container, anchor, 2)...我们知道了子节点更新调用的是 patch 方法, Vue.js 正是通过这种递归的方式完成了整个组件树的更新。 核心 diff 算法中最复杂就是求解最长递增子序列,下面我们再来详细学习一下这个算法。...最长递增子序列 求解最长递增子序列是一道经典的算法题,多数解法是使用动态规划的思想,算法的时间复杂度是 O(n2),而 Vue.js 内部使用的是维基百科提供的一套“贪心 + 二分查找”的算法,贪心算法的时间复杂度是...总结 这两节课我们主要分析了组件的更新流程,知道了 Vue.js 的更新粒度是组件级别的,并且 Vue.js 在 patch 某个组件的时候,如果遇到组件这类抽象节点,在某些条件下也会触发子组件的更新。

100

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券