fix/route-redirect-keepalive
main
首次进入系统(访问根路径 /)后,点击任意菜单/按钮都会被强制拉回 /dashboard,刷新页面后才恢复正常。
/
/dashboard
RouteKeeper(路由保活)会把首页 index 节点缓存并保持挂载,DefaultRoute 中的声明式 <Navigate> 会随缓存节点在后续每次路由变化时重新触发 replace,把当前页面强制替换回落地页;刷新后不再经过 /,缓存中无该节点,所以恢复正常。
RouteKeeper
DefaultRoute
<Navigate>
replace
apps/admin/src/components/DefaultRoute.tsx:改为 effect 导航,仅在确实处于 / 且已算出落地页时跳转一次(navigate 用 ref 持有避免 effect 空转)。同时新增集成测试覆盖「首次进入 / → 跳转一次 → 后续导航不被劫持 → 回到 / 仍能重定向」。
apps/admin/src/components/DefaultRoute.tsx
navigate
根因:RouteKeeper 保活缓存了首页 index 节点,DefaultRoute 中的声明式 <Navigate> 会随缓存节点在后续路由变化时反复触发 replace,导致所有导航 被强制拉回落地页(dashboard),刷新后因不再经过 / 而恢复正常。 修复:DefaultRoute 改为 effect 导航,仅在确实处于 / 且已算出落地页时 跳转一次;navigate 通过 ref 持有避免 effect 空转。新增集成测试覆盖 「首次进入 / → 跳转一次 → 后续导航不被劫持 → 回到 / 仍能重定向」。
No dependencies set.
The note is not visible to the blocked user.
问题
首次进入系统(访问根路径
/)后,点击任意菜单/按钮都会被强制拉回/dashboard,刷新页面后才恢复正常。根因
RouteKeeper(路由保活)会把首页 index 节点缓存并保持挂载,DefaultRoute中的声明式<Navigate>会随缓存节点在后续每次路由变化时重新触发replace,把当前页面强制替换回落地页;刷新后不再经过/,缓存中无该节点,所以恢复正常。修复
apps/admin/src/components/DefaultRoute.tsx:改为 effect 导航,仅在确实处于/且已算出落地页时跳转一次(navigate用 ref 持有避免 effect 空转)。同时新增集成测试覆盖「首次进入/→ 跳转一次 → 后续导航不被劫持 → 回到/仍能重定向」。验证
/dashboard