我试图将我的个人资料状态转换为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
}
}
答案 0 :(得分:1)
有一些更正:
登录为asynchronous action
。用户redux-thunk
或redux-saga
用于调度异步操作。
考虑到以上几点,登录操作的正确签名。
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并检查状态以决定是否导航。