我们在更新state时要将state视为不可变的,你不应该使用类似于 arr[0] = ‘bird’ 这样的方式来重新分配数组中的元素,也不应该使用会直接修改原始数组的方法,例如 push() 和 pop()。可以通过使用像 filter() 和 map()
这样不会直接修改原始值的方法,从原始数组生成一个新的数组。
其中数组展开运算符…还允许你把新添加的元素放在原始的 …artists 之前。如此,展开操作就可以完成 push() 和 unshift() 的工作,将新元素添加到数组的末尾和开头。
因此这里我们通过map来产生新的数组
setMyList(selectedId.map((item,id)=> {
if (id === toggledId) {
return !item;
} else {
return item;
}
}));
...
展开语法本质是是**“浅拷贝”——它只会复制一层**。这使得它的执行速度很快,但是也意味着当你想要更新一个嵌套属性时,你必须得多次使用展开语法。