我知道 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}>Increment</button>
</div>
);
},
});
export default App;
我完全支持遵循约定,但我想进一步了解 ReactJS 的实际工作方式以及可能出错的地方,或者上面的代码是否不是最理想的。
this.setState
文档下的注释基本上确定了两个陷阱:
- 如果你直接改变状态然后随后调用
this.setState
它可能会替换(覆盖?)你所做的改变。我在上面的代码中看不到这是如何发生的。 - 这
setState
可能会this.state
以异步/延迟方式有效地变异,因此this.state
在调用后this.setState
立即访问时,不能保证访问最终的变异状态。我明白了,如果this.setState
是更新函数的最后一次调用,这不是问题。