Подтвердить что ты не робот

Redux - Как добавить запись в массив в редукторе

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

state = {
  entryId: {
    entryName: ["something", "something2", "something3" /* and so on... */]
  }
};

Пока это самое близкое, я получаю, но вместо добавления новой уникальной записи он заменяет тот, который уже сохранен. Также мне нужно иметь возможность добавить этот элемент в пустое состояние, где entryId, entryName еще не существует, чтобы избежать ошибки:

switch(type) {
  case ADD_ENTRY:
    return {
      ...state,
      [entryId]: {
        ...state[entryId],
        [entryName]: {
          [uniqueEntry]: true
        }
      }
    };
}

Любая идея, что я делаю неправильно?

4b9b3361

Ответ 1

Если вы пытаетесь добавить элемент в конец массива entryName, который вы должны делать:

return {
  ...state,
  [entryId]: {
    ...state[entryId],
    [entryName]: [
      ...state[entryId][entryName],
      uniqueEntry
    ]
  }
};

Распространение ES6 с массивами работает следующим образом:

const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
const eight = 8;

const newArray = ['stuff', ...array1, 'things', ...array2, ...[7, eight], 9];
console.log(newArray); // ["stuff", 1, 2, 3, "things", 4, 5, 6, 7, 8, 9]

Отметьте этот смысл, в котором есть пример чего-то очень похожего на то, что вы делаете.

Я нашел этот набор примеров чрезвычайно полезным. Здесь много хорошего:

https://github.com/sebmarkbage/ecmascript-rest-spread

Обновление:

Если entryName инициализируется на undefined, как вы говорите в своем комментарии, вы можете сделать это:

return {
  ...state,
  [entryId]: {
    ...state[entryId],
    [entryName]: [
      ...state[entryId][entryName] || [],
      uniqueEntry
    ]
  }
};

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