setState相关

2019-10-18  本文已影响0人  糕糕AA

- setState相关

  1. setState是同步执行的,但是state不一定同步更新
  2. 多次执行setState,内部会合并 ,进行批量操作,类似于Object.assgin,相同的key会覆盖前面的。
  3. 在原生事件,setTimeout、setInterval、Promise等异步操作中,state会同步更新
  4. setState(object, callback),对象式object为nextState;
  5. setState(function, callback),函数式,function为(prevState, props) => stateChange
  6. callback为state更新后的回调,此时可以取得更新后的回调

setState基本过程

它会引起react的更新生命周期的4个函数执行:shouldComponentUpdate、componentWillUpdate、render、componentDidUpdate,直到render被调用时,this.state才被更新。

setState批量更新过程

react生命周期和事件执行前后都有相应的钩子,分别是pre钩子和post钩子,pre会调用batchedUpdate方法,将isBatchingUpdates变量置为true,开启批量更新,而post钩子会置为false。原生事件和异步操作中,不会执行pre钩子,所以不会批量更新

当调用this.setState()时,新值存入pending队列,—>判断是否处于batch update,是的话保存在dirtyComponent中;不是遍历所有dirtyComponent,调用updateComponent,更新pending state or props

缺点:

  1. setState会循环引用:shouldComponentUpdate、componentWillUpdate、render、componentDidUpdate等生命周期函数会被依次调用,如果在后面4个方法中调用了setState,会造成循环调用,导致内存溢出而奔溃。
  2. 会引起不必要的渲染:可以通过shouldComponentUpdate解决;
  3. 不能有效管理组件中所有状态,因为某些状态和视图没有关系,state中应该保存与渲染相关的状态,与渲染无关的直接保存为实例属性
  4. setState类似于Object.assgin,只会覆盖,不会减少原状态;replaceState完全替换原状态,相当于赋值。

- :star:​setState同步异步问题

上一篇下一篇

猜你喜欢

热点阅读