如何取消 `this.setState`?

Posted

技术标签:

【中文标题】如何取消 `this.setState`?【英文标题】:How do I cancel a `this.setState`? 【发布时间】:2018-02-15 02:24:03 【问题描述】:

所以我知道在 React 中设置状态是异步的,我们设置状态是这样的:

this.setState(previousState => 
  return  /* some new state that uses `previousState` */ 
);

所以我的问题是:如何取消this.setState假设我使用previousState 来确定我不需要呈现更新。如何取消 setState 并告诉 React 不要重新渲染任何内容。

this.setState(previousState => 
  if (/* previousState is fine */) 
    // tell react not to do anything
   else 
    return  /* some new state */ 
  
);

【问题讨论】:

您如何确定您不需要其他更新?你的意思是如果状态没有改变? 为什么首先打电话给this.setState()?听起来您需要做的就是检查this.state,然后致电this.setState() shouldComponentUpdate 生命周期是您所需要的。 ***.com/questions/44521391/… 的可能重复项 另请注意,将状态设置为之前的状态不应导致render() 调用;首先创建 React 的一个要点是避免不必要的 GUI 更新,afaik。 【参考方案1】:

比较 this.setState 之外的状态,根据它是否改变,触发 this.setState?

【讨论】:

【参考方案2】:

很抱歉在这里回答我自己的问题,但较新的 React 16 允许您取消 setState

对 setState 行为的微小更改:

null 调用setState 不再触发更新。这使您可以在更新程序功能中决定是否要重新渲染。 直接在渲染中调用setState 总是会导致更新。以前不是这种情况。无论如何,您不应该从渲染中调用setStatesetState 回调(第二个参数)现在在 componentDidMount / componentDidUpdate 之后立即触发,而不是在所有组件都渲染之后触发。

source


返回null 和返回previousState 之间的重要区别在于,返回null 的作用与PureComponent 的作用相同,并且完全阻止调用render 方法。

从 React 16 开始,调用 setState 总是会触发 render 方法,即使你返回 previousState


不过,就@bennygenel 而言,您应该使用shouldComponentUpdate 来防止重新渲染。


更新:从 React 16.8 开始,如果您使用的是 React Hooks(这与类组件无关),则从 useState 返回之前的状态 确实,事实上,完全阻止了重新渲染。 See here for source

【讨论】:

【参考方案3】:

“告诉 React 不要做任何事情”的成语是“返回之前的状态”。由 React 的内部管理决定是否对 DOM 没有实际的更改,并且用户不会看到任何内容。特别是,如果两个对象相同,默认的shouldComponentUpdate 将返回 false。

所以你唯一需要的是:

return previousState;

【讨论】:

【参考方案4】:

您不需要取消设置状态。您可以使用shouldComponentUpdate(nextProps, nextState) 来决定组件是否应该更新。

【讨论】:

以上是关于如何取消 `this.setState`?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 usestate 和 setstate 而不是 this.setState 使用 react 和 typescript?

访问 this.state 后如何确保 setState 调用已经执行?

React进行数据处理

React进行数据处理

如何在我的示例中正确使用 setState()?

React的setState如何实现同步处理数据