我目前正在使用react-router 6和Outlet创建私有路由。我有一个简单的设置如下:
App.js中的路由
return (
<BrowserRouter>
<div className="App">
<Routes>
<Route path="/" element={<Login />}></Route>
<Route path="/register" element={<Register />}></Route>
<Route element={<PrivateRoutes />}>
<Route path="/dashboard" element={<Dashboard />}></Route>
<Route path="/reports" element={<Reports />}></Route>
<Route path="/settings" element={<Settings />}></Route>
</Route>
</Routes>
</div>
</BrowserRouter>
);PrivateRoutes组件
const PrivateRoutes = () => {
console.log("Private Routes was run");
validToken = true;
return (
(checkToken()) ? <Outlet/> : <Navigate to="/" />
);
}不过,我注意到的是,PrivateRoutes组件在任何私有路由之间导航时都不会运行,只有在第一次进入PrivateRoutes时才会运行。
例如,当我使用主nav在/dashboard和/reports路由之间导航时,我希望/dashboard组件能够运行。
我尝试使用Link和useNavigate从react-router-dom导入,但是没有重新触发PrivateRoutes组件。
<div id='nav-links' className='flex flex-row'>
<div onClick={() => navigate('/dashboard')}>Dashboard</div>
<div onClick={() => navigate('/reports')}>Reports</div>
<div onClick={() => navigate('/settings')}>Settings</div>
</div>和
<div id='nav-links' className='flex flex-row'>
<Link to='/dashboard'>Dashboard</Link>
<Link to='/reports'>Reports</div>
<Link to='/settings'>Settings</div>
</div>我遗漏了什么或者不理解什么?是否有一个简单的语法调整可以使用,以便PrivateRoutes总是运行在导航上?
发布于 2022-08-07 00:08:45
你的路线很好。您将希望将checkToken耦合到路由更改中。您可以使用useLocation和useEffect挂钩侦听路由更改。我假设checkToken是同步的。
示例:
const PrivateRoutes = () => {
const { pathname } = useLocation();
const [isValidToken, setIsValidToken] = useState(); // <-- initially undefined
useEffect(() => {
// initial mount or route changed, check token
setIsValidToken(!!checkToken());
}, [pathname]);
if (isValidToken === undefined) {
return null; // or loading indicator/spinner/etc
}
return isValidToken ? <Outlet/> : <Navigate to="/" replace />;
}https://stackoverflow.com/questions/73263706
复制相似问题