我有一个名为AuthenticatedRoute.tsx
的文件,该文件在我的Router.tsx
文件中用作我所有受保护/已认证路由的模板。
export default ({ component: C, authUser: A, path: P, exact: E }:
{ component, authUser, path, exact }) => (
<Route
exact={E}
path={P}
render={props =>
getRender(A, P, props, C)
}
/>
);
getRender
函数运行以下命令:
const getRender = (user, path, props, C) => {
if (user) {
if (!user.country) {
return <Redirect to={'/select-country'} />;
} else if (!user.phoneNumber) {
return <Redirect to={'/add-phone'} />;
} else if (!user.phoneNumberVerified) {
return <Redirect to={'/verify-phone'} />;
} else if (path === '/select-country' || path === '/add-phone' || path === '/verify-phone') {
return <Redirect to={'/dashboard'} />;
} else {
return <C {...props} authUser={user} />;
}
} else {
return <Redirect to={'/signin'} />;
}
};
以上所有尝试做的事情是,如果用户的个人资料不完整,则将用户重定向到其他路由。
此处出现的问题是,如果用户尝试去选择的国家或添加电话号码路由,则会出现控制台错误:
Warning: You tried to redirect to the same route you're currently on: "/select-country"
我尝试添加更多逻辑,如下所示:
if (!user.country && path !== '/select-country') {
return <Redirect to={'/select-country'} />;
}
尽管我发生了无限重定向:
Error: Maximum update depth exceeded.
当用户未完全填写其个人资料时,如何解决重定向到这些路由的问题?
答案 0 :(得分:1)
路径检查不起作用的原因似乎是重定向到仪表板。用户被重定向到选择国家/地区,然后针对该国家/地区的支票没有退货,并继续转到仪表板的支票,这将导致对国家/地区的检查,进而导致选择国家/地区,等等。
我们可以这样重写:
const getRender = (user, path, props, C) => {
const currentPage = <C {...props} authUser={user} />;
if(!user) {
return path === '/select-country' ? currentPage : <Redirect to={'/signin'} />;
}
if (!user.country) {
return path === '/select-country' ? currentPage : <Redirect to={'/select-country'} />;
}
if (!user.phoneNumber) {
return path === '/add-phone' ? currentPage : <Redirect to={'/add-phone'} />;
}
if (!user.phoneNumberVerified) {
return path === '/verify-phone' ? currentPage : <Redirect to={'/verify-phone'} />;
}
if (path === '/select-country' || path === '/add-phone' || path === '/verify-phone') {
return <Redirect to={'/dashboard'} />;
}
return currentPage;
};