【发布时间】:2018-07-11 19:57:03
【问题描述】:
我知道 React 可能会异步和批量执行状态更新以优化性能。因此,您永远不能相信在调用setState 之后会更新状态。但是你能相信 React 会按照setState 被调用的顺序更新状态
- 相同的组件?
- 不同的组件?
考虑单击以下示例中的按钮:
1.有没有可能a为假而b为真:
class Container extends React.Component {
constructor(props) {
super(props);
this.state = { a: false, b: false };
}
render() {
return <Button onClick={this.handleClick}/>
}
handleClick = () => {
this.setState({ a: true });
this.setState({ b: true });
}
}
2.有没有可能a为假而b为真:
class SuperContainer extends React.Component {
constructor(props) {
super(props);
this.state = { a: false };
}
render() {
return <Container setParentState={this.setState.bind(this)}/>
}
}
class Container extends React.Component {
constructor(props) {
super(props);
this.state = { b: false };
}
render() {
return <Button onClick={this.handleClick}/>
}
handleClick = () => {
this.props.setParentState({ a: true });
this.setState({ b: true });
}
}
请记住,这些是对我的用例的极端简化。我意识到我可以以不同的方式做到这一点,例如在示例 1 中同时更新两个状态参数,以及在示例 2 中对第一个状态更新的回调中执行第二个状态更新。但是,这不是我的问题,我只对是否存在感兴趣React 执行这些状态更新的定义明确的方式,仅此而已。
非常感谢任何由文档支持的答案。
【问题讨论】:
-
这似乎不是一个毫无意义的问题,你也可以在 react page 的 github issues 上问这个问题,dan abramov 通常在那里很有帮助。当我有这么棘手的问题时,我会问,他会回答。糟糕的是,这些问题不像官方文档那样公开共享(因此其他人也可以轻松访问它)。我也觉得 React 官方文档缺乏对某些主题的广泛报道,例如您的问题中的主题等。
-
例如:github.com/facebook/react/issues/11793,我相信该问题中讨论的内容会对许多开发人员有所帮助,但这些内容不在官方文档中,因为 FB 人认为这是高级的。其他事情可能也是如此。我认为一篇题为“深入反应的状态管理”或“状态管理的陷阱”之类的官方文章探讨了您问题中状态管理的所有角落案例,这还不错。也许我们可以推动 FB 开发人员用这些东西扩展文档:)
-
我的问题中有一篇关于媒体的精彩文章的链接。它应该涵盖 95% 的状态用例。 :)
-
@Michal 但那篇文章仍然没有回答这个问题恕我直言
标签: javascript reactjs state setstate