Reactjs 在另一个调度覆盖状态后立即调度

Reactjs 在另一个调度覆盖状态后立即调度,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我对React和React redux是新手,我在调度和更新状态方面遇到了很多麻烦 在服务器响应之后,如果用户经过身份验证,我将继续执行下面的操作 this.props.dispatch(addAuth(logged.user)); this.props.dispatch(updateAvatar(logged.user.avatar)) 但是,在我这样做之后,日志是 {type: "AUTHENTICATE", user: "cash"} //(LOGGING ACTION FROM RE

我对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: ƒ}

返回一个新对象而不指定所有属性,留下一些未定义的属性

如果要创建旧状态的副本并更改此新对象
对象,则应查找assign
。根据这一点,您的
身份验证
操作应减少:

return Object.assign({}, state, {
    isAuth: true,
    username: action.username
})
如果要复制其他未指定的值,则可以以相同的方式重写其他操作

来自以下方面的说明:

我们不会改变国家。我们使用
Object.assign()
创建一个副本。
Object.assign(状态,{visibilityFilter:action.filter})
错误:它将变异第一个参数。你必须提供一个空的 对象作为第一个参数。还可以启用对象排列 操作员建议改为写入
{…state,…newState}


addAuth
是如何工作的(例如,在中间件中对服务器的异步调用)?它的回报是什么?如何获取
avatarLink
?@OriDrori一旦安装了我的App.js组件,我就向服务器发出请求,查看是否有使用Passport.js的会话,并从数据库中获取该用户。所以,我获取用户,然后查询数据库中他们的配置文件图像,并将其返回到名为user的对象中。所以它应该是user={username:'cash',avatar:'example.jpg'},我只需将这些属性传递给不同的actionsHow您是否查询服务器(thunk、api中间件等)?@OriDrori使用Fetch api,我在后端使用Express和Mongoose,但如何从redux调用Fetch api?我的问题正是这个!非常感谢你!!我一直在绞尽脑汁redux@tkss很高兴我能帮忙。请选择其中一个答案作为正确答案。