Оператор распространения { ...obj }
делает поверхностное копирование, что означает, что в данном случае он только дублирует структуру массива счетчиков, а не содержимое каждого элемента.
Значение адресов или ссылки counter[0]
иcounter[1]
дублируются, а не объекты, которые они держат. Таким образом, обновление counter[0].desc
также обновит свойство desc
в исходном объекте состояния.
Но обновление counter[0]
только обновляет дубликат и не влияет на оригинальную копию в объекте состояния.
Проверьте этот пост , чтобы лучше понять мелкую иглубокая копия.
Я также должен добавить, что вы всегда должны обновлять состояние реакции, используя this.setState, чтобы избежать неожиданных результатов.
Наконец, некоторые люди будут спорить об использовании вложенных свойств, потому что Reactне ориентирован на работу с вложенным состоянием. Может быть, это правильно или нет, но вот что я думаю:
Я бы посоветовал вам избегать использования вложенного состояния, если затем вы должны постараться сделать его максимально легким, потому что недостатком является то, что каждый крошечный фрагмент изменений воссоздаетродительский объект, который не подходит для производительности.