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

在TS文件中使用Redux Toolkit报错:TypeError: Cannot read properties of null (reading 'useContext')

Redux Toolkit中useDispatch报错"Cannot read properties of null (reading 'useContext')"的排查与解决

错误原因

这个错误的核心是违反了React Hooks的使用规则:useDispatch作为React Hooks,必须在React函数组件的顶层作用域或自定义Hooks中调用,不能在以下场景使用:

  • 文件顶层作用域直接调用
  • 普通工具函数(非组件、非自定义Hooks)内部调用
  • 服务端渲染(如Next.js的getServerSideProps/getStaticProps)的服务端逻辑中调用

当useDispatch在上述非法场景执行时,React无法找到Redux Provider提供的上下文,导致底层依赖的useContext函数读取到null,进而抛出该错误。

解决方法

根据不同代码场景,对应不同修复方式:

场景1:在组件外部直接调用useDispatch

将useDispatch和dispatch调用移到React函数组件的顶层作用域内:

// 正确示例:在React组件内部使用useDispatch
import { useDispatch } from "react-redux";
import { actionFromSlice } from "../../actionss.ts";

export default function MyComponent() {
  // 必须在组件顶层调用useDispatch
  const dispatch = useDispatch();

  const triggerAction = () => {
    dispatch(actionFromSlice('a'));
  };

  return (
    <button onClick={triggerAction}>触发Redux动作</button>
  );
}

场景2:在工具函数中需要使用dispatch

不要在工具函数内调用useDispatch,改为通过参数传入dispatch的方式:

// 工具函数文件 utils.ts
import { actionFromSlice } from "../../actionss.ts";
import type { Dispatch } from "@reduxjs/toolkit";

// 接收dispatch作为参数
export function executeAction(dispatch: Dispatch) {
  dispatch(actionFromSlice('a'));
}
// React组件中调用工具函数
import { useDispatch } from "react-redux";
import { executeAction } from "./utils.ts";

export default function MyComponent() {
  const dispatch = useDispatch();

  const handleClick = () => {
    executeAction(dispatch);
  };

  return <button onClick={handleClick}>执行动作</button>;
}

场景3:Next.js服务端渲染场景

如果是在Next.js的服务端函数(如getServerSideProps)中需要触发Redux逻辑,不要使用React Hooks,直接创建Redux store实例并调用dispatch:

// Next.js页面文件
import { store } from "../store"; // 导入你的Redux store实例
import { actionFromSlice } from "../../actionss.ts";

export async function getServerSideProps() {
  // 直接使用store的dispatch方法
  store.dispatch(actionFromSlice('a'));

  return { props: {} };
}

export default function MyPage() {
  // 组件内正常使用useDispatch
  const dispatch = useDispatch();
  return <div>页面内容</div>;
}

内容的提问来源于stack exchange,提问作者Siri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:35:23