如何让我的减速器更新状态中对象的一个​​属性?

kay*_*ayq 3 javascript reactjs redux react-redux

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

user = { id: 1, 
         name: jim, 
         email: jim@gmail.com, 
         entries: 4,
         joined: 07-16-2018
       }
Run Code Online (Sandbox Code Playgroud)

我想让 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

dev*_*kan 8

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

如果你的状态是这样的:

state = {
     foo: "bar",
     user: {
         id: 1, 
         name: "jim", 
         email: "jim@gmail.com", 
         entries: 4,
         joined: "07-16-2018",
    }
}
Run Code Online (Sandbox Code Playgroud)

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

case UPDATE_USER_ENTRIES:
    return {...state, user: {...state.user, entries: action.payload } };
Run Code Online (Sandbox Code Playgroud)

如果您的状态如下所示:

user: {
         id: 1, 
         name: "jim", 
         email: "jim@gmail.com", 
         entries: 4,
         joined: "07-16-2018",
    }
Run Code Online (Sandbox Code Playgroud)

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

case UPDATE_USER_ENTRIES:
    return {...state, entries: action.payload };
Run Code Online (Sandbox Code Playgroud)

您的有效负载仅包含一个值:userEntries因此它仅等于 userEntries。因此,在您的减速器中,您需要根据以下内容使用它:action.payload您的有效负载不是一个包含userEntries值的对象。