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

声明useContext时报Invalid hook call无效Hook调用错误,如何排查解决?

问题原因

  1. 路由配置错误:你当前Route的children属性直接传入了Login组件的引用,而非渲染后的组件元素,这会导致Login被当作普通函数直接执行,不符合React组件的渲染流程,Hook自然无法在合法上下文调用。
  2. 缺少AuthProvider外层包裹:你创建的AuthContext没有对应的Provider包裹路由组件,就算修复路由问题,后续也无法正常获取Context值。

解决方案

第一步 修复路由写法

如果你使用的是react-router-dom v5版本,将Route部分改成以下两种写法任意一种即可:

  • 写法1:使用component属性
<Route path="/" component={Login} exact />
<ProtectedRoute path="/dashboard" component={Dashboard} exact />
  • 写法2:渲染组件元素传入children
<Route path="/" exact>
  <Login />
</Route>
<ProtectedRoute path="/dashboard" exact>
  <Dashboard />
</ProtectedRoute>

第二步 包裹AuthProvider

将整个路由结构放在AuthProvider的内层,确保所有子组件都能访问到Context值,修改后的Routes组件代码如下:

import { FC } from 'react'
import { BrowserRouter, Switch, Route } from 'react-router-dom'
import { Dashboard } from '../pages/Dashboard'
import { Login } from '../pages/Login'
import { ProtectedRoute } from './ProtectedRoute'
import { AuthProvider } from '../AuthContext' // 引入AuthProvider

export const Routes: FC = () => {
  return (
    <AuthProvider>
      <BrowserRouter>
        <Switch>
          <Route path="/" component={Login} exact />
          <ProtectedRoute path="/dashboard" component={Dashboard} exact />
        </Switch>
      </BrowserRouter>
    </AuthProvider>
  )
}

额外优化提示

你当前Login组件里的login触发dispatch时,payload没有传入真实的user和token值,和Reducer的逻辑不匹配,建议后续补充获取表单输入值的逻辑,传入正确的payload参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:12:02