【问题标题】:How to update/delete value in object using redux如何使用 redux 更新/删除对象中的值
【发布时间】:2021-10-04 13:40:07
【问题描述】:

我正在开发一个用户填写表单(使用 redux-forms)并向状态添加名称和权重的应用程序。状态如下:

[
 {
  name: squat,
  weight: 100,
  id: 1
 }
]

我试图弄清楚如何让用户使用 redux-forms 更新权重值。现在,在填写更新表单后,我不断收到相同的状态返回。我可以看到表单记录了新值,但是当我执行我的操作时,我得到了旧值。 这是我的行动:

export const updateMovement = (id, newFormValues) => async dispatch => {
    const response = await movements.patch(`/movements/${id}`, newFormValues);
    const updateId = response.data.id;
    dispatch({ type: constants.UPDATE_MOVEMENT, payload: { data: response.data, id: updateId } });
};

我的减速机:

const initialState = [];

const movementReducer = (state = initialState, action) => {
    switch (action.type) {
        case CREATE_MOVEMENT: 
            return [
                ...state, action.payload
            ];
        case UPDATE_MOVEMENT:
             return [ ...state.map(item => item.id === action.payload.id ? {...item, movementWeight: action.payload.data.movementWeight} : item)];
        default:
            return state;
    }
};

知道我做错了什么吗?

【问题讨论】:

    标签: redux react-redux state action reducers


    【解决方案1】:
     case UPDATE_MOVEMENT:
        const clonedMovement = state;
        const movementIndexToUpdate = clonedMovement.findIndex(
          (item) => item.id === action.payload.id
        );
        const updatedMovement = {
          ...clonedMovement[movementIndexToUpdate],
          movementWeight: action.payload.data.movementWeight,
        };
        const updatedMovements = [...clonedMovement];
        updatedMovements[movementIndexToUpdate] = updatedMovement;
        return [...updatedMovements];
    
    

    【讨论】:

    • 感谢您的回复,但我仍然可以恢复原始状态。也许问题出在我的代码的另一部分。
    • 也许您可以尝试将初始状态设为const initialState = { movements :[] };,因为将初始状态保留为对象总是更好。
    猜你喜欢
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多