【问题标题】:setState doesnt seem to update the state [duplicate]setState 似乎没有更新状态[重复]
【发布时间】:2018-04-14 16:48:29
【问题描述】:
onSelectedRow(user, clickEvent){
     const state = this.state;
    this.state['userId'] = clickEvent.target.getAttribute(user['mta:UserId']);
    this.setState(state);
    console.log(user['mta:UserId']);
    console.log(this.state);
}

好的,所以当我在我的应用中单击 table-cell 时,会调用此函数。

它的重点是获取用户 UserId 并设置状态。此 UserId 稍后传递给子组件并用于获取特定信息。问题是我在第一个 console.log 中得到了正确的数据,但是当我记录这个时。

说明 userId 由于某种原因仍然为空。有人遇到过类似的问题吗?

【问题讨论】:

  • setState 是一个异步操作,它不会立即更新组件的状态
  • 你考虑过reading the documentation 吗? setState() 并不总是立即更新组件。它可能会批量更新或推迟更新。这使得在调用setState() 之后立即读取this.state 是一个潜在的陷阱。”
  • 你不应该像上面那样改变状态:const state = this.state; this.state['userId'] = clickEvent.target.getAttribute(user['mta:UserId']); 在这里阅读:reactjs.org/docs/…

标签: javascript reactjs state setstate


【解决方案1】:

这很可能是因为您没有更新const state,而是试图改变状态本身。 此外,您不必复制状态。您可以像这样只更新要更新的字段:

onSelectedRow(user, clickEvent) {
    this.setState({
        userId: clickEvent.target.getAttribute(user['mta:UserId'])
    }, () => { console.log(this.state.userId) });
    console.log(user['mta:UserId']);
}

此外,您的 console.log 不会立即读取状态变化,因为 setState 是一个异步操作。

如果你真的想阅读它,你可以将回调传递给setState,它会在状态更新后立即触发,或者使用 React 的生命周期方法componentDidUpdate()

【讨论】:

  • 为什么投反对票?这是正确的答案。
  • 这就是我在答案中写的,所以我真的不明白这里有什么问题。我知道 React,我几乎每天都在使用它。
  • 好吧,这更像是一个答案。我只是想更正 novafluff 的代码以使其正常工作,而不是对 console.log 进行说明。不过我会更新的。
  • @Icepickle,我已经更新了一个答案,所以它提供了更多信息。
  • 是的,但我会删除代码后的第一段,添加的很清楚:)
猜你喜欢
  • 1970-01-01
  • 2021-09-06
  • 2018-04-08
  • 2017-09-05
  • 2018-08-11
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
相关资源
最近更新 更多