最佳答案
我理解,反应教程和文档警告在 没有不确定的条件状态不应该直接突变,一切都应该通过 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}>Increment</button>
</div>
);
},
});
export default App;
我完全赞成遵循以下约定,但是我想进一步了解 ReactJS 实际上是如何工作的,哪里可能出错,或者上面的代码是次优的。
this.setState
文档下的注释基本上指出了两个陷阱:
this.setState
,这可能会替换(覆盖?)你的突变。我不明白在上面的代码中怎么会发生这种情况。setState
可能会以异步/延迟的方式有效地突变 this.state
,因此当你在调用 this.setState
之后立即访问 this.state
时,你不能保证访问最终的突变状态。我明白了,如果 this.setState
是 update 函数的最后一次调用,这就不是问题了。