Обновление избыточного состояния - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь сделать мои редукционные редукторы более простыми при обновлении состояния.Например, ниже приведен редуктор:

const initialState = {
  emails: {
    id: {
      emailAddress: null,
      emailBody: null,
      emailSubject: null,
    },
  },
  calls: {},
};

function messaging(state = initialState, action) {
  switch (action.type) {
    case actionTypes.SET_EMAIL_ADDRESS:
      return {
        ...state,
        emails: {
          ...state.emails,
          [action.id]: {
            emailAddress: [action.emailAddress]
          },
        },
      };
    default:
      return state;
  }
}

export default messaging;

Вместо этого я попытался написать редуктор, но webstorm жалуется, что это неправильная запись.Что я делаю неправильно?Кроме того, любые предложения о том, как обновить состояние более чистым способом, с благодарностью.Спасибо!

case actionTypes.SET_EMAIL_ADDRESS:
  return {
    ...state,
    emails[action.id]: {
      ...state.emails[action.id],
      emailAddress: [action.emailAddress]
    },
  };

Ответы [ 3 ]

0 голосов
/ 07 октября 2018

Исходя из вашего начального состояния

И чтобы избежать переопределения существующих значений для emailBody и emailSubject.

Я бы переписал так:

case actionTypes.SET_EMAIL_ADDRESS:
    const currentEmails = state.emails;
    const emailId = action.id;
    const emailAddress = action.emailAddress;

    const email = { ...currentEmails[emailId], emailAddress };
    const emails = { ...currentEmails, [emailId]: email };
    return { ...state, emails };

Всегда полезно использовать описательные имена!

0 голосов
/ 07 октября 2018

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

import produce from "immer";

function messaging(state = initialState, action) {
  switch (action.type) {
    case actionTypes.SET_EMAIL_ADDRESS:
      return produce(state, draft => {
        draft.emails[action.id] = { emailAddress: [action.emailAddress] };
      });
    default:
      return state;
  }
}
0 голосов
/ 06 октября 2018

Вам необходимо заключить динамический ключ в квадратные скобки.

case actionTypes.SET_EMAIL_ADDRESS:
  return {
    ...state,
    [state.emails[action.id]]: {
      ...state.emails[action.id],
      emailAddress: [action.emailAddress]
    },
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...