【问题标题】:Performance comparison this.setState(this.state) vs this.setState({})this.setState(this.state) 与 this.setState({}) 的性能比较
【发布时间】:2017-12-27 13:44:44
【问题描述】:

我有一个从 api 获取数据的场景。在这种情况下,每当我从商店获得新值时,都会触发我的 componentWillReceiveProps()。

componentWillReceiveProps(newProps){
   if(newProps.listOne){
     this.state.listOne = newProps.listOne;
   }
   if(newProps.listTwo){
     this.state.listTwo = newProps.listTwo;
   }

   this.setState(this.state);

}

现在根据 react doc,使用 this.setState(this.state); 是不合适的;

因此请记住,更新状态的方式是

componentWillReceiveProps(newProps){
   if(newProps.listOne){
     this.setState({listOne : newProps.listOne});
   }
   if(newProps.listTwo){
     this.setState({listTwo : newProps.listTwo});
   }

}

在案例 1 中,在我将所有数据复制到 state 后,我的 Render 只会触发一次。 在案例 2 中,我的渲染(和所有中间生命周期)被触发,每次我的 If 条件得到满足。

所以我不明白它如何提高我的表现。假设我们谈论的不是一个,而是很多状态的条件更新。

【问题讨论】:

  • 请对您收到的答案进行反馈;无论是“这不能解决我的问题”还是将其标记为已接受。

标签: javascript reactjs


【解决方案1】:

如果你只想调用setState一次,你可以这样做:

componentWillReceiveProps(newProps) {
   // Copy the state instead of mutating this.state directly.
   const state = { ...this.state };

   if (newProps.listOne) {
      state.listOne = newProps.listOne;
   }

   if (newProps.listTwo) {
      state.listTwo = newProps.listTwo;
   }

   this.setState(state);
}

您可以通过 Immuable.js 等库使用真正不可变的数据结构来进一步改进。

但是,从性能的角度来看,不需要像这样手动批量更新; React 在内部已经对这些更新进行批处理,因为这是一个生命周期钩子。不过,如果您想使用来自 setState 的回调,这可能是有意义的。

【讨论】:

  • 嗨,你提供的深度复制状态的解决方案,它将进一步降低性能,因为现在整个虚拟 DOM 被新的虚拟 DOM 替换,而不是更新引用状态与前面的情况一样。
  • 不是深拷贝。但没关系,我的回答不止这些。例如多个 setState 调用被 React 批处理的信息。
猜你喜欢
  • 2018-11-13
  • 2023-03-18
  • 2016-06-22
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2018-08-04
  • 2020-12-24
相关资源
最近更新 更多