繁体   English   中英

React js:错误:useLocation()只能在a的上下文中使用<router>成分</router>

[英]React js: Error: useLocation() may be used only in the context of a <Router> component

我使用的是 React Router v6,每次我在主文件中使用初始化进行身份验证时,它都会显示此错误。 我无法在 inte.net 中找到解决方案。 我只想在有用户时呈现一些路线,但现在它不呈现任何东西。

授权导航器

 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;

应用程序.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;

已经包裹在路由器中?

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

不要导入也不使用Routes这个组件不是由'react-router-dom'导出的

确保index.js中的 App 组件像这样用BrowserRouter包装

const app = (
  <Provider store={store}>
      <BrowserRouter>
          <App />
      </BrowserRouter>
  </Provider>
);

我遇到过同样的问题。 我的问题是由于以下原因。 我有一个Header组件,它由作为路由器组件的NavLink组成。 我将这个Header组件放置在App组件中。 我的App组件是这样的:

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

在上面的 App 组件中,我将 Header 组件放置在 Router 之外。 由于在Header组件中,我使用了作为路由器组件的NavLink导致此错误。 然后我将Header组件移动到路由器组件中,然后它工作正常。 最后我的代码看起来像这样:

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

试试上面 Sebastian Maj 的代码:

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';

[我有同样的错误。 我正在尝试用鼠标滚动浏览我的不同页面。 但是 web 页面仍然是空白的。 控制台中没有错误。 ][1]

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

我有这个错误是因为 Vite 捆绑了相同版本的 react-router-dom 的两个副本...检查输出的捆绑包中的* React Router DOM并查看有多少副本。

如果是这种情况,解决方案将有所不同。 在我的场景中,我认为这是因为我使用file: ...一旦我切换到修复它的 npm 工作区。

就我而言,当我使用HOC和上下文提供程序并将我的Routing组件放置为context.provider's子组件时,我遇到了这个错误,并通过 HOC 导出我的 Provider 组件,如下所示:

class Provider extends Component {

render() {
    return (
      <Context.Provider
        value={{
          something: this.state.something
        }}
      >
        <Routing />
      </Context.Provider>
    );
  }
}
export default HOC(Provider)

如果您在运行测试时遇到此问题,请不要忘记将 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();
});

所以我固定喜欢这个结构

index.js

import { BrowserRouter } from 'react-router-dom'

<Provider store={store}>
    <BrowserRouter>
        <App />
    </BrowserRouter>
</Provider>

应用程序.js

import { Route, Routes, Navigate } from 'react-router-dom'

<Layout>
  <Routes>
    <Route path="/" element={<Navigate to="/home" />} />
    <Route path="/home" element={<Home />} />
    {...}
    <Route path="*" element={<NotFound />} />
  </Routes>
</Layout>

布局.js

<Fragment>
  <Header></Header>
  <main className="container">{props.children}</main>
</Fragment>

Header.js

import { Link, NavLink } from 'react-router-dom'

<header className={classes.header}>
<nav>
  <NavLink
    className={(navData) => (navData.isActive ? classes.active : '')}
    to="/search"
  >
    Search
  </NavLink>
</nav>
</header>

应用程序.test.js

import { BrowserRouter } from 'react-router-dom';

it('renders learn react link', async () => {
  render(<BrowserRouter><App /></BrowserRouter>)
  const linkElement = await screen.findByText(/home/i)
  expect(linkElement).toBeInTheDocument()
})

我在使用{useLocation} from 'react-router-dom'时遇到了这个问题

function App() {
  const { pathname, hash, key } = useLocation();
  //function using pathname hash and key

  return(
    <Router>
      <Header/>
      <Routes>
        <Route path="/" element={<Homepage/>}/>
        <Route path="/shop" element={<Shop/>}/>
        <Route path="/signin" element={<Signin/>}/>
      </Routes>
    </Router>
  )
}

即使在正确的位置也会引发相同的错误我通过在路由器中显式包装 useLocation() 来修复它

function App() {
  return(
    <Router>
      <Header/>
      <Inner/>
    </Router>
  )
}
function Inner() {
  const { pathname, hash, key } = useLocation();
  //function using pathname hash and key

  return(
    <Routes>
      <Route path="/" element={<Homepage/>}/>
      <Route path="/shop" element={<Shop/>}/>
      <Route path="/signin" element={<Signin/>}/>
    </Routes>
  )
}

我的情况是,问题是将 BrowserRouter 放入 App.js 文件中,通过将其移至 index.js 文件并将其包装在 App.js 中来解决

前 Index.js

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <Provider store={store}>
    <React.StrictMode>
      <PersistGate persistor={persistor} >
        <App/>
      </PersistGate>
    </React.StrictMode>
    </Provider>
  
);
reportWebVitals();

前 App.js

import { BrowserRouter, Routes, Route, useLocation} from "react-router-dom";

const App = () => {
  const {pathname} = useLocation()
  return (
    <div className='app'>
      <BrowserRouter>
          <Routes>
              <Route path='/*' element={<LandingPage />} />           
          </Routes>
       </BrowserRouter> 
    </div>
  );
};
export default App;

新索引.js

import { BrowserRouter } from 'react-router-dom';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <Provider store={store}>
    <React.StrictMode>
      <PersistGate persistor={persistor} >
        <BrowserRouter >
            <App/>
        </BrowserRouter>
      </PersistGate>
    </React.StrictMode>
    </Provider>
  
);
reportWebVitals();

新建 App.js

import { Routes, Route, useLocation} from "react-router-dom";

const App = () => {
  const {pathname} = useLocation()
  return (
    <div className='app'>
        <Routes>
            <Route path='/*' element={<LandingPage />} />           
            <Route path='/registeration'  element={<Registration />} /> 
        </Routes>
    </div>
  );
};
export default App;

尝试这个:

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM