位置: 编程技术 - 正文

深入研究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)

  • 实收资本印花税是一年一交吗
  • 小规模纳税人要做账吗
  • 建筑业增值税税负预警
  • 无形资产出售利得计入
  • 出口货物如何申报
  • 小规模电子发票一张可以开多少金额
  • 出差会议纪要模板
  • 合伙开有限公司注销流程
  • 含税金额怎么算税额公式
  • 税收减免备案分录怎么写
  • 无效产权转移的契税需要征收吗
  • 资产负债表金额越来越大代表什么
  • 进口货物付款计入哪个科目?
  • 生产用水的会计分录
  • 资产负债表和利润表和现金流量表的关系
  • 股权转让分期收款怎么企业所得税
  • 免税发票有几种类型
  • 关于油票的纳税人识别号
  • 关于城建税教育费附加地方教育附加的计算
  • 股权转让个人所得税会计分录
  • 法人一证通年费缴费
  • 建筑安装施工过程
  • 广告公司固定资产有哪些?
  • 基金赎回手续费怎么计算
  • 转账如何退还一部分钱
  • PHP:oci_fetch_assoc()的用法_Oracle函数
  • 在linux中使用什么命令可以动态查看文件内容
  • PHP:pg_options()的用法_PostgreSQL函数
  • 电脑卡机动不了怎么重启
  • 财务费用属不属于生产成本
  • 此设备某些文件可能存在问题
  • php新版本特性
  • 应收款项减值的核算方法
  • 结转损益类收入科目
  • 代理服务费怎么入账
  • 漫天花雨异闻
  • python中的查找函数
  • vue中使用jsx语法
  • 没有计提坏账如何披露
  • php如何连接html
  • 增值税专用发票是干什么用的
  • 银行对账单可以作为原始凭证入账吗
  • 财政专项资金能不能用于偿还债务呢
  • 企业弥补以前年度亏损要怎么填表
  • 外购商品发放给员工 进项税额能不能抵扣
  • 附加税税率是指
  • 原材料不足
  • 财付通支付备付金
  • 未开票收入账务处理分录
  • 税控盘冲红怎么操作
  • 股本金退出要交税吗?
  • 可以抵扣进项税的项目包括
  • 影响以前年度损益的科目
  • 内部无形资产交什么税
  • 员工借款计入
  • 哪些发票必须注销
  • sql中的存储过程是干嘛用的
  • order by使用
  • 如何在windows server 2016如何加域
  • 电脑设置光盘启动方法
  • wrme.exe是什么
  • linux系统中安装软件
  • sgrmbroker.exe是什么进程
  • win8怎么设置定时关机
  • win8怎么进去安全模式
  • win8.1不能关机
  • centos 安装chia
  • win7 64位旗舰版电脑鼠标如何才能设置成左手操作?设置鼠标为左手操作的方法
  • windows8如何降到windows7
  • js添加列表项
  • 完本小说 电子书地址
  • 编写高质量代码改善JAVA程序的151个建议
  • node的使用
  • nodejs 异步io
  • python九大特点
  • javascript面向对象精要
  • 供暖配套费
  • 税务评定等级a是缴纳多少
  • 税务局发票邮寄需要多久
  • 村副主任有什么要求
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设