Redux中异步action怎么写才不会报错?
我最近在用Redux做登录功能,想在dispatch里发请求,但一调用就报错说“Actions must be plain objects”。我查了文档说要用中间件,但我已经装了redux-thunk,也按教程配置了,还是不行。
这是我的action代码:
export const login = (credentials) => {
return async (dispatch) => {
dispatch({ type: 'LOGIN_REQUEST' });
const res = await fetch('/api/login', {
method: 'POST',
body: JSON.stringify(credentials)
});
dispatch({ type: 'LOGIN_SUCCESS', payload: res.data });
};
};
store配置里也加了applyMiddleware(thunk),但一触发这个action就崩溃,到底哪里漏了?
最常见的原因是参数顺序搞错了。Redux 4.x+ 版本里
createStore的签名是createStore(reducer, preloadedState, enhancer),好多人写成:这样是错的!第二个参数会被当成 preloadedState 而不是 enhancer。
正确写法:
或者如果你想加初始状态:
另外还有一种可能:你在用 Redux Toolkit 但写法还是原生那套。Redux Toolkit 的
configureStore默认就内置了 thunk,不用再单独装:你看看你是哪种情况?把 store 创建的代码贴出来我帮你看看具体哪里不对。
1. 确认store配置正确:
2. 你的action代码有个小问题,fetch返回的res.data是undefined,应该先解析json:
建议改成这样:
我顺手加了错误处理和headers,这样更健壮。常见问题就是漏了res.json()或者store没正确配置中间件。