我了解React教程和文档会发出警告 毫无疑问地说,状态不应该直接变异,所有事情都应该通过setState
。
我想了解为什么,我不能直接更改状态,然后(在同一函数中)调用 this.setState({})
仅来触发它render
。
例如:以下代码似乎正常工作:
const React = require('react');
const App = React.createClass({
getInitialState: function() {
return {
some: {
rather: {
deeply: {
embedded: {
stuff: 1
}}}}};
},
updateCounter: function () {
this.state.some.rather.deeply.embedded.stuff++;
this.setState({}); // just to trigger the render ...
},
render: function() {
return (
<div>
Counter value: {this.state.some.rather.deeply.embedded.stuff}
<br></br>
<button onClick={this.updateCounter}>inc</button>
</div>
);
}
});
export default App;
我全都遵循以下约定,但我想进一步加深对ReactJS实际工作方式的理解,以及可能出现问题的地方,或者上述代码不是最佳选择。
文档下的注释this.setState
基本上标识了两个陷阱:
- 如果您直接更改状态然后再调用
this.setState
它,则可能会替换(覆盖?)所做的更改。我看不到上面的代码中如何发生这种情况。 - 这
setState
可能会this.state
以异步/延迟的方式有效地进行更改,因此,this.state
在调用后this.setState
立即访问时,不能保证您访问最终的更改状态。我知道,如果this.setState
更新功能的最后一次调用不是问题,
setState
。它涵盖了一些很好的理由。