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

React接入Google Analytics时useLocation读location属性undefined报错如何解决

问题根因

useLocation 是 react-router-dom 提供的路由Hook,必须在BrowserRouter组件包裹的路由上下文内部调用。你当前的代码在App组件中先执行useGaTracker(),此时App还未渲染BrowserRouter,不存在路由上下文,因此调用useLocation时会抛出找不到location属性的错误。

解决方案

将useGaTracker的调用逻辑移到BrowserRouter内部的子组件中即可,修改后的App.js参考如下:

import React, { Suspense } from "react"
import { BrowserRouter, Switch, Route } from "react-router-dom"
import "./App.css"
import { Helmet } from "react-helmet"

import { AuthProvider } from "./context/AuthContext"

// custom components
import SideBar from "./components/layouts/SideBar"
import Navbar from "./components/layouts/Navbar"
import Footer from "./components/layouts/Footer"
import useGaTracker from "./hooks/useGaTracker"

// lazy loading components
const Dashboard = React.lazy(() => import("./components/dashboard/Dashboard"))

// 抽离内层业务组件,处于BrowserRouter路由上下文内部
const AppContent = () => {
  // 此处调用可以正常获取路由上下文
  useGaTracker()
  return (
    <AuthProvider>
      <div className="relative grid min-h-screen md:grid-cols-layout-tablet xl:grid-cols-layout-desktop grid-rows-layout-desktop md:gap-6">
        <Navbar />
        <SideBar />
        <Switch>
          <Suspense fallback={<div>Loading..</div>}>
            <Route exact path="/" component={Dashboard} />
          </Suspense>
        </Switch>
        <Feedback />
        <Footer />
      </div>
    </AuthProvider>
  )
}

const App = () => {
  return (
    <BrowserRouter>
      <Helmet>
        <title>CODINGSPACE - Learn by Building Web and Mobile Apps</title>
      </Helmet>
      <AppContent />
    </BrowserRouter>
  )
}

export default App

补充说明

如果你使用的是react-router-dom v6版本,还需要同步将Switch替换为Routes组件,调整Route的写法规则,否则会出现额外的兼容报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:45:01