Да, вы должны глубоко клонировать, если вы хотите избежать побочных эффектов.
В вашей функции:
function handleImageClick(index) {
props.setImages((prevState)=>{
const aux = Array.from(prevState);
aux[index].selected = !aux[index].selected;
return aux;
});
}
При использовании Array.from
вы получаете ссылки наобъекты сохранены, поэтому ваш prevState изменен.
См. это:
setTest(prevState => {
console.log("PrevState", prevState);
const b = Array.from(prevState);
b[0].a = b[0].a + 1;
return b;
});
Вы можете проверить это здесь:
https://codesandbox.io/embed/exciting-mcnulty-6spdh?fontsize=14
Вы будетеобратите внимание, что prevState имеет следующее значение, поэтому вы теряете значение prevState.
Представьте, что вы хотите сделать это в своем коде:
function handleImageClick(index) {
props.setImages((prevState)=>{
const aux = Array.from(prevState);
aux[index].selected = !aux[index].selected;
aux[index + 1].selected = prevState[index].selected;
return aux;
});
}
aux[index + 1].selected = prevState[index].selected;
не работает !!
Так что вам нужно глубоко копировать массив, чтобы избежать подобных вещей.
Вы можете сделать: const aux = JSON.parse(JSON.stringify(prevState));