[英]React Router Dom v6 render not redirecting
<Route
exact
path="/register"
element={<Register />}
render={() => !isAuthenticated ? <Register/> : <Navigate replace to="/login" />}
/>
好的,所以如果用户未通过身份验证并且“isAuthenticated”通常设置为 false,我想重定向到登录,但它不会重定向我。 没有记录一个错误。 我将<Navigate />
替换为console.log("something")
以查看从React-Router-Dom
导入的组件是否有问题,但“something”没有记录。 我都试过了还是不知道是什么问题。 谢谢
我认为您将element
和render
道具一起使用。 尝试删除element
isAuthenticated = false
默认情况下。 你要:
<Register/>
但是你放了!isAuthenticated
所以它是相反的:
<Register/>
为什么不: isAuthenticated? <Navigate replace to="/login" />: <Register/>
isAuthenticated? <Navigate replace to="/login" />: <Register/>
。
省得我头疼。
明确的属性
<Navigate replace to="/login" />
/*or replace={false} */ <Navigate replace={true} to="/login" />
您可以通过签入 Register 组件来解决这个问题。
const navigate = useNavigate(); useEffect(()=>{ if(isAuthenticated){ navigate('/'); } },[]);
您应该从路线中丢失“精确”,因为它在 v6 版本中已更改。
https://reactrouter.com/docs/en/v6/upgrading/v5
根据反应路由器
<Route exact>
不见了。 相反,具有后代路由(在其他组件中定义)的路由在其路径中使用尾随 * 来指示它们深度匹配
您正在混合react-router-dom
v5 和 v6 语法。 RRDv6 Route
组件不再采用render
function 道具(也不是component
道具或children
道具 function 道具),现在仅采用采用 JSX 的单个element
道具来渲染路由内容。
移除render
道具并将条件逻辑移动到element
道具中。
<Route
path="/register"
element={!isAuthenticated ? <Register /> : <Navigate replace to="/login" />}
/>
如果这是您经常使用的模式,则将其抽象为一个AuthLayout
组件,该组件有条件地为您要保护的嵌套路由或Navigate
组件呈现一个Outlet
以重定向。
const AuthLayout = ({ isAuthenticated }) =>
!isAuthenticated
? <Outlet />
: <Navigate replace to="/login" />;
...
<Route element={<AuthLayout isAuthenticated={isAuthenticated} />}>
<Route path="/register" element={<Register />} />
</Route>
注意:我认为您可能混淆了当isAuthenticated
为 true 时要呈现的内容,因为通常您希望在未通过身份验证时重定向到身份验证路由。
换句话说,如果经过身份验证,则在插座中渲染路由组件,否则重定向到登录路由。
const AuthLayout = ({ isAuthenticated }) =>
isAuthenticated
? <Outlet />
: <Navigate replace to="/login" />;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.