【问题标题】:Uncaught TypeError: Cannot read properties of undefined (reading 'location')未捕获的类型错误:无法读取未定义的属性(读取“位置”)
【发布时间】:2021-11-21 06:36:05
【问题描述】:

我在从 useLocation() 挂钩访问位置时收到此错误消息。实际上我正在尝试将谷歌分析添加到我的反应应用程序中,但我收到了这个错误消息。 Uncaught TypeError: Cannot read properties of undefined (reading 'location')

使用GaTracker挂钩代码:

import { useEffect, useState } from "react"
import { useLocation } from "react-router-dom"
import ReactGA from "react-ga"

const useGaTracker = () => {
  const location = useLocation()
  const [initialized, setInitialized] = useState(false)
  console.log(location)

    useEffect(() => {
      if (!window.location.href.includes("localhost")) {
        ReactGA.initialize(process.env.REACT_APP_GOOGLE_ANALYTICS_KEY)
        setInitialized(true)
      }
    }, [])

    useEffect(() => {
      if (initialized) {
        ReactGA.pageview(location.pathname + location.search)
      }
    }, [initialized, location])
}

export default useGaTracker

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"))

const App = () => {
  useGaTracker()
  return (
    <BrowserRouter>
      <Helmet>
        <title>CODINGSPACE - Learn by Building Web and Mobile Apps</title>
      </Helmet>
      <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>
    </BrowserRouter>
  )
}

export default App

任何人都请帮我解决这个问题

【问题讨论】:

  • BrowserRouter 组件中使用这个钩子的唯一方法是在此之前。在您的情况下,它应该用于AppProvider

标签: reactjs google-analytics react-router-dom


【解决方案1】:

useGaTracker 钩子正在BrowserRouter 之外使用,因此在 ReactTree 中它上面没有路由上下文。

要解决,将路由器移动到渲染组件App,以便提供路由上下文。这可能是 index.js 文件。 (您通常也会在此处使用 AuthProvider 包装应用程序

例子:

... other imports ...
import { BrowserRouter as Router } from 'react-router-dom';
import { AuthProvider } from "./context/AuthContext"

const rootElement = document.getElementById("root");
ReactDOM.render(
  <StrictMode>
    <AuthProvider>
      <Router>
        <App />
      </Router>
    </AuthProvider>
  </StrictMode>,
  rootElement
);

...

const App = () => {
  useGaTracker(); // <-- has a routing context now!

  return (
    <>
      <Helmet>
        <title>CODINGSPACE - Learn by Building Web and Mobile Apps</title>
      </Helmet>
      <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 和路由器包装了 App 组件,它就可以工作了。
猜你喜欢
  • 1970-01-01
  • 2021-12-22
  • 2021-04-03
  • 2021-12-25
  • 2021-11-24
  • 2021-10-31
  • 2021-11-07
  • 2022-01-17
  • 2023-03-13
相关资源
最近更新 更多