refactor: 前端登录/权限/界面状态迁移至 zustand
This commit is contained in:
43
apps/admin/src/components/RouteKeeper.tsx
Normal file
43
apps/admin/src/components/RouteKeeper.tsx
Normal file
@@ -0,0 +1,43 @@
|
||||
import React, { useRef } from 'react';
|
||||
import { useLocation, useOutlet } from 'react-router-dom';
|
||||
|
||||
const MAX_CACHED_PAGES = 30;
|
||||
|
||||
/**
|
||||
* 路由保活:切换页面时保留已访问页面的组件实例(输入、滚动、弹窗状态不丢失)。
|
||||
* 隐藏页面仍挂载在 DOM 中,仅通过 display:none 隐藏。
|
||||
*/
|
||||
export const RouteKeeper: React.FC = () => {
|
||||
const location = useLocation();
|
||||
const outlet = useOutlet();
|
||||
const cacheRef = useRef<Map<string, React.ReactNode>>(new Map());
|
||||
const orderRef = useRef<string[]>([]);
|
||||
// 仅以 pathname 作为缓存键:页面内部通过 URL 参数同步状态时不会
|
||||
// 产生第二个实例,切回时也不会因此重挂载。
|
||||
const pageKey = location.pathname;
|
||||
|
||||
if (outlet && !cacheRef.current.has(pageKey)) {
|
||||
cacheRef.current.set(pageKey, outlet);
|
||||
orderRef.current.push(pageKey);
|
||||
if (orderRef.current.length > MAX_CACHED_PAGES) {
|
||||
const oldest = orderRef.current.shift();
|
||||
if (oldest && oldest !== pageKey) cacheRef.current.delete(oldest);
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{Array.from(cacheRef.current.entries()).map(([key, node]) => (
|
||||
<div
|
||||
key={key}
|
||||
className="route-keeper-page"
|
||||
style={{ display: key === pageKey ? undefined : 'none' }}
|
||||
>
|
||||
{node}
|
||||
</div>
|
||||
))}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default RouteKeeper;
|
||||
Reference in New Issue
Block a user