【问题标题】:Synchronous alternative for setState [closed]setState 的同步替代方案 [关闭]
【发布时间】:2019-08-06 15:52:12
【问题描述】:

我知道 setState 是异步的,它可能不会在调用 setState() 后立即改变状态,是否有任何替代方法可以同步改变状态或立即改变状态?

【问题讨论】:

  • 这似乎是一个 XY 问题,所以如果你说你想做什么,你尝试了什么,你的理想结果是什么,也许其他建议可以遵循。正如您现在的问题一样,昆汀的回答是准确的,尽管根据扩展问题可能为时过早
  • 如果您需要确保您的状态已更新,您可以在使用状态之前使用 this.forceUpdate()。然而,这通常是一个 React 反模式,最好以不同的方式解决问题并使用不同的抽象。
  • " 是否有任何替代方法可以同步更改状态或立即改变状态?"没有

标签: javascript reactjs


【解决方案1】:

不,没有。无论如何,如果您希望状态同步动作,因为您想在更新后立即触发函数,有一种方法可以知道状态是否改变,以便您可以顺序调用函数:

setState({/*state values*/}, () => {/*function triggered*/})

【讨论】:

    【解决方案2】:

    setState 没有同步替代方案。

    根据您的用例,您可以直接使用setState 来解决常见的陷阱。

    如果你想要一个计数器(或类似的东西),你可以通过向setState传递一个函数来实现序列化状态更新:

    foo() {
      this.setState(state => {
        return {counter: state.counter + 1};
      });
    }
    

    该函数将获取state(以及可选的props)作为参数,您可以返回一个用于更新状态的对象。

    这将防止您在使用以下内容时错过更新:

    this.setState({counter: this.state.counter + 1})
    

    如果您想知道状态更新何时完成,可以使用setState 的可选第二个参数:

    this.setState({foo: 12}, () => {
      // Do something after the state updated...
    });
    

    如果需要,您还可以混合使用两种变体(将 2 个函数传递给 setState)

    【讨论】:

      【解决方案3】:

      没有。 setState 是异步句号。

      【讨论】:

        猜你喜欢
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 2010-10-11
        • 2017-03-23
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多