1. 项目背景与核心需求
后台管理系统作为企业级应用的核心组成部分,路由管理和权限控制一直是开发中的重点难点。最近在重构公司内部使用的运营管理系统时,我系统性地解决了三个关键技术问题:路由缓存保持页面状态、动态路由实现权限隔离、细粒度按钮权限控制。这套方案经过半年生产环境验证,日均支撑200+运营人员的复杂操作,现将完整实现思路和踩坑经验分享给大家。
一个典型的后台管理系统通常面临以下痛点:
- 多Tab页操作时,切换路由导致组件重复渲染和数据丢失
- 不同角色(管理员/运营/审计)需要动态加载不同的路由结构
- 同一页面内需要根据权限动态显示/隐藏操作按钮
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 路由缓存方案设计与实现
2.1 为什么需要路由缓存?
在后台系统的实际使用中,运营人员经常需要:
- 在商品列表页筛选复杂条件后,查看详情再返回
- 同时打开多个Tab页面对比数据
- 在表单填写中途查看其他页面参考
传统SPA应用的路由切换会导致组件销毁重建,所有状态丢失。通过keep-alive实现的缓存方案可以保持组件实例和DOM状态。
2.2 React-Router v6缓存方案
不同于Vue的keep-alive,React需要手动实现缓存。我们采用路由监听+状态保存的方案:
javascript复制// 缓存容器组件
const CacheRoutes = () => {
const [cachePages, setCachePages] = useState(new Map())
return (
<Routes>
{routes.map(route => (
<Route
key={route.path}
path={route.path}
element={
<KeepAlive
cacheKey={route.path}
cachePages={cachePages}
setCachePages={setCachePages}
>
{route.element}
</KeepAlive>
}
/>
))}
</Routes>
)
}
// KeepAlive组件实现
const KeepAlive = ({ cacheKey, children, cachePages, setCachePages }) => {
const [localCache] = useState(() => {
return cachePages.get(cacheKey) || {
vnode: children,
scrollTop: 0
}
})
useEffect(() => {
return () => {
// 卸载时保存状态
setCachePages(prev => {
const newCache = new Map(prev)
newCache.set(cacheKey, {
vnode: localCache.vnode,
scrollTop: document.documentElement.scrollTop
})
return newCache
})
}
}, [cacheKey])
ret
