现象(浏览器实测,showcase account 详情页)
在记录详情页切到任意非默认 tab(如 Related / Invoices),然后发生任何 URL search 参数变化 —— tab 条立即重置回 Details,滚动位置同弃。触发源包括:
即:这是既有缺陷,#2256 只是让它更容易被撞上(其"子表保存后父详情 tab 保留"的验收项因此打了折扣——父路由/数据确实原地不动,但 tab 回到了 Details)。
根因
tab 条是非受控 Radix Tabs:
- schema 路径:
packages/components/src/renderers/layout/containers.tsx PageTabsRenderer — <Tabs defaultValue={itemsWithValue[0]?.value}>;
- legacy 路径:
packages/plugin-detail/src/DetailView.tsx autoTabs 分支 — <Tabs defaultValue="details">。
active tab 只活在组件实例里;URL 变化 → 上层子树重挂载 → 状态清零。
建议修复(ADR-0054 C3:URL-addressable state)
把详情页 tab 状态放进 URL(如 ?tab=<value>,replace 写入不压 history):
PageTabsRenderer 支持受控 value + onValueChange(components 包不依赖 router,由宿主注入);
- app-shell
RecordDetailView 从 searchParams 读/写 tab,经 page schema(或 RecordContext)传入;
- autoTabs legacy 分支同样接
schema.defaultTab / onTabChange;
- 顺带收益:tab 可深链、刷新保留、Back/Forward 可用 —— 与
?recordId=/?form= 同一契约family。
验收
Refs framework#2604 · #2256(其 PR 描述"已知边界"节)
现象(浏览器实测,showcase account 详情页)
在记录详情页切到任意非默认 tab(如 Related / Invoices),然后发生任何 URL search 参数变化 —— tab 条立即重置回 Details,滚动位置同弃。触发源包括:
?form=…参数(feat(app-shell,plugin-view,plugin-form): record task flows as derived overlays + return invariants (framework#2604 Step 2) #2256 / framework#2604 引入的 URL 契约);?recordId=…详情 drawer、?palette=1命令面板等一切 useUrlOverlay 类参数;即:这是既有缺陷,#2256 只是让它更容易被撞上(其"子表保存后父详情 tab 保留"的验收项因此打了折扣——父路由/数据确实原地不动,但 tab 回到了 Details)。
根因
tab 条是非受控 Radix Tabs:
packages/components/src/renderers/layout/containers.tsxPageTabsRenderer—<Tabs defaultValue={itemsWithValue[0]?.value}>;packages/plugin-detail/src/DetailView.tsxautoTabs 分支 —<Tabs defaultValue="details">。active tab 只活在组件实例里;URL 变化 → 上层子树重挂载 → 状态清零。
建议修复(ADR-0054 C3:URL-addressable state)
把详情页 tab 状态放进 URL(如
?tab=<value>,replace写入不压 history):PageTabsRenderer支持受控value+onValueChange(components 包不依赖 router,由宿主注入);RecordDetailView从 searchParams 读/写tab,经 page schema(或 RecordContext)传入;schema.defaultTab/onTabChange;?recordId=/?form=同一契约family。验收
?form=new、?recordId=、命令面板)→ 关闭 → tab 仍是 Related;?tab=related深链直达。Refs framework#2604 · #2256(其 PR 描述"已知边界"节)