位置: 编程技术 - 正文

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

  • 增值税发票确认平台怎么认证发票
  • 办公室电话费计入什么科目
  • 预付的成本票计入什么科目?
  • 为什么社保明细少一个月
  • 预提费用在资产负债表哪个科目
  • 城市维护建设税优惠政策
  • 出国考察需要什么手续
  • 外贸企业申报出口退税时的会计分录
  • 土地增值税清算管理规程
  • 开给别的公司的支票可以转给其它人去抵账?
  • 企业所得税季报营业收入,营业成本怎么填
  • 增值税扣税项目
  • 税收编码3040203
  • 资产负债表和利润表的利润不一致
  • 长期待摊费用当月减少当月摊销吗
  • 收到分红款企业所得税怎么填报
  • 研发费收入属于什么收入
  • 国内企业给国外企业开发票
  • 已开发票发生销售退回如何做账?
  • macbook视频怎么用
  • u启动pe装机工具怎么重装系统
  • php技巧
  • 牛顿地名
  • laravel5.4生成验证码的代码
  • 个人账户存储额是缴费总和
  • 移动端适配方案面试题
  • 三维重建的主要步骤
  • flask实现登录
  • webpack配置publicpath
  • 装系统如何不安装自带软件
  • php分类
  • thinkphp route
  • 营改增后还有企业所得税吗?
  • wordpress 自动生成文章
  • python的元组有什么用
  • 预付卡账务处理在注会
  • 小规模差额征税的账务处理
  • 分公司民事责任由谁承担
  • 上缴非税收入的税种
  • 企业所得税的税基是什么
  • 以前年度多交的房产税现在收到退税款了咋做分录
  • 营业成本指的什么
  • 营业外收入怎么结转
  • 计提折旧会计分录怎么做
  • 冲销管理费用怎么写凭证
  • 固定资产清理属于什么科目
  • 自产的产品用于管理部门
  • 基金会收到捐款的会计分录
  • 小规模纳税人差额纳税申报表
  • 任何单位和个人都应当()为报警
  • 小规模纳税人发票可以抵扣吗
  • 科目怎么写?
  • 出纳日记账的日期以什么为准
  • ubuntu16.04.1下 mysql安装和卸载图文教程
  • mysql 5.6.23 winx64.zip安装详细教程
  • win8.1 升级
  • windowsserver2008r2忘记开机密码怎么办
  • 同一个用户
  • 苹果mac系统如何升级最新版本
  • 没有推送windows11
  • mac wife
  • 怎么看80端口被占用
  • win8 系统设置
  • 在linux系统中
  • 建立一个新用户并把它加入wheel组,设置用户密码为123
  • fat32和fat16
  • firefox下rowspan+border+border-collapse的bug
  • js中的filter方法和map方法
  • javascript简明教程
  • jquery轮播代码
  • 网页制作css样式
  • 深入理解计算机系统
  • jquery自定义的方法有哪些
  • javascript面向对象吗
  • javascript图片
  • 地税税号查询系统
  • 税收分类分级管理是什么
  • 地税局科员干什么的
  • 税务延期申报最长多久
  • 目前长沙二手房出售信息
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设