React-Redux错误“操作必须是纯对象”通常发生在尝试分发(dispatch)一个非纯对象的action时。在Redux中,action是一个描述发生了什么的对象,它应该是一个纯对象,这意味着它的值仅由其属性值决定,并且不会在其生命周期内改变。
这个错误通常是因为以下原因之一:
确保你的action creator返回一个纯对象。例如:
// 正确的action creator
const increment = () => ({
type: 'INCREMENT'
});
对于异步操作,你应该使用中间件,如Redux Thunk或Redux Saga。这些中间件允许你在action creator中执行异步逻辑,并在异步操作完成后分发action。
首先,安装Redux Thunk:
npm install redux-thunk
然后在你的store配置中应用它:
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers';
const store = createStore(
rootReducer,
applyMiddleware(thunk)
);
现在你可以在action creator中执行异步操作:
// 异步action creator
const incrementAsync = () => {
return (dispatch) => {
setTimeout(() => {
dispatch({
type: 'INCREMENT'
});
}, 1000);
};
};
首先,安装Redux Saga:
npm install redux-saga
然后在你的store配置中应用它:
import { createStore, applyMiddleware } from 'redux';
import createSagaMiddleware from 'redux-saga';
import rootReducer from './reducers';
import rootSaga from './sagas';
const sagaMiddleware = createSagaMiddleware();
const store = createStore(
rootReducer,
applyMiddleware(sagaMiddleware)
);
sagaMiddleware.run(rootSaga);
创建一个saga来处理异步操作:
// sagas.js
import { takeEvery, put } from 'redux-saga/effects';
function* incrementAsync() {
yield setTimeout(() => {
yield put({ type: 'INCREMENT' });
}, 1000);
}
function* watchIncrementAsync() {
yield takeEvery('INCREMENT_ASYNC', incrementAsync);
}
export default function* rootSaga() {
yield watchIncrementAsync();
}
现在你可以在组件中分发异步action:
store.dispatch({ type: 'INCREMENT_ASYNC' });
通过这些方法,你可以修复“操作必须是纯对象”的错误,并正确处理异步操作。
没有搜到相关的沙龙
领取专属 10元无门槛券
手把手带您无忧上云