当前位置: 首页 > news >正文

你好,React setState

React用了有一段时间了,抽空写分析一下setState。

卧槽,刚要写词穷了。

 

关于react组件挂载、刷新、卸载都执行了那些,流程的概念如果不清楚请看这里

好啦进入正题,在react入门中我们经常接触到的就是createClass \ render\getInitialState等一下相关方法和生命周期的方法。为了让数据灵活性的变更,组件内部变化让组件变成一个活组件,我们用到了setState,用起来挺爽,改什么setState一下,ok啦,要是追本溯源setState干了啥,那些地方set了会被合并set,那些是reRender呢?

 

嗯本宝宝要开始吹牛逼了。

 

先上个图来源

 

/**
 * Mark a component as needing a rerender, adding an optional callback to a
 * list of functions which will be executed once the rerender occurs.
 */
function enqueueUpdate(component) {
  ensureInjected();

  // Various parts of our code (such as ReactCompositeComponent's
  // _renderValidatedComponent) assume that calls to render aren't nested;
  // verify that that's the case. (This is called by each top-level update
  // function, like setProps, setState, forceUpdate, etc.; creation and
  // destruction of top-level components is guarded in ReactMount.)

  if (!batchingStrategy.isBatchingUpdates) {
    batchingStrategy.batchedUpdates(enqueueUpdate, component);
    return;
  }

  dirtyComponents.push(component);
}

  简单说来,React 内部有一个ReactDefaultBatchingStrategy文件,这个家伙主要管的就是更新State的,它在React实例化的时候就被注入到ReactUpdates的类,它很傲娇,每次更新state的时候都会将isBatchingUpdates锁定。这个时候如果有setState到来的时候全部放入dirtyComponents队列里,等待锁定状态解除了将所有存储的state状态设定拿出来进行合并,然后render,反之如果isBatchingUpdates没有被锁定则直接render。

 

说了一段大白话,敢举个例子说一下嘛?

 例子来了,网上都会拿这个例子来说

 

 

看一下这个setState在那里设置,componentDidMount,原来是组件挂载完成啊。

直观理解1、2、3、4哈哈那就错了。上边有提到傲娇的isBatchingUpdates了吧。先看看componentDidMount的时候它的状态。

为毛才说,好吧我们开始一段state(以下简称BU)的诡(jie)异(ke)之旅,当然setState就是state的代(lao)言(ma)人(zi),来看看那里state我们的傲娇妹纸会接受呢(奸笑脸能不能set的幕后推手isBatchingUpdates)?

 

getDefaultProps 对于一个组件只初始化一次的大叔来说,state还没出生呢,不接。

getInitialState 这里也是set不了,妹纸内心OS:不要脸,人家刚刚初始化,你就你就要set一下,滚。(but state的初始化值就来自于这里)

componentWillMount 啦啦啦 我是除了init那家伙(给定初始值)以外第一个可以调用setState的人(yin),这是setState时isBatchingUpdates还是false耶,所以state会合并一次render到DOM(看这里,只render一次哦),然后isBatchingUpdates被锁定了。

 

 

 

 

 

render 上边的一堆都是啥,最后我才是state的接盘侠,这里如果有条件的setState,由于isBatchingUpdates已经处于锁定状态,所以set的值会放入等待队列,然后ComponentDidMount调用结束后reRender。

 

 

 

 

componentDidMount  我来了,卧槽前面有个妹纸(state),but她不喜欢我,willMount追了她,我反复的追她,她不理我,

因为isBatchingUpdates还在锁定中,

好消息是我成了state妹纸的备胎(放入等待队列),坏消息是我走了以后妹纸的资源才会被释(fen)放(shou),一个不好不坏的消息,等我从备胎变成了千斤顶,最终还是交给了render。

 

 

 

好了说说说上边的例子执行流程和结果。

第一次setState 由于状态锁定中,所以val被放入待更新队列,第二次也是一样

然后componentDidMount执行完毕,锁定状态解除,妹纸单身啦。然后他们两个setState作为一次合并在一起,然后更新state,这个时候state变成了1.(reRender)

第三次 setState 这时候锁定状态已经解除,来者不拒,所以第三次reRender

第四次依旧是reRender

 

 

 

 

转载于:https://www.cnblogs.com/God-Shell/articles/5633108.html

相关文章:

  • fastreport 如何 设置 richview 的 行高
  • Windows Phone 7 不温不火学习之《页面导航》
  • 我的ipad应用备份
  • 我又回来了
  • windows向ubuntu过渡之常用软件安装
  • java.util.ConcurrentModificationException 异常
  • windows和linux的协议栈驱动
  • vmware的vmnet-概念的解说
  • typeScript.webpackreact的正确版quickStart
  • vmware的vmnet-感官和视觉上的效果
  • 学习笔记:树分治
  • vmware的vmnet-有机会还要看源码
  • Python中递归的最大次数
  • vmware的vmnet-理解全景后解答两个问题
  • vmware的vmnet-组网,升级和应用
  • Android Studio:GIT提交项目到远程仓库
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Github访问慢解决办法
  • GraphQL学习过程应该是这样的
  • in typeof instanceof ===这些运算符有什么作用
  • java取消线程实例
  • orm2 中文文档 3.1 模型属性
  • PAT A1120
  • vue总结
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 爬虫模拟登陆 SegmentFault
  • 入门级的git使用指北
  • 推荐一个React的管理后台框架
  • 问题之ssh中Host key verification failed的解决
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #vue3 实现前端下载excel文件模板功能
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十三)Maven插件解析运行机制
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)VirtualBox安装增强功能
  • .net core 连接数据库,通过数据库生成Modell
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net解析传过来的xml_DOM4J解析XML文件
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [docker] Docker的私有仓库部署——Harbor
  • [HCIE] IPSec-VPN (手工模式)
  • [HeadFrist-HTMLCSS学习笔记][第一章Web语言:开始了解HTML]
  • [IE9] GPU硬件加速到底是实用创新还是噱头
  • [IE9] IE9 beta版下载链接
  • [JavaEE系列] Thread类的基本用法
  • [NHibernate]条件查询Criteria Query
  • [NOI 2016]循环之美
  • [RK3568 Android11] Binder通信整体框架
  • [Spring Boot1]配置、视图、Web开发
  • [svc]logstash和filebeat之间ssl加密