Обновление динамически-вложенного редуктора - PullRequest
0 голосов
/ 21 января 2019

Возможно, этот вопрос задавался пару раз, но я еще не нашел своего решения.

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

const initial_state = {}

{
  year: {
      month: {
          day: {
              entry: entryValue
            }
        }
    }
}

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

return {
      ...state,
      [payload.date.year]: {
        ...state[payload.date.year],
        [payload.date.month]: {
          ...state[payload.date.year][payload.date.month],
          [payload.date.day]: payload.data   
        }
      }
    };

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

...state[payload.date.year][payload.date.month],

это выдаст ошибку, говорящую о том, что не может прочитать 1 (как, например, в январе) из неопределенного (поскольку нет года, т. Е. Это просто пустой объект, как в initial_state).

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

return {
      [payload.date.year]: { 
        [payload.date.month]: {
          [payload.date.day]: payload.data   
        }
      }
    };

Мой вопрос таков: есть ли способ написать редукторы так, чтобы вам не приходилось проверять наличие глубоких вложенных пар ключ-значение? Например, проверить, есть ли запись в данном году?

Более конкретно, есть ли способ сделать так, чтобы это не приводило к ошибке:

...state[payload.date.year][payload.date.month],

если payload.date.year не существует в штате?

1 Ответ

0 голосов
/ 21 января 2019

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

...(state[payload.date.year] || {})[payload.date.month]

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

...