React js:错误:useLocation() 只能在 <Router> 组件的上下文中使用

Kev*_*ump 46 javascript reactjs react-router-dom

我使用React Router v6,每次我在主文件中使用初始化进行身份验证时,都会显示此错误。我在互联网上找不到解决方案。我只想在有用户时渲染一些路线,但现在它不渲染任何内容。

认证导航器

import React, { useState, useEffect } from 'react';
import app from './firebase';
import { Router, Routes, Route } from 'react-router-dom';

import AuthStack from './stacks/AuthStack';
import AppStack from './stacks/AppStack';
import StaticStack from './stacks/StaticStack';

function AuthNavigator() {
  const [initializing, setInitializing] = useState(true);
  const [user, setUser] = useState(() => app.auth().currentUser);

  useEffect(() => {
    const unsubscribe = app.auth().onAuthStateChanged((user) => {
      if (user) {
        setUser(user);
      } else {
        setUser(null);
      }
      if (initializing) {
        setInitializing(false);
      }
    });

    // cleanup subscription
    return unsubscribe;
  }, []);

  if (initializing) return 'Loading....';

  return (
    <Router>
      <Routes>
        <Route path="*" element={<StaticStack />} />
        <Route path="auth/*" element={<AuthStack user={user} />} />
        <Route path="app/*" element={<AppStack user={user} />} />
      </Routes>
    </Router>
  );
}
export default AuthNavigator;
Run Code Online (Sandbox Code Playgroud)

应用程序.js

import React from 'react';
import './App.css';
import AuthNavigator from './AuthNavigator';
import { Router } from 'react-router-dom';

function App() {
  return (
    <Router>
      <AuthNavigator />
    </Router>
  );
}

export default App;
Run Code Online (Sandbox Code Playgroud)

小智 35

我遇到过同样的问题。我的问题是由于以下原因。我有一个Header组件,其中包含NavLink,它是一个路由器组件。我将此Header组件放置在App组件内。我的应用程序组件是这样的:

function App() {
  return(
      <Header/>
      <Router>
        <Routes>
          <Route path="/" element={<Homepage/>}/>
          <Route path="/shop" element={<Shop/>}/>
          <Route path="/signin" element={<Signin/>}/>
        </Routes>
      </Router>
  )
}
Run Code Online (Sandbox Code Playgroud)

在上面的 App 组件中,我将 Header 组件放置在 Router 之外。由于在Header组件中我使用了NavLink,它是一个 Router 组件,导致了此错误。然后我将Header组件移动到 Router 组件中,然后它工作正常。最后我的代码如下所示:

function App() {
  return(
      <Router>
        <Header/>
        <Routes>
          <Route path="/" element={<Homepage/>}/>
          <Route path="/shop" element={<Shop/>}/>
          <Route path="/signin" element={<Signin/>}/>
        </Routes>
      </Router>
  )
}
Run Code Online (Sandbox Code Playgroud)


tit*_*300 30

已经封装在路由器中了吗?

如果您的组件已经包装在 Router 中。确保您是useLocation从而react-router-dom不是导入react-router。这对我有用。


小智 22

确保您的应用程序组件是这样index.js包装的BrowserRouter

const app = (
  <Provider store={store}>
      <BrowserRouter>
          <App />
      </BrowserRouter>
  </Provider>
);
Run Code Online (Sandbox Code Playgroud)


小智 9

如果您在运行测试时遇到此问题,请不要忘记将 App 的导入也包装在 Router 中。我的粗略例子如下。

import { render, screen } from '@testing-library/react';
import { BrowserRouter } from 'react-router-dom';

import { App } from '../App';

test('renders Box', () => {
  render(
    <BrowserRouter>
      <App />
    </BrowserRouter>
  );
  const boxElement = screen.getByLabelText('box-outline');
  expect(boxElement).toBeInTheDocument();
});
Run Code Online (Sandbox Code Playgroud)


小智 6

我在测试中遇到了同样的错误。我正在测试的组件包含一个NavLink组件,并且我没有Router在测试中渲染 a 。用 . 包装我的有问题的组件后,此错误消失了BrowserRouter