You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:51:28