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

使用React Router的useLocation钩子时报错useContext未定义如何解决?

错误原因

useLocation 是React Router提供的内置钩子,底层依赖Router组件传递的上下文数据,必须在<Router>组件包裹的子组件作用域内调用。
你当前在App组件的顶层直接调用useLocation,但<Router>是在App组件的返回内容中才渲染的,调用位置处于Router的上下文覆盖范围之外,因此无法获取到对应的context值,触发useContext is undefined报错。

修复方案

有两种常用的修复方式,按需选择即可:

方案1:将useLocation调用移到Router内部的子组件

如果不需要在App顶层获取路由信息,直接把useLocation的调用逻辑放到被Router包裹的子组件内即可,示例修改后代码如下:

import React from 'react';
import Welcome from './Components/Welcome/Welcome';
import {
    BrowserRouter as Router,
    Link,
    Route,
    Switch,
    Redirect,
    useLocation,
} from 'react-router-dom'
import app from "./firebase"

const  App = () => {
  return (
    <div className="App">
      <Router>
          <Route path = "/welcome">
            <Welcome  />
          </Route>
          <Route path="/ui">
            <UI/>
          </Route>
      </Router>
    </div>
  );
}

const UI = () => {
  // 在Router内部的子组件调用useLocation,可正常执行
  let location = useLocation()
  console.log('当前路由信息:', location)
  return(
    <h1>UI i am</h1>
  )
}

export default App;

方案2:将Router提升到App组件外层

如果确实需要在App组件顶层获取路由信息,就把<Router>标签从App组件中移到入口文件(通常是index.js)里包裹App组件,这样App整体都处于Router的上下文范围内,就可以正常调用useLocation了。

入口文件index.js修改示例:

import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter as Router } from 'react-router-dom';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <Router>
    <App />
  </Router>
);

App组件对应修改:

删除App组件内的<Router>标签,直接调用useLocation即可:

import React from 'react';
import Welcome from './Components/Welcome/Welcome';
import {
    Link,
    Route,
    Switch,
    Redirect,
    useLocation,
} from 'react-router-dom'
import app from "./firebase"

const  App = () => {
  // 此时App已经被外层的Router包裹,可正常调用
  let location = useLocation()
  console.log('当前路由信息:', location)

  return (
    <div className="App">
        <Route path = "/welcome">
          <Welcome  />
        </Route>
        <Route path="/ui">
          <UI/>
        </Route>
    </div>
  );
}

const UI = () => {
  return(
    <h1>UI i am</h1>
  )
}

export default App;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:36:01