refactor: 前端登录/权限/界面状态迁移至 zustand

This commit is contained in:
2026-08-04 14:41:27 +08:00
parent ce1dcc07ea
commit f07ffdc64c
39 changed files with 970 additions and 211 deletions

View 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;