如何取消 `this.setState`?
How do I cancel a `this.setState`?
所以我知道在 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 */ }
}
});
您不需要取消设置状态。您可以使用 shouldComponentUpdate(nextProps, nextState) 来决定组件是否应该更新。
比较 this.setState 之外的状态,根据它是否改变,触发 this.setState?
"tell React not to do anything"的成语是"return the previous state"。由 React 的内部管理来确定 DOM 没有实际更改,并且用户不会看到任何内容。特别是,如果两个对象相同,则默认 shouldComponentUpdate
将 return false。
所以你唯一需要的是:
return previousState
;
很抱歉在这里回答我自己的问题,但是较新的 React 16 允许您取消 setState
。
Minor changes to setState behavior:
- Calling
setState
with null
no longer triggers an update. This allows you to decide in an updater function if you want to re-render.
- Calling
setState
directly in render always causes an update. This was not previously the case. Regardless, you should not be calling setState
from render.
setState
callback (second argument) now fires immediately after componentDidMount
/ componentDidUpdate
instead of after all components have rendered.
returning null
和 returning previousState
之间的重要区别在于 returning null
的作用类似于 PureComponent
执行并阻止 render
方法被调用。
从 React 16 开始,调用 setState
总是会触发 render
方法,即使您 return previousState
.
对于@bennygenel
的观点,你应该使用shouldComponentUpdate
来防止重新渲染。
更新: 从 React 16.8 开始,如果您使用 React Hooks (this is unrelated to class components), then returning previous state from useState
does, in fact, prevent the re-render altogether. See here for source
所以我知道在 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 */ }
}
});
您不需要取消设置状态。您可以使用 shouldComponentUpdate(nextProps, nextState) 来决定组件是否应该更新。
比较 this.setState 之外的状态,根据它是否改变,触发 this.setState?
"tell React not to do anything"的成语是"return the previous state"。由 React 的内部管理来确定 DOM 没有实际更改,并且用户不会看到任何内容。特别是,如果两个对象相同,则默认 shouldComponentUpdate
将 return false。
所以你唯一需要的是:
return previousState
;
很抱歉在这里回答我自己的问题,但是较新的 React 16 允许您取消 setState
。
Minor changes to setState behavior:
- Calling
setState
withnull
no longer triggers an update. This allows you to decide in an updater function if you want to re-render.- Calling
setState
directly in render always causes an update. This was not previously the case. Regardless, you should not be callingsetState
from render.setState
callback (second argument) now fires immediately aftercomponentDidMount
/componentDidUpdate
instead of after all components have rendered.
returning null
和 returning previousState
之间的重要区别在于 returning null
的作用类似于 PureComponent
执行并阻止 render
方法被调用。
从 React 16 开始,调用 setState
总是会触发 render
方法,即使您 return previousState
.
对于@bennygenel
的观点,你应该使用shouldComponentUpdate
来防止重新渲染。
更新: 从 React 16.8 开始,如果您使用 React Hooks (this is unrelated to class components), then returning previous state from useState
does, in fact, prevent the re-render altogether. See here for source