位置: 编程技术 - 正文

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

  • 汇算清缴所得税退回做账
  • 表见代理通俗
  • 律师事务所的所训
  • 小规模入账的收入分录
  • 百旺税控盘自己用不了
  • 外资企业是否属于公有制经济
  • 一般纳税人所得税优惠政策最新2022
  • 咨询服务合同印花税税目
  • 小微企业免税销售额和其他免税销售额
  • 工伤私了赔偿
  • 员工个人部分所承担的社保会计分录怎么做
  • 公司土地转让另外公司
  • 冲减留抵税会计分录
  • 个人去税局开劳务费需要注意什么
  • 个人劳务报酬个人所得税怎么算
  • 企业获得利润
  • 全国失信人员信息
  • 生物性资产是什么
  • 什么时候抵扣增值税
  • 挂靠行为应当如何纳税?
  • 物业公司水费差额征税不备案
  • 公司的汽车购置税怎么交
  • 计提折旧会计分录的借方不可能是
  • excel合并的单元格怎么填充序列
  • 惠普hp笔记本电脑怎么开机
  • 开增值税发票折扣额怎么开出来的?
  • linux系统的
  • php数组函数输出《咏雪》里有多少"片"字
  • 印花税怎么交款
  • 个人转让股权如何缴纳个人所得税税率
  • 固定资产抵账的增值税
  • 应收账款证券化流程
  • 施工行业企业
  • layuiadmin动态菜单
  • 企业所得税申报表模板
  • php缩进
  • 产品补发原来的要退吗
  • 出租固定资产的租金收入
  • 新申报是什么
  • python如何合并字典
  • db2 decoupled
  • 办公费用开专票可以抵扣吗
  • 企业所得税的内容比土地增值税的多了
  • 免征增值税和增值税免税
  • 地方水利建设基金减免政策2023
  • 外国常驻代表机构经费支出范围
  • 混凝土增值税发票税率
  • 支付土地租金计入什么科目里面
  • 支付技术转让费所得税处理
  • 物业安装摄像头的规定
  • 工资里计提五险什么意思
  • 公对公转账后对方拒绝开发票
  • 公司支付质保金怎么做账
  • tesmon.sys导致的蓝屏
  • linux系统中文件权限分为哪三种
  • centos8安装rpm包
  • xp系统如何设置默认软件
  • linux挂载yum
  • centos7 lvcreate
  • 英文xp系统中文语言包
  • newdot.exe - newdot是什么进程 有什么用
  • java.exe是指
  • linux怎么清除内存
  • win7系统怎样安装字体
  • windows自带视频
  • linux中ftp命令的用法
  • Node.js中的核心模块包括哪些内容?
  • 安卓性能测试主要测试的是
  • bat文件指令
  • 不使用jsp
  • 网页中经常用到的代码
  • Xamarin.Android 入门开发
  • html5过渡的触发机制
  • android自学
  • art+project
  • js获取url参数值的两种方式
  • 什么是居民企业和非居民企业
  • 单位发的一次性奖励如何扣税
  • 西宁市房屋维修基金收费标准2021
  • 新疆塔城靠近俄罗斯吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设