我是React和react-redux的新手,在调度和更新状态方面遇到很多麻烦
在服务器响应之后,如果用户通过了身份验证,我将继续执行以下操作
this.props.dispatch(addAuth(logged.user));
this.props.dispatch(updateAvatar(logged.user.avatar))
但是,在我这样做之后,日志是
{type: "AUTHENTICATE", user: "cash"} //(LOGGING ACTION FROM REDUCER)
{isAuth: true, username: "cash", myAvatar: undefined, dispatch: ƒ}
{type: "UPDATE_AVATAR", updateAvatar: "http://www.example.com/1234.jpg"} //(LOGGING ACTION FROM REDUCER)
{isAuth: undefined, username: undefined, myAvatar: undefined, dispatch: ƒ}
这是初始状态
const intialState = {
isAuth: false,
username: '',
myAvatar: ''
};
动作
function addAuth(user){
return {
type: 'AUTHENTICATE',
user: user.username,
};
}
function updateAvatar(avatarLink){
return {
type: 'UPDATE_AVATAR',
updateAvatar: avatarLink
};
}
减速器
function reducer(state = intialState, action) {
switch(action.type){
case 'AUTHENTICATE':
return {
isAuth: true,
username: action.user,
};
case 'LOGOUT':
return {
isAuth: false
}
case 'UPDATE_AVATAR':
return {
myAvatar: action.updateAvatar
};
default:
return state;
}
}
我想要的结果是更新isAuth和用户名,然后像这样更新头像状态
{isAuth: true, username: "cash", myAvatar: undefined, dispatch: ƒ}
{isAuth: true, username: "cash", myAvatar: "http://www.example.com/1234.jpg", dispatch: ƒ}
答案 0 :(得分:1)
您将返回一个新对象,但未指定所有属性,而未定义所有属性。
如果要创建旧状态的副本并更改此新对象,Object.assign
应该是您要寻找的。根据{{3}},这应该是您的AUTHENTICATE
行动的简化剂:
return Object.assign({}, state, {
isAuth: true,
username: action.username
})
如果要复制其他未指定的值,则可以用相同的方式重写其他操作。
来自redux docs的便条:
我们不会改变状态。我们使用
Object.assign()
创建一个副本。Object.assign(state, { visibilityFilter: action.filter })
也是 错误:它将改变第一个参数。您必须提供一个空的 对象作为第一个参数。您还可以启用对象传播 操作员建议改写{ ...state, ...newState }
。