请问这种异步action如何写mapDispatchToProps

还是小白,问的问题如果太傻还请见谅
是这样的register是个异步action代码如下

// 异步请求注册action
export const register =(user)=>{
    return async dispatch => {
        // 发送异步ajax请求
        const response = await reqRegister({ username, password, type })
        const result = response.data 
        if (result.code === 0) {
        getMsgList(dispatch, result.data._id)
        // 分发成功的同步action
        dispatch(authSuccess(result.data)) 
        } else {
        //分发失败的同步action
        dispatch(errorMsg(result.msg))
    
        }
    }
}

注册组件中需要register这个action,为了代码统一想写成mapDispatchToProps的写法,但是一直报错,目前不会报错的代码如下

const mapStateToProps=(state)=>{
  return {
      user:state.user,
  }
}

export default  connect(mapStateToProps,{register})(Register)
  

希望路过的大佬能把register帮忙写成mapDispatchToProps的形式,不胜感激

阅读 2.6k
2 个回答

自己解决,提的这个问题其实是某篇博客的一种写法,之前没有直接传action的情况,都是通过mapDispatchToProps 突然愣了 脑子也蒙了,连最基础的写法也不记得了
回归本质
还是这么写

const mapStateToProps=(state)=>{
  return {
      user:state.user,
  }
}
const mapDispatchToProps=(dispatch)=>{
  return {
      register:(user)=>dispatch(register(user)),
  }
}
export default  connect(mapStateToProps,mapDispatchToProps)(Register)
  

此贴完结

感觉向 getMsgList 传递 dispatch有点套娃的意思了。
当然,不便要求你按照我的习惯把异步过程独立出来,我在你的基础上稍微改改试试,仅供参考:

const dipatchGetter = (dispatch) =>{
    return async (user) => {
        // 这里是我瞎猜的,因为原来的代码里没有体现
        // 这三个参数的来源,如果猜错的话请自行更正
        const { username, password, type } = user;
        
        // 发送异步 ajax 请求
        const response = await reqRegister({ username, password, type });
        const { data, msg } = response.data;
        if (result.code === 0) {
            getMsgList(dispatch, data._id);
            
            // '分发'已是过去式,直接调用就即可
            authSuccess(result.data);
        } else {
            errorMsg(result.msg);
        }
    }
};

const mapDispatchToProps = dispatch => {
    // dispatch 只能在 map 时获取
    const registerWithDispatch = dipatchGetter(dispatch);
    
    // 注意这里只暴露一个 register ,对于子组件而言,完全是黑箱子
    return {
        register: user => dispath(registerWithDispatch(user))
    }
};

写出来感觉怪怪的,怕是跑不起来,异步的事情还是交给异步中间件去做比较好。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题