位置: 编程技术 - 正文

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

  • 唐朝的两税法是什么
  • 实际开票金额和申报金额不符
  • 开票系统技术维护费怎么抵扣
  • 金税四期什么时候全国运行
  • 法人购买商业保险能由公司承担吗
  • 季度企业所得税申报表怎么填写
  • 所得税可以预交吗现在
  • 报税显示税款入账未到账
  • 预售款计入收入吗
  • 收款凭证填写模板下载
  • 营改增后建筑业
  • 做内帐和外账需要多久
  • 合作社收到补贴款如何入账
  • 印花税计提多了怎样更正
  • 公司银行社保代缴怎么交
  • 进项税申报但未抵扣
  • 意外死亡公司赔偿多少标准
  • 股票收入要交税的后果有哪些
  • 劳务公司差额征税怎么计算
  • 免税收入的三个条件
  • 金税盘全额抵扣分录怎么做
  • 旅游业务开什么发票
  • 广告代理服务计入什么费用
  • 小规模所得税申报表填写样本
  • 公司按揭购车
  • 无法取得发票的费用如何入账
  • 技术转让减免所得额
  • 建筑行业收到劳务发票入工程施工科目
  • 公司买厨房用品计入什么科目
  • 会计结算要求
  • Windows11更新后无法联网
  • php数组函数实现机选双色球
  • win7为什么还有人用
  • 无形资产初始计量的表述
  • 提示内存不足
  • php使用教程
  • vue使用jquery
  • 买花木计入什么科目
  • yii框架搜索分页modle写法
  • org.springframework.web.server
  • vue项目使用百度地图怎么长久使用
  • python按行读入
  • 当月已入账可是未入账
  • 产品成本包括哪些
  • Win7 32/64位系统下安装SQL2005和SP3补丁安装教程[图文]
  • 增值税发票查询全国统一发票查询平台
  • 无形资产摊销是按原值吗
  • 购房补贴退契税多久到账
  • 当月未取得发票的费用怎么入账
  • 跨年度冲红字发票账务处理
  • 房地产老项目简易计税开专票
  • 银行存款利息应计入
  • 规划设计费收费依据
  • 车间成本核算表
  • 出租办公楼收入属于收入吗
  • 子公司和区域公司的区别
  • 财务软件可以直接做管理费用吗?
  • 财政专用存款账户
  • xp怎么删除系统
  • 修改windows host文件
  • linux深入理解
  • freebsd ports安装
  • linux中less和more
  • windows mobile
  • win7 64位旗舰版电脑如何提高鼠标的精准度?提高鼠标的精准度的方法
  • win8.1出现了一些问题
  • android屏幕适配的五种方式
  • 未知类型的文件怎么打开
  • perl脚本输出变量
  • 统计一组数据各个数字出现的次数
  • Errors running builder 'Android Resource Manager' on Project java.lang.NullPointerException
  • php常用函数200个
  • javascript数组的常用方法
  • python中scipy用法
  • 资源税属于国税还是地税
  • 沙子属于矿产资源
  • 国税湖南电子税务局官网
  • 济南税务局,济南电子税务局官网
  • 深圳为何
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设