我记得当我发现它setState
是异步的时我是多么惊讶。现在我偶然发现了一种不符合我对setState
异步性理解的“奇怪”行为。
考虑下面的一个片段(由于某种原因它导致Script Error
,这里是外部沙箱:https : //codesandbox.io/s/zwrvkz74y3):
class SomeComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
prop1: 1,
prop2: 2
};
setTimeout(this.changeProp1.bind(this), 100);
}
componentDidUpdate() {
console.info("componentDidUpdate called");
}
changeProp1() {
this.setState({ prop1: 2 });
this.changeProp2();
}
changeProp2() {
this.setState({ prop2: 3 });
}
render() {
const { prop1, prop2 } = this.state;
return React.createElement('div', null, `prop1: ${prop1}, prop2: ${prop2}`);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(React.createElement(SomeComponent), rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
如果您运行它并检查控制台,您将看到它componentDidUpdate
被调用了两次,但不应该setStates
只累积和更新一次组件吗?
更新:我认为我的困惑来自ReactJS 网站上的状态更新可能是异步部分中的这句话:
React 可以将多个 setState() 调用批处理为单个更新以提高性能。