设为首页 收藏本站
查看: 776|回复: 0

[经验分享] ReactJS setState 详解

[复制链接]
累计签到:3 天
连续签到:1 天
发表于 2017-3-30 15:19:22 | 显示全部楼层 |阅读模式
本文和大家分享的主要是ReactJS setState相关内容,一起来看看吧,希望对大家学习ReactJS有所帮助。
  setState(nextState, callback)
  这是UI更新最常用的方法,合并新的state到现有的state
  常规方式
  nextState 可以为一个对象,包含0个或多个要更新的key。最简单的用法为:
  this.setState({
  key1: value1,
  key2: value2
  });
  这种方式能应付大部分的应用场景,但是看看下面这种情况:
  this.setState({
  count: this.state.count + 1
  });this.setState({
  count: this.state.count + 1
  });
  最后得到的count却是不可控的。因为 setState 不会立即改变 this.state ,而是挂起状态转换,调用 setState 方法后立即访问 this.state 可能得到的是旧的值。
  setState 方法不会阻塞state更新完毕
  第二个 setState 可能还没等待第一次的state更新完毕就开始执行了,所以最后count可能只加了1
  这时 setState 的第二个参数就派上用场了,第二个参数是state更新完毕的回调函数
  this.setState({
  count: this.state.count + 1
  }, () => {
  this.setState({
  count: this.state.count + 1
  });
  });
  不过看起来很怪, es6 中可以使用 Promise 更优雅的使用这个函数,封装一下 setState
  function setStateAsync(nextState){
  return new Promise(resolve => {
  this.setState(nextState, resolve);
  });
  }
  上面的例子就可以这样写
  async func() {
  ...
  await this.setStateAsync({count: this.state.count + 1});
  await this.setStateAsync({count: this.state.count + 1});
  }
  顺眼多了。
  函数方式
  nextState 也可以是一个 function ,称为状态计算函数,结构为 function(state, props) => newState 。这个函数会将每次更新 加入队列 中,执行时通过当前的 state props 来获取新的 state 。那么上面的例子就可以这样写
  this.setState((state, props) => {
  return {count: state.count + 1};
  });this.setState((state, props) => {
  return {count: state.count + 1};
  });
  每次更新时都会提取出当前的state,进行运算得到新的state,就保证了数据的同步更新。
  控制渲染
  默认调用 setState 都会重新渲染视图,但是通过 shouldComponentUpdate() 函数返回 false 来避免重新渲染。
  如果可变对象无法在 shouldComponentUpdate() 函数中实现条件渲染,则需要控制 newState prevState 不同时才调用 setState 来避免不必要的重新渲染。

来源:拨雾见青云




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-357723-1-1.html 上篇帖子: Python中tuple元组如何使用? 下篇帖子: ReactJS使用中常见的问题整理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表