这个错误提示表明你在使用 useDispatch
自定义钩子时,传递给 dispatch
的操作(action)不是一个纯对象。在 Redux 中,操作必须是纯对象,这意味着它们应该是一个普通的 JavaScript 对象,具有 type
属性,并且其他属性应该是不可变的。
如果你需要进行异步操作,你应该使用中间件来处理这些操作。Redux 提供了几个常用的中间件,如 redux-thunk
和 redux-saga
,来处理异步操作。
以下是使用 redux-thunk
中间件的示例:
redux-thunk
中间件:
npm install redux-th垛
redux-thunk
中间件:
import { createStore, applyMiddleware } from 'redux'; import thunk from 'redux-thunk'; import rootReducer from './reducers'; const store = createStore( rootReducer, applyMiddleware(thunk) );
useDispatch
自定义钩子:
import React from 'react'; import { useDispatch } from 'react-redux'; import { fetchData } from './actions'; const MyComponent = () => { const dispatch = useDispatch(); React.useEffect(() => { dispatch(fetchData()); }, [dispatch]); return ( <div> {/* 组件内容 */} </ +div> ); }; export default MyComponent;
dispatch
函数和异步操作。你可以使用 redux-mock-store
来模拟 Redux store 和 dispatch
函数。
import configureMockStore from 'redux-mock-store'; import thunk from 'redux-thunk'; import { fetchData } from './actions'; const middlewares = [thunk]; const mockStore = configureMockStore(middlewares); describe('fetchData action', () => { let store; beforeEach(() => { store = mockStore({}); }); it('should dispatch the correct actions', async () => { const expectedActions = [ { type: 'FETCH_DATA_REQUEST' }, { type: 'FETCH_DATA_SUCCESS', payload: { /* mock data */ } } ]; await store.dispatch(fetchData()); expect(store.getActions()).toEqual(expectedActions); }); });
通过使用 redux-thunk
中间件,你可以处理异步操作,并确保在测试中正确地模拟和验证这些操作。
领取专属 10元无门槛券
手把手带您无忧上云