【问题标题】:this.setState() in callback of this.setState()this.setState() 在 this.setState() 的回调中
【发布时间】:2018-11-10 05:50:27
【问题描述】:

能否在传递给this.setState()?的回调定义中显式调用this.setState()

this.setState(
 {
   openA:true 
 }, 
 () => {
   this.setState({
     openB: false
   })
 } 
)

【问题讨论】:

  • 您可以,但很可能不应该。你认为你为什么需要这个?
  • 没有要求,需要知道我们是否可以这样做。将有 2 次重新渲染(每个 this.setState() 之后一次)或回调结束后只有 1 次重新渲染?

标签: javascript reactjs setstate


【解决方案1】:

可以这样做,这将导致 2 次重新渲染而不是 1 次。通常不需要这样做。

如果setState是独立的,可以是:

this.setState({ openA:true });
this.setState({ openB:false });

如果更新状态相互依赖,则应使用更新函数:

this.setState({ openA:true });
this.setState(state => ({ openB: !state.openA }));

【讨论】:

  • 在上面的情况下,setState 函数会被批处理,但是使用 setState 的函数方法会分开做吗?
  • 完全理解,很好的解释。点赞会帮助更多:)
  • 两个不同的 setState 可能会重新渲染两次,您可以在单个 setState this.setState({ openA:true, openB: false }); 中执行此操作,对于依赖值,您必须使用回调,因为 setState 是异步的,@estus 提到的答案将不起作用预期,您使用了以下方法this.setState({ openA:true }, ()=>this.setState({openB: this.state.openB}));
  • 以上回调仅用于演示,对于布尔值可以在单个setState中设置,上述方法仅用于复杂计算值
  • @HafeezHamza 两个不同的 setState 可能会重新渲染两次 - 仅在特定情况下,它们通常在一次更新中批处理。 不会按预期工作 - 取决于您的期望。 对于依赖值,您必须使用回调,因为 setState 是异步的 - 这不是真的,您必须为此(第一个参数)使用更新程序函数,我建议您查看手册。如果您认为答案中列出的实现存在问题,请考虑提供演示。 @HaiderAliAnjum 很高兴它有帮助。
【解决方案2】:

是的。它会在第一个 setState 完成后运行它。

【讨论】:

  • 这是我知道的,它将如何发挥作用。组件更新将在第一次设置状态后或第二次设置状态后调用?
猜你喜欢
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2019-02-14
  • 2019-04-23
  • 2017-01-05
相关资源
最近更新 更多