React Redux Action Payload返回undefined

时间:2018-03-04 03:51:36

标签: reactjs redux redux-promise

我试图将我的个人资料状态转换为redux。表单和操作都正常工作,但当进入reducer时,action的有效负载是未定义的。很确定这是一个新手的错误,但我不能在我的生命中看到它。

我遵循Stephen Grider的udemy课程作为模板,并使用与登录相同的模式使用他的帖子部分。 redux-promise在中间件中正确连接。

package.json(部分)

"react": "^16.2.0",
"react-redux": "^5.0.7",
"redux": "^3.7.2",
"redux-form": "^7.2.3",
"redux-forms": "^1.0.0-3",
"redux-promise": "^0.5.3",

LoginComponent:

function mapStateToProps(state){
  return {
    profile:state.profile
  };
}

export default reduxForm({
  validate,
  form:'PostsNewForm'
})(
  connect(mapStateToProps,{login})(Login)
);

操作简档

export const profileActions = {
    login:'uaLogin',
    logout:'uaLogout',
    register:'uaRegister',
    getAll:'uaGetAll',
    getOne:'uaGetOne',
    delete: 'uaDelete'
};

const pa=profileActions;

export function login(values, callback){
  const request=axios.post(`/api/authenticate`,values)
    .then ((res)=> {
      console.log ('*** action:',res.data);//res.data  correctly appears
      callback()
    });
  return {
    type: pa.login,
    payload:request
  }
}

减速轮廓

import {profileActions as pa} from '../actions';

let profile = JSON.parse(localStorage.getItem('profile'));
const initialState = profile ? { loggedIn: true, profile } : {};

export default function authentication(state = initialState, action) {
  switch (action.type) {
    case pa.login:
      console.log('***reducer',action.payload.data);//action.payload is undefined
      return {
        action.payload.data 
      };
    default:
      return state
  }
}

2 个答案:

答案 0 :(得分:1)

有一些更正:

  1. 登录为asynchronous action。用户redux-thunkredux-saga用于调度异步操作。

  2. 考虑到以上几点,登录操作的正确签名。

  3. export function login(values, callback) { return function (dispatch) { const request = axios.post( / API /认证, values) .then((res) => { console.log('*** action:', res.data);//res.data correctly appears callback(); //dispatch anothe action inside the async action.
    dispatch({ type: pa.login, payload: res.data }); }); } }

答案 1 :(得分:1)

发生错误,因为.then语句直接附加到const请求。这是解决承诺和更改未定义的请求。

更改此内容:

const request=axios.post(`/api/authenticate`,values)
  .then ((res)=> {
  console.log ('*** action:',res.data);//res.data  correctly appears
  callback()
});

至此:

const request=axios.post(`/api/authenticate`,values);

第二个问题是我试图通过后备执行表单中的操作并忘记react和redux范例;在这种情况下不需要回调。

相反,我应该查看componentDidMount或者可能是componentWillMount并检查状态以决定是否导航。