代码之家  ›  专栏  ›  技术社区  ›  Jimmy

更新redux状态

  •  1
  • Jimmy  · 技术社区  · 7 年前

    我试图使我的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;
    

    case actionTypes.SET_EMAIL_ADDRESS:
      return {
        ...state,
        emails[action.id]: {
          ...state.emails[action.id],
          emailAddress: [action.emailAddress]
        },
      };
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   nshimiye    7 年前

    基于你的初始状态

    并避免重写的现有值 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 };
    

    用描述性的名字总是值得的!

        2
  •  1
  •   vahissan    7 年前

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

    case actionTypes.SET_EMAIL_ADDRESS:
      return {
        ...state,
        [state.emails[action.id]]: {
          ...state.emails[action.id],
          emailAddress: [action.emailAddress]
        },
      };
    
        3
  •  1
  •   lecstor    7 年前

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