reactjs - 登录重定向渲染两次
问题描述
我正在为我的路线使用到达路由器。如果用户未登录,我能够保护仪表板并公开登录页面并重定向,但现在如果我输入一个 url,它将执行快速重定向以登录,然后返回主页,而不是实际输入的页面。
我注意到由于使用 useEffect 来获取组件呈现两次的用户:1 没有用户(重定向到登录)另一个有用户并重定向到主页。
路由文件
const AdminRoutes = () => {
return (
<Router>
<MainLayout path="/admin">
<HomePage path="/" />
<CarTransfer path="/cartransfers">
<CarTranserList path="/list" />
<CarTransferCreate path="/new" />
</CarTransfer>
<User path="/users">
<UserList path="/list" />
<UserCreate path="/new" />
</User>
</MainLayout>
<LoginPage path="/login" />
</Router>
);
};
布局文件
import { useState, useEffect } from "react";
import { Redirect, useNavigate } from "@reach/router";
import { Layout } from "antd";
import SiderMenu from "./SiderMenu";
import LayoutBanner from "./LayoutBanner";
import { useSelector, useDispatch } from "react-redux";
import {
userSelector,
fetchUserBytoken,
clearState,
} from "../../features/authSlice";
const { Content } = Layout;
const MainLayout = ({ children }) => {
const user = useSelector(userSelector);
const [collapsed, setCollapsed] = useState(false);
const navigate = useNavigate();
const dispatch = useDispatch();
const { isFetching, isError } = useSelector(userSelector);
useEffect(() => {
dispatch(
fetchUserBytoken({
token: localStorage.getItem("token"),
id: localStorage.getItem("id"),
})
);
}, []);
useEffect(() => {
if (isError) {
dispatch(clearState());
navigate("/login");
}
}, [isError]);
const handleOnCollapse = () => {
setCollapsed((prevState) => !prevState);
};
if (isFetching) {
return <div>Loading</div>;
}
if (user.id === "") {
return <Redirect noThrow to="/login" />;
}
return (
<Layout>
<SiderMenu collapsed={collapsed} handleOnCollapse={handleOnCollapse} />
<Layout>
<LayoutBanner
collapsed={collapsed}
handleOnCollapse={handleOnCollapse}
/>
<Content>{children}</Content>
</Layout>
</Layout>
);
};
export default MainLayout;
第二个问题是如何在登录后到达登录重定向之前的同一页面。
谢谢
解决方案
推荐阅读
- file - sys_file_metadata 表扩展但字段未显示
- android - 是否需要再次创建拦截器来更新标头?
- wordpress - 如何翻译contact form7报警语言?
- swift - 通过推送通知发送图像在 iOS 中不起作用
- c++ - 为什么我不能返回向量
> (进程返回-1073741819 (0xC0000005)) - javascript - 如何在输入字段中将视图“移动到当前插入位置”?
- python - pywinauto:type_keys 将文本发送到错误的文本框
- python - 使用密码读取 zipe 文件中的多个 csv
- c# - 如何为 EF6 Database-First 中的所有实体类提供未映射的通用抽象 BaseEntity 父级?
- go - 如何在不将所有内容读入内存的情况下上传 gzip 文件