位置: 编程技术 - 正文

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

  • 印花税申报表计税依据怎么填
  • 房产税的征收范围包括农村吗
  • 单位历史遗留问题
  • 原材料暂估入库怎么做账
  • 小微企业增值税减免政策
  • 进口货物销售不开票
  • 电子税务局税种认定怎么操作
  • 公司购车入固定资产包括哪些
  • 外商投资企业是中国企业吗
  • 公司转买旧车怎么过户
  • 股东货币出资比例
  • 驻外人员医保报销
  • 运输业过路费怎么做账
  • 纳税人发生纳税义务,未按照规定
  • 发票抬头写个人有效吗
  • 物业服务合同印花算什么类型
  • 消费税的纳税环节可能有
  • 公司领用自产产品建设厂房包括销项税
  • 前期差错更正处理方法
  • 自然人出租房屋房产税
  • 无形资产摊销可以按照其价值和使用情况
  • 小规模未开票收入如何申报增值税
  • 车间发生的购买办公用品支出应计入什么账户
  • 内部收益率计算公式及例题
  • 电子发票没有发票号码是怎么回事
  • 企业所得税调增调减项目有哪些
  • 如何解决win10关机后usb还在供电
  • 个税手续费返还属于政府补助吗
  • 工厂院子里的地图怎么画
  • 怎么给文件添加属性
  • 餐饮发票可以计入研发费用吗
  • 营改增后土增税收入
  • 机器学习,看这一篇就够了:回归算法,特征工程,分类算法,聚类算法,神经网络,深度学习入门
  • 应收账款包括哪些
  • php获取另一个php返回内容
  • 皮丘拉湖畔的乌代布尔城市宫殿,印度 (© Chaiyun Damkaew/Getty Images)
  • 小规模纳税人的企业所得税怎么算
  • 好用的移动端ui框架
  • 元宇宙与nft
  • css定位属性的运用
  • 房屋租赁费属于什么税收分类编码
  • lvm命令详解
  • 无盘领发票要怎么办
  • 资产处置费用是资产类会计科目吗
  • 新会计准则分录大全
  • 职工教育经费扣除限额怎么算
  • 终止合约要赔钱吗
  • 净值是原值减去折旧吗?
  • 现金流量表编制格式
  • 增值税和个人所得税怎么算
  • 固定资产加速折旧最新税收政策2023
  • 下列项目的进项税额可以从销项税额中抵扣的是()
  • 房地产增值税计入什么科目
  • 生育津贴是怎么申请
  • 企业收到投资者投入资金
  • 冲销以前年度多计提的费用分录
  • 餐饮无票收入怎么做账
  • 日常生活中常见的气质类型包括
  • 认证未抵扣往哪里记
  • 党组织专项经费包括什么
  • 员工垫付的钱会计分录
  • 如何填报自然人缴税系统
  • 复利终值与现值的关系
  • 小微企业要交残疾证吗
  • mysql允许字段为空
  • 简单基是什么
  • win10预览版怎么样
  • linux安装视频教程
  • linux最常用的shell终端是
  • win10添加功能在哪
  • linux bzz
  • unity的vector3
  • 各种常用的js函数有哪些
  • 安卓网络监测
  • 安卓动态图标怎么实现
  • unity移动
  • Warning: Build-tool 17.0.0 is missing AAPT at F:adt-bundle-windows-x86sdk
  • 发票测试纸在哪里打印
  • 上海网上申报软件怎样下载
  • 税务备案表付汇日期是否可以提前
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设