位置: 编程技术 - 正文

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

  • 车保保险合同
  • 印花税纳税义务人有哪些
  • 先包装后销售
  • 小规模残保金优惠政策2019
  • 用银行存款支付罚款
  • 机器保养计入什么
  • 转账支票需要哪些资料
  • 银行收取的利息要交税吗
  • 建筑施工企业预交税款
  • 电视机在开票中属于哪一类
  • 浙江金税三期个税下载
  • 出口退税率为0算免税吗
  • 即征即退收入是否计入所得税
  • 企业外币交易会计核算方法
  • 车间管理人员工作总结
  • 分支机构分配表 资产总额无法区分怎么办
  • 停车管理费什么时候交
  • 增值税多交了怎么申请退税
  • 电子发票没有纳税人识别号可以报销吗
  • 固定资产减值准备可以税前扣除吗
  • 拆迁补偿款有退的吗
  • 建筑行业会计成本会计工作流程
  • ppt另存为在哪儿
  • win7系统里没有无线网络连接
  • 笔记本电脑按键掉了怎么修
  • 佣金代扣代缴增值税需要缴纳附加税吗
  • 苹果15手机价格和图片颜色
  • 按揭贷款到账时间
  • PHP:oci_fetch_array()的用法_Oracle函数
  • 鸿蒙系统怎么退出开发者选项
  • 会计账簿的登记
  • 部署文档
  • Laravel 5.5官方推荐的Nginx配置学习教程
  • 应收票据的账务处理讲解
  • 利润的构成要素包括
  • 封装和调用
  • 语谱图生成
  • 小程序unload
  • 微信小程序人民法院审核通过多久立案
  • php使用ajax
  • 资产的账面价值大于计税基础
  • 车间管理人员为什么是制造费用
  • 公司买东西了怎么做账
  • 纳税人备案期限
  • 施工单位代建收费合法吗
  • python中map和filter有啥区别
  • 材料采购会计科目怎么使用
  • mysql存储过程之错误处理
  • 织梦cms怎么样
  • 关联企业的费用包括
  • 房地产企业 预缴
  • 未支付房租怎么做账
  • 存根联明细怎么申报
  • 三证合一后还有纳税人资格证吗
  • 公司购药品入什么科目
  • 培训费发票必须开吗
  • 单位固定资产统计表
  • 房屋装修费用的会计科目
  • win8系统启动慢怎么办
  • vista正版怎么升级win7
  • solaris 11.3
  • mac苹果电脑如何开4个微信号
  • win7如何设置多个显示器
  • shell source不起作用
  • 游戏输入法安卓
  • Unity3D游戏开发(第2版)pdf
  • 圣食颐年
  • js存储
  • ajax的异步是什么意思
  • 置顶聊天折叠怎么开启
  • 点击按钮显示
  • javascript+HTML5自定义元素播放焦点图动画
  • 隐藏应用名字
  • webview清除数据
  • bootstrap-treeview自定义双击事件实现方法
  • javascript基于什么的语言
  • 详解js跨域原理是什么
  • 贵州省产检费用报销流程
  • 境外服务收入如何纳税
  • 个体户是否需要缴纳企业所得税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设