【问题标题】:How do I get my reducer to update one property of an object in state?如何让我的减速器更新状态对象的一个​​属性?
【发布时间】:2018-07-17 01:37:15
【问题描述】:

例如,在道具中,我有一个名为“用户”的对象,它被设置为:

user = { id: 1, 
         name: jim, 
         email: jim@gmail.com, 
         entries: 4,
         joined: 07-16-2018
       }

我想让 UPDATE_USER_ENTRIES 操作仅使用有效负载向 user.entries 发送更新

我目前的减速器功能是这样的:

export const loadUserData = (state = initialStateUser, action = {}) => {
    switch(action.type) {
        case LOAD_USER:
            return Object.assign({}, state, { 
                user: { 
                    id: action.payload.id, 
                    name: action.payload.name, 
                    email: action.payload.email, 
                    entries: action.payload.entries, 
                    joined: action.payload.joined 
                }
            });
        case UPDATE_USER_ENTRIES:
            return {...state, **// NEED HELP HERE** };
        default:
            return state;
    }
}

为了返回一个只更新了条目属性的新用户对象,编写返回的正确方法是什么?谢谢!

【问题讨论】:

    标签: javascript reactjs redux react-redux


    【解决方案1】:

    您可以像这样使用扩展运算符:

    如果你的状态是这样的:

    state = {
         foo: "bar",
         user: {
             id: 1, 
             name: "jim", 
             email: "jim@gmail.com", 
             entries: 4,
             joined: "07-16-2018",
        }
    }
    

    下面的代码,传播状态,不要碰foo,传播状态的user,更新entries属性。

    case UPDATE_USER_ENTRIES:
        return {...state, user: {...state.user, entries: action.payload } };
    

    如果您的状态如下所示:

    user: {
             id: 1, 
             name: "jim", 
             email: "jim@gmail.com", 
             entries: 4,
             joined: "07-16-2018",
        }
    

    上面的代码传播状态,只有user,然后更新entries属性。

    case UPDATE_USER_ENTRIES:
        return {...state, entries: action.payload };
    

    您的有效负载仅包含一个值:userEntries,因此它仅等于 userEntries。所以在你的reducer中你需要按照这个来使用它:action.payload你的payload不是一个拥有userEntries值的对象。

    【讨论】:

    • 那么如果我的状态不仅仅是'user',我应该使用第一种方法吗?
    • 我尝试了第一种方法,除了返回未定义的条目外,一切都返回正常。请帮忙
    • 我已经编辑了我的答案。实际上,如果您的结构类似于两个示例,这应该可以工作。你的状态结构如何?
    • 您将初始状态设置为`initialStateUser,。这就是为什么我首先认为您只是将用户保持在此 reducer 状态。
    • 啊,是的,initialStateUser 只是“用户”的初始值。我仍然无法使用您的第一种方法正确更新状态。我的 console.log() 检查有效负载是正确的,但用户对象中的条目属性一直未定义。我不确定如何进一步调试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多