【发布时间】:2021-07-25 10:08:21
【问题描述】:
在我的 App.js 中,我有一些通过 <PrivateRoute> 保护的经过身份验证的页面,如下所示:
<PrivateRoute path="/dashboard">
<Dashboard />
</PrivateRoute>
我像这样实现<PrivateRoute>:
function PrivateRoute({ children, ...rest }) {
return (
<Route {...rest} render={() => <CheckRedirect children={children} />} />
);
}
问题是,<CheckRedirect> 函数调用了我服务器上的一个端点,该端点动态地告诉你重定向到哪里。
函数如下:
export const CheckRedirect = ({ children }) => {
const [isChecking, setIsChecking] = React.useState(true);
const [target, setTarget] = React.useState(null);
const url = "https://example.com/get-redirect"
useEffect(() =>{
async function getPage() {
axios.get(url)
.then(function (response) {
setTarget(response.data.message)
}).finally(() => setIsChecking(false))
}
getPage();
}, []);
if (isChecking) {
return "... Checking";
}
return {target} ? (
<Redirect to={target} />
) : (
<Redirect to='/404' />
);
};
如果您没有登录,它会在message 字段中发回“/login”。如果您已登录,它将发送“/dashboard”。
如果它发回“/dashboard”,那么 React Router会产生一个无限循环! 它会再次尝试相同的<PrivateRoute>,它会再次调用端点,它会再次返回“ /dashboard”等等……
如果这已经是重定向的结果,我有没有办法告诉我的<PrivateRoute>不执行<CheckRedirect> 函数?
【问题讨论】:
-
我很确定您应该能够将当前路由名称从
PrivateRoute发送到您的CheckRedirect函数,并且只有在您的getPagefetch 中执行setTarget,如果它返回不同的路线。 -
@benomatis 你能给我举个例子吗?如果我不做
setTarget,那么它将在底部返回switch 语句的<Redirect to='/404' />部分。我需要 PrivateRoute 以某种方式永远不会调用CheckRedirect函数
标签: reactjs react-router axios react-router-dom router