Spread omit не пропускает свойство в обработчике действия - PullRequest
1 голос
/ 05 апреля 2020

Я чувствую, что схожу с ума, следующий код просто не работает, когда используется в редукторе, однако запуск его с точно такими же переменными в консоли или на игровой площадке работает абсолютно идеально.

[MutationTypes.DELETE_GOALS_SUCCESS]: (state, { payload }) => {
  //payload is {deleted_goals: [1, 2, 3]}, goals is {1: {...}, 2: {...}, ... n: {...}}
  const goals = { ...state.goals };
  const newGoals = payload.deleted_goals.reduce((acc, id) => {
    const { [id]: omitted, ...newAcc } = acc; //newAcc still contains "id" key
    console.log(
      "After spread",
      "New goals:",
      newAcc,
      "Old goals:",
      acc, //acc and newAcc are the same aside from different pointers
      "Removed goal",
      omitted,
    );
    return newAcc;
  }, goals);
  return {
    ...state,
    goals: newGoals,
  };
},

Часть const { [id]: omitted, ...newAcc } = acc; - это то, что просто не работает, как задумано. newA cc по какой-то причине все еще содержит ключ id, поэтому он остается неизменным при каждой итерации. Ключ id включен в объект целей, я могу войти в объект omitted. Как я уже сказал, я могу запустить точно такую ​​же строку кода в любом месте с точно такими же переменными, и это будет отлично работать. Это может быть что-то с редуксом или моей реализацией редуктора, однако я просто не могу представить, что может быть не так и как это может вызвать такие последствия. State - это просто объект, state.goal - это просто объект, я даже делаю его мелкую копию. Я могу JSON.stringify их скопировать вставить куда-нибудь еще, а затем опустить то же самое, что и здесь, и это будет работать. Есть идеи, что может вызвать это странное взаимодействие? Есть несколько обходных путей, чтобы сделать это без распространения, например, используя оператор удаления или создание нового объекта с нуля, но я хочу знать, почему ад может стать «невосприимчивым» к распространению деструктуризации.

Я пытался пропустите с расширением на fre sh объект внутри обработчика действия и уменьшите обратный вызов, и это сработало, похоже, что-то есть с этим конкретным объектом (state.goals). Однако это просто карта, подобная объекту, структурированному так: {id1: {goalwithid}, id2:{goalwithid2} ...} id1, id2 et c - это числа.

Только что попробовал глубоко клонировать объект (заменил const goals = { ...state.goals }; на const goals = _.cloneDeep(state.goals), и это ничего не меняет .

1 Ответ

1 голос
/ 05 апреля 2020

Почему бы просто не сделать это:

[MutationTypes.DELETE_GOALS_SUCCESS]: (state, { payload }) => {
  //payload is {deleted_goals: [1, 2, 3]}, goals is {1: {...}, 2: {...}, ... n: {...}}
  const goals = state.goals;
  const newGoals = Object.keys(goals).reduce((acc, key) => {
    if(payload.deleted_goals.includes(parseInt(key))) {
      return acc;
    } else {
      return (acc[key] = goals[key], acc);
    }
  }, {})

  return {
    ...state,
    goals: newGoals,
  };
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...