react
runtime_error
ai_generated
true
TypeError: Cannot read properties of undefined (reading 'dispatch')
ID: react/usecontext-must-be-within-provider
92%Fix Rate
88%Confidence
1Evidence
2023-03-15First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| React 16.8+ | active | — | — | — |
| React 17 | active | — | — | — |
| React 18 | active | — | — | — |
| React 19 | active | — | — | — |
Root Cause
useContext is called outside the corresponding Context Provider, so the context value is undefined.
generic中文
useContext 在对应的 Context Provider 外部调用,导致上下文值为 undefined。
Official Documentation
https://react.dev/reference/react/useContextWorkarounds
-
95% success Ensure the component is rendered inside the corresponding Context Provider. For example, move the component inside the Provider tree: // App.jsx import { MyProvider } from './MyContext'; import ChildComponent from './ChildComponent'; function App() { return ( <MyProvider> <ChildComponent /> </MyProvider> ); } export default App;
Ensure the component is rendered inside the corresponding Context Provider. For example, move the component inside the Provider tree: // App.jsx import { MyProvider } from './MyContext'; import ChildComponent from './ChildComponent'; function App() { return ( <MyProvider> <ChildComponent /> </MyProvider> ); } export default App; -
85% success If the component must sometimes exist outside the Provider, provide a fallback default value in createContext: const MyContext = createContext({ dispatch: () => console.warn('dispatch called outside Provider') });
If the component must sometimes exist outside the Provider, provide a fallback default value in createContext: const MyContext = createContext({ dispatch: () => console.warn('dispatch called outside Provider') }); -
90% success Add a guard clause in the component to render nothing or a fallback UI when context is missing: function ChildComponent() { const context = useContext(MyContext); if (!context) return null; // or <FallbackUI /> const { dispatch } = context; // ... }
Add a guard clause in the component to render nothing or a fallback UI when context is missing: function ChildComponent() { const context = useContext(MyContext); if (!context) return null; // or <FallbackUI /> const { dispatch } = context; // ... }
中文步骤
Ensure the component is rendered inside the corresponding Context Provider. For example, move the component inside the Provider tree: // App.jsx import { MyProvider } from './MyContext'; import ChildComponent from './ChildComponent'; function App() { return ( <MyProvider> <ChildComponent /> </MyProvider> ); } export default App;If the component must sometimes exist outside the Provider, provide a fallback default value in createContext: const MyContext = createContext({ dispatch: () => console.warn('dispatch called outside Provider') });Add a guard clause in the component to render nothing or a fallback UI when context is missing: function ChildComponent() { const context = useContext(MyContext); if (!context) return null; // or <FallbackUI /> const { dispatch } = context; // ... }
Dead Ends
Common approaches that don't work:
-
60% fail
Maskes the error but does not solve the structural issue; dispatch will be a no-op if no Provider is present, leading to silent failures.
-
70% fail
Only works in tests or specific scenarios; in production, the real Provider is missing, so the mock may not provide the correct dispatch function.
-
50% fail
Prevents the error but dispatch becomes undefined, causing subsequent calls to fail with 'dispatch is not a function'.