Как этот синтаксис деактивации состояния обновления массива вact.js - PullRequest
0 голосов
/ 01 мая 2019

Я просматривал кодact.js, где столкнулся с деструктуризацией синтаксиса массива, который действительно сбивал с толку.

Я прокомментировал пост автора, но ответа не получил.

case Actions.AC_UPDATE_TASK:
  item = action.payload.item;
  props = action.payload.props;
  item.start = props.start ? props.start : item.start;
  item.end = props.end ? props.end : item.end;
  item.name = props.name ? props.name : item.name;
  return {
    data: [...state.data],
    links: [...state.links],
    selectedItem: state.selectedItem
  };

Здесь элемент и реквизит поступают в качестве параметра, элемент присутствует там в массиве данных. После манипулирования элементом из реквизита этот элемент необходимо обновить в массиве данных, но здесь он не обновляется в массиве данных после манипулирования им. Но после деструктурирования синтаксиса я вижу обновленный элемент в массиве данных. Как это возможно?

1 Ответ

0 голосов
/ 01 мая 2019

Это не эффект, связанный с реакцией или разрушением - это просто результат прямых мутаций.

В этом месте вы копируете ссылку на объект:

item = action.payload.item;

Изменения / мутации выполняются не на локальной копии, а на переданном объекте (по ссылке).

Вероятно (99,99%) такая же ссылка используется в объекте / массиве state.data - таким образом, "теоретически локальная" мутация влияет на состояние "за сценой".

Это может выглядеть как нечитаемо, но в нем нет магии - javascript просто работает таким образом.

Если прямая мутация нежелательна - вы можете избежать такого побочного эффекта, используя одну из неизменных техник. В простейшем случае всегда оперируйте вновь созданным объектом и копируйте свойства (глубокое клонирование).

...