位置: 编程技术 - 正文

深入研究React中setState源码(深入react技术栈)

编辑:rootadmin

推荐整理分享深入研究React中setState源码(深入react技术栈),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入理解react,react useimperativehandle,深入react技术栈pdf,深入react技术栈pdf,深入react技术栈pdf,react理解,深入理解react,react深入浅出,内容如对您有帮助,希望把文章链接给更多的朋友!

React作为一门前端框架,虽然只是focus在MVVM中的View部分,但还是实现了View和model的绑定。修改数据的同时,可以实现View的刷新。这大大简化了我们的逻辑,只用关心数据流的变化,同时减少了代码量,使得后期维护也更加方便。这个特性则要归功于setState()方法。React中利用队列机制来管理state,避免了很多重复的View刷新。下面我们来从源码角度探寻下setState机制。

1 还是先声明一个组件,从最开始一步步来寻源;

所以主要来看是否传入了updater参数,也就是说何时进行 new 组件;具体的updater参数是怎么传递进来的,以及是那个对象,参见

react源码分析系列文章下面的react中context updater到底是如何传递的

这里直接说结果,updater对象其实就是ReactUpdateQueue.js 中暴漏出的ReactUpdateQueue对象;

2 既然找到了setState之后执行的动作,我们在一步步深入进去

ReactUpdateQueue.js

深入研究React中setState源码(深入react技术栈)

可以看到enqueueSetState enqueueCallback 最后都会执行enqueueUpdate;

ReactUpdates.js

ReactDefaultBatchingStrategy.js

接下来我们看下React中的事物处理机制到底是如何运行的;

Transaction.js

接着会执行ReactUpdates.js中的flushBatchedUpdates方法

ReactUpdates.js中

ReactReconciler.js中

ReactCompositeComponent.js

this.state的更新会在_processPendingState执行完执行。所以两次setState取到的都是this.state.count最初的值0,这就解释了之前的现象。其实,这也是React为了解决这种前后state依赖但是state又没及时更新的一种方案,因此在使用时大家要根据实际情况来判断该用哪种方式传参。来看个小例子直观感受下

setState流程还是很复杂的,设计也很精巧,避免了重复无谓的刷新组件。它的主要流程如下

enqueueSetState将state放入队列中,并调用enqueueUpdate处理要更新的Component 如果组件当前正处于update事务中,则先将Component存入dirtyComponent中。否则调用batchedUpdates处理。 batchedUpdates发起一次transaction.perform()事务 开始执行事务初始化,运行,结束三个阶段 初始化:事务初始化阶段没有注册方法,故无方法要执行 运行:执行setSate时传入的callback方法,一般不会传callback参数 结束:更新isBatchingUpdates为false,并执行FLUSH_BATCHED_UPDATES这个wrapper中的close方法 FLUSH_BATCHED_UPDATES在close阶段,会循环遍历所有的dirtyComponents,调用updateComponent刷新组件,并执行它的pendingCallbacks, 也就是setState中设置的callback。

标签: 深入react技术栈

本文链接地址:https://www.jiuchutong.com/biancheng/369824.html 转载请保留说明!

上一篇:不使用 JS 匿名函数理由(js匿名函数作用域)

下一篇:JavaScript canvas实现围绕旋转动画(javascript的canvas)

  • 出口抵减内销产品应纳税额为什么在借方
  • 一般纳税人劳务票一般开几个点
  • 已经作废的发票还需要申报吗
  • 应付票据和应付债券
  • 房产代理经纪人
  • 银行承兑汇票背书可以拆分
  • 现金日记账划线更正法
  • 小规模纳税人和个体工商户的税收政策
  • 股权转让后的实收资本怎么做账
  • 建安企业预缴企业所得税税率
  • 技术服务发票是劳务发票吗
  • 税收分类编码怎么导出来
  • 国家税务总局2017 11号
  • 增值税专票怎么认证
  • 消费税的纳税地点在哪里
  • 以前年度损益调整在利润表中怎么填
  • 支付工程款不得超60天
  • 软件产品登记证书官费
  • 残值收入的会计处理
  • 购买所有物品都是可以退货吗
  • 公司决议效力确认纠纷
  • 会计如果做假账
  • 其他综合收益属于什么类
  • 在win10系统中复制的文件不能粘贴怎么办?
  • 向国外个人支付的佣金是否缴纳个人所得税
  • php数组函数 菜鸟
  • 为员工购买商业保险的通知
  • cvpr2017最佳论文
  • 增值税减免税的征管规定有哪些
  • Access-Control-Expose-Headers 响应报头、跨域 公开响应头
  • php自动提交表单
  • 注册公司时的注册资金
  • 二次封装机
  • framework core
  • 谷歌浏览器无法安装
  • 命令grep
  • php获取当前文件夹
  • 购买的服务怎么做账
  • 营业外收入会计分录怎么做
  • 营改增一般纳税人简易征收的范围
  • 培训发票税点
  • python repeat函数
  • Dedecms评论同时发到QQ邮箱的实现方法
  • 增值税专用发票电子版
  • 股东借款怎么转为利润分配
  • sql server游标
  • 抵扣进项税额是啥意思
  • 固定资产未入账的定性依据
  • 计提折旧的固定资产平均总值怎么算
  • 公司购买办公用品会计分录
  • 核电站弃置费用通常多少钱
  • 债务重组损失如何做会计分录
  • 发票冲销后还能用吗
  • 政府征税再进行补贴对消费者福利的影响
  • 企业之间土地交易
  • sql语句执行顺序怎么写
  • mysql5.7免安装版
  • unix是什么语言
  • open dhcp server
  • Windows PC用iCloud多设备共享数据图文教程
  • linux命令pwd是什么意思
  • linux删除大量文件方法
  • win10系统开机弹文件资源管理器窗口
  • sdis.exe
  • windowsxp的磁盘管理在哪
  • 电脑开机显示windows不可用
  • win10如何将我的电脑添加到桌面
  • node.js基本语法
  • python制作gui
  • nodejs图片上传
  • unity api compatibility level
  • python 循环太慢
  • 漂亮的相片超好看的
  • python3 编码转换
  • 江西国税局电子税务局
  • 深圳国税电子税务局
  • 行政事业单位的会计核算以什么为基础
  • 国税和地税现在合并了吗
  • 河北省国家税务总局云办税厅
  • 每个省几个市
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设