[英]Uncaught Error: useLocation() may be used only in the context of a <Router> component
[英]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.