Redux Toolkit报错:Uncaught TypeError: state.treatment未定义
Redux Toolkit错误排查:state.treatment is undefined
问题描述
集成Redux Toolkit时出现以下错误:Uncaught TypeError: state.treatment is undefined
错误触发点在组件使用useAppSelector的代码处:
import { useAppDispatch, useAppSelector } from '../reduxHooks'; import { setName } from '../store/treatmentSlice'; const TreatmentsGrid = () => { const patientName = useAppSelector((state) => state.treatment.patientName); // ERROR: Uncaught TypeError: state.treatment is undefined const dispatch = useAppDispatch();
已按照Redux Toolkit TypeScript文档完成配置,相关代码如下:
store.ts
import { configureStore } from '@reduxjs/toolkit'; import treatmentReducer from './treatmentSlice'; export const store = configureStore({ reducer: { treatment: treatmentReducer, }, }); // Infer the `RootState` and `AppDispatch` types from the store itself export type RootState = ReturnType<typeof store.getState> export type AppDispatch = typeof store.dispatch;
treatmentSlice.ts
import { createSlice } from '@reduxjs/toolkit'; import type { PayloadAction } from '@reduxjs/toolkit'; // Define a type for the slice state interface TreatmentState { patientName: string, } // Define the initial state using that type const initialState: TreatmentState = { patientName: 'User', }; export const treatmentSlice = createSlice({ name: 'treatment', initialState, reducers: { setName: (state, action: PayloadAction<string>) => { console.log(action.payload); // eslint-disable-next-line no-param-reassign state.patientName = action.payload; }, }, }); // Extract the action creators object and the reducer export const { setName } = treatmentSlice.actions; export default treatmentSlice.reducer;
reduxHooks.ts
import { useDispatch, useSelector } from 'react-redux'; import type { TypedUseSelectorHook } from 'react-redux'; import { AppDispatch, RootState } from './store/store'; // Use throughout your app instead of plain `useDispatch` and `useSelector` export const useAppDispatch: () => AppDispatch = useDispatch; export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;
index.tsx
import { store } from './store/store'; import { Provider } from 'react-redux'; const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement, ); root.render( <AuthContextProvider> <React.StrictMode> <Provider store={store}> <App /> </Provider> </React.StrictMode> </AuthContextProvider>, );
package.json
{ "name": "frontend", "version": "0.1.0", "private": true, "dependencies": { "@date-io/date-fns": "^2.15.0", "@emotion/react": "^11.10.4", "@emotion/styled": "^11.10.4", "@mui/icons-material": "^5.10.3", "@mui/material": "^5.10.3", "@mui/x-data-grid": "^5.17.0", "@mui/x-date-pickers": "^5.0.0", "@reduxjs/toolkit": "^1.8.5", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.3.0", "@testing-library/user-event": "^14.4.3", "@types/jest": "^29.0.0", "@types/node": "^18.7.14", "@types/react": "^18.0.18", "@types/react-data-grid": "^4.0.8", "@types/react-dom": "^18.0.6", "@types/react-router-dom": "^5.3.3", "axios": "^0.27.2", "date-fns": "^2.29.2", "filepond": "^4.30.4", "jwt-decode": "^3.1.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-filepond": "^7.1.2", "react-redux": "^8.0.2", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", "typescript": "^4.8.2", "web-vitals": "^3.0.1" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "extends": [ "react-app", "react-app/jest" ] }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] }, "devDependencies": { "@redux-devtools/core": "^3.13.1", "@typescript-eslint/eslint-plugin": "^5.36.1", "@typescript-eslint/parser": "^5.36.1", "eslint": "8.22.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-prefer-arrow": "^1.2.3", "eslint-plugin-react": "^7.31.2" } }
解决方案与排查步骤
1. 确认组件在Provider覆盖范围内
检查TreatmentsGrid组件是否属于<Provider store={store}>的子组件树。如果该组件是通过路由加载,或者嵌套在未被Provider包裹的组件中,会导致无法访问Redux store。可以临时在<App />中直接渲染TreatmentsGrid进行测试。
2. 检查Redux Hooks的导入路径
确认reduxHooks.ts中导入RootState和AppDispatch的路径是否正确。如果你的store.ts实际位于./store/index.ts而非./store/store.ts,需要修正导入路径为:
import { AppDispatch, RootState } from './store';
路径错误会导致类型推断失效,甚至运行时无法识别state结构。
3. 验证Reducer注册状态
在store.ts中添加日志,检查初始state是否包含treatment字段:
export const store = configureStore({ reducer: { treatment: treatmentReducer, }, }); // 打印初始state,确认treatment存在 console.log('Initial state:', store.getState());
如果输出中没有treatment,说明reducer未正确注册,检查treatmentReducer的导出和导入是否存在拼写错误。
4. 排除StrictMode影响
React StrictMode在开发环境会重复渲染组件,虽不直接导致该错误,但可以临时注释掉<React.StrictMode>并重启项目,测试是否解决问题。
5. 清除缓存并重启服务
- 重启React开发服务器(执行
npm start) - 清除浏览器缓存(Ctrl+Shift+R强制刷新)
- 若问题仍存在,删除
node_modules/.cache目录后重新启动
内容的提问来源于stack exchange,提问作者Anon957
相关产品推荐
相关产品推荐

