更新Redux状态

时间:2018-10-06 20:20:09

标签: javascript ecmascript-6 redux

我正在尝试在更新状态时简化我的redux减少器。例如,下面是一个减速器:

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;

我尝试改为在下面编写reducer,但是webstorm抱怨这不是正确的表示法。我究竟做错了什么?同样,关于如何以更清洁的方式更新状态的任何建议也将受到赞赏。谢谢!

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

3 个答案:

答案 0 :(得分:1)

您需要将动态键括在方括号内。

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

答案 1 :(得分:1)

根据您的初始状态

并避免覆盖emailBodyemailSubject的现有值。

我会这样重写:

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 };

使用描述性名称总是值得的!

答案 2 :(得分:1)

当减速器需要更改为深层嵌套状态时,我已经开始使用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;
  }
}