从源码的角度看 React JS 中批量更新 State 的策略(上)

[图片上传失败...(image-745746-1515134338066)]

在之前的文章「深入理解 React JS 中的 setState」与 「从源码的角度再看 React JS 中的 setState」 中,我们分别看到了 React JS 中 setState 的异步表现,并从源码的角度简单地了解了 React 中 setState 的设计结构以及原理。

这篇文章继上篇文章后,继续从源码的角度来了解 React 中对 State 批量更新策略的定义。

同样,源码的部分为了保证格式正常就直接截图了,查看源码点击对应的链接直接跳转至 GitHub 查看即可。

1. setState 的源码实现

在 setState 的源码实现中,传递过来的参数就被定义成了 partialState,从参数名以及参数的说明中就可以看到,这只是 state 的一部分。
默认都会调用 this.updater.enqueueSetState(this, partialState) 将 state 放进更新队列中去。
而如果有传递回调函数过来的话,会执行 this.updater.enqueueCallback(this, callback),涉及到回调函数的部分,我们后续文章会继续进行分析。

从源码的角度看 React JS 中批量更新 State 的策略(上)_第1张图片
截图

源码地址

2. 更新队列 ReactUpdateQueue 的定义

在上面的 setState 定义中,我们可以看到有一个 updater 的调用。
具体的定义如下。

从源码的角度看 React JS 中批量更新 State 的策略(上)_第2张图片
截图

源码地址

而初始的 updater 的定义如下。

从源码的角度看 React JS 中批量更新 State 的策略(上)_第3张图片
截图

源码地址

这样最终的更新队列都指向了 ReactUpdateQueue 的源码定义中。

3. ReactUpdateQueue 中的 enqueueSetState

我们可以看到 ReactUpdateQueue 中的 enqueueSetState 的定义。

从源码的角度看 React JS 中批量更新 State 的策略(上)_第4张图片
截图

源码地址

继续去跟 enqueueUpdate(internalInstance) 的实现。

从源码的角度看 React JS 中批量更新 State 的策略(上)_第5张图片
截图

源码地址

4. ReactUpdates 中的 enqueueUpdate

到这里,我们回到了上篇文章看到 ReactUpdates 的位置。

从源码的角度看 React JS 中批量更新 State 的策略(上)_第6张图片
截图

源码地址

我们继续看函数开始的部分,注入的两个部分。

从源码的角度看 React JS 中批量更新 State 的策略(上)_第7张图片
截图

源码地址

注入了两个部分,ReactReconcileTransaction 以及 batchingStrategy

ReactReconcileTransaction 主要用于在更新 state 时,页面 UI 元素的修正以及在执行生命周期函数时,处理好生命周期函数与其他用户自定义函数之间的执行顺序与逻辑,具体的实现可以参考它的源码。

ReactReconcileTransaction 源码地址

到这里,我们从 setState 的定义开始,梳理好了在进行更新策略前的逻辑部分,下篇文章,我们将直达 batchingStrategy 的内部实现,看看 React 的更新逻辑策略的实现。

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

你可能感兴趣的:(从源码的角度看 React JS 中批量更新 State 的策略(上))