我正在学习React课程,当时讲师正在解释有关更新状态的信息,但我无法理解这两个片段在内部的真正区别,请参见下面的代码笔链接:
class Counters extends Component {
state = {
counters: [
{ id: 1, value: 4 },
{ id: 2, value: 0 },
{ id: 3, value: 0 },
{ id: 4, value: 0 }
]
};
handleIncrement = counter => {
const updatedCounters = [...this.state.counters];
updatedCounters[0].value++;
};
}
class Counters extends Component {
state = {
counters: [
{ id: 1, value: 4 },
{ id: 2, value: 0 },
{ id: 3, value: 0 },
{ id: 4, value: 0 }
]
};
handleIncrement = counter => {
const updatedCounters = [...this.state.counters];
const index = updatedCounters.indexOf(counter);
updatedCounters[index] = {...counter};
updatedCounters[index].value++;
this.setState({ counters: updatedCounters });
};
}
在本讲座中,讲师解释说第一个代码片段确实会直接更新状态。所以我的问题是,如果第一个示例(如讲师所述)直接更新状态,那么阻止第二个代码段直接更新状态的唯一事情就是下面的代码行:
updatedCounters[index] = {...counter};
如果是这样,它将如何运作?
在第一个示例中,updatedCounters
是的副本this.state.counters
,但是该副本内的项目是对原始对象中完全相同的对象的引用。这可能类似于将一些书移到新盒子中。容器已更改,但内容没有更改。在第二个示例中,您不更改选定的计数器,而是先复制计数器,然后再更改该副本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句