在阅读了关于不变性的here之后,我试图了解反应是如何工作的。我试图在以下 3 个组件的帮助下理解,但它没有意义。
const bla = {a: 1};
class Test extends React.Component {
constructor(props) {
super(props);
this.state = {
a: 1,
};
this.onClick = () => this.setState(prevState => ({
a: prevState.a + 1
}));
}
render() {
console.log('Render default');
return <div id="test" onClick = {
this.onClick
} > DOM Updating: {
this.state.a
} < /div>;
}
}
class Test1 extends React.Component {
constructor(props) {
super(props);
this.state = {
a: 1,
};
this.onClick = () => this.setState(prevState => ({
a: 1
}));
}
render() {
console.log('Render 1');
return <div id="test1" onClick = {
this.onClick
} > DOM not updating: {
this.state.a
} < /div>;
}
}
class Test2 extends React.Component {
constructor(props) {
super(props);
this.state = bla;
this.onClick = () => {
const mutating = this.state;
mutating.a = this.state.a + 1;
this.setState(mutating);
};
}
render() {
console.log('Render 2');
return <div id="test2" onClick = {
this.onClick
} > DOM updating with mutation: {
this.state.a
} < /div>;
}
}
ReactDOM.render( < div > < Test / > < Test1 / > < Test2 / > < /div>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
如果我检查 div id="test1" 它会在每次点击时在 Chrome 开发工具中更新。想了解以下几点:
- 在点击期间如果我检查 div id="text1" 为什么这没有反映在开发工具中?在这里,我在每次点击 ({a: 1}) 时都在状态下分配新对象。正如上面的链接所说
事实上,React.js 不需要知道到底发生了什么变化。它只需要知道状态是否发生了变化。
- 但是,在 Test2 组件中,我正在改变状态,为什么单击时会更新 dom?
- 在更新嵌套状态的情况下,因为我们正在更新父状态,这是否意味着 React 会认为所有其他子级都更改了它们的值,并且即使它们没有更改也会重新渲染它们?