【问题标题】:In Redux, how do I update only part of a state object?在 Redux 中,如何只更新状态对象的一部分?
【发布时间】:2018-05-07 16:49:19
【问题描述】:

我仍在思考 Redux,想知道我的部分更新状态对象的解决方案是否是最好的方法。

这是一个示例,在我的操作中,我有两个函数 - getA 和 getB,它们共享相同的状态,并且每个都只更新状态的一部分。然后我将现有状态传递给我的减速器。

// Action
export function getA() {
  return (dispatch, getState) => {
    const existing = getState().myReducer.myObj;
    dispatch({type: PENDING, existing})
    // ... Fetch data "A" from API
    // On success...
     dataA => dispatch({type: CASE_A, existing, dataA})
  }
};
export function getB() {
  return (dispatch, getState) => {
    const existing = getState().myReducer.myObj;

    // ... Fetch data "B" from API
    // On success...
    dataB => dispatch({type: CASE_B, existing, dataB})
  }
};

// Reducer
initialState = {
  ...
  myObj: {
    keyA: null,
    keyB: null
  }
};

export default function myReducer(state = initialState, action) {
  switch(action.type) {
    case PENDING:
      return {
        ...state,
        myObj: {
          ...action.existing
        }
      }
    case CASE_A:
      return {
        ...state,
        myObj: {
          ...action.existing
          keyA: action.dataA
        }
      }
    case CASE_B: 
      return {
        ...state,
        myObj: {
          ...action.existing
          keyB: action.dataB
        }
      }
    // ...
  }
};

一切正常,现有的 myObj 被传递到挂起状态,然后根据调用的操作更新 A 或 B。

我的问题是通过行动来承载现有状态的最佳方法?

【问题讨论】:

    标签: reactjs redux


    【解决方案1】:

    绝对不是你已经在state.myObj 和PENDING 中拥有existing state,你为什么要这样做

     myObj: {
         ...action.existing
     }
    

    如果你想替换整个对象,你可以这样做myObj = action.existing。

    export default function myReducer(state = initialState, action) {
        switch (action.type) {
            case PENDING:
                return {
                    ...state,
                    myObj: {
                        ...state.myObj
                    }
                }
            case CASE_A:
                return {
                    ...state,
                    myObj: {
                         ...state.myObj,
                        keyA: action.dataA
                    }
                }
            case CASE_B:
                return {
                    ...state,
                    myObj: {
                        ...state.myObj,
                        keyB: action.dataB
                    }
                }
    
        }
    };
    

    【讨论】:

    • 我明白了,那么传入 ...state.myObj 会保持更新状态吗?我的印象是每次都会传入 initialState 对象。
    • 是的,您可以看到您正在返回修改状态 (return),这意味着您将在下次更新状态。
    猜你喜欢
    • 2020-09-30
    • 2019-04-03
    • 2021-09-18
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多