Skip to content

ADR 0002:useX / open 覆盖 container.component

  • 状态:Accepted(已实现:merge 后写覆盖,无 warn)
  • 日期:2026-06-29
  • 定稿:2026-07-15
  • 关联ADR 0001(可用 LayerNoContainer 作为覆盖目标)

背景

DESIGN.md 已约定 open 可覆盖 container.component(merge 最高 tier,仍走该实例工厂的 adapter),并标注为 进阶能力

ADR 0001 定稿:存量单体通过把 container.component 换成 LayerNoContainer(透明容器 + props 投影;常见于项目 adapter 按 content 组件切换);也允许在 use / open 显式传入。

需钉死:use / open 是否允许写 container.component、是否 warn、与 adapter 的先后关系。


现有 merge 事实

text
mergeFragment(create, define:template, define, use:template, use, open)

container.component:后出现的 tier 覆盖先前的 component 字段——与 props / slots / model 等同一规则。


决策

1. useX / open 均可覆盖 container.component

API结论
useX(Content, { container: { component } })允许;合法用法, dev warn
open({ container: { component } })允许(进阶); warn

与其它配置字段同一 merge 语义;不为 component 单独加警告。open 覆盖 use 时 silent(后写覆盖)。

换容器后的 slot 名、model 协议等差异由用户在 adapter 或分工厂处理;框架不替用户适配。

覆盖为 LayerNoContainer 时走 ADR 0001 透明容器 + props 投影。

2. adapter 在 merge 之后

text
merge → adapter(fragment) → refs → bind → render

adapter 可改回或再次改写 use / open 写入的 container.component(含换成 LayerNoContainer)。运行时覆盖进入 merge,不跳过该实例工厂的 adapter。

3. 类型

LayerConfigContent 保留 container?: { component?: Component }(含 LayerNoContainer)。


否决:use 换 component 时 dev warn

曾考虑「允许 + warn」以提示非常规换容器。否决原因:

  • 类型与 merge 已把它当作一等字段;单独 warn 不一致
  • 合法场景多(单实例换容器、显式 LayerNoContainer、个别页 Drawer)
  • open 静默不对齐;真风险靠 adapter / 分工厂,不靠 warn

与 ADR 0001 的边界

主题ADR
LayerNoContainer 透明容器 / props 投影、共用 useLayer0001
container.component 在 use/open 的覆盖策略0002(本文)

决策记录

结论
useXcontainer.component允许,无 warn
opencontainer.component允许(进阶),无 warn
可换成 LayerNoContainer是(ADR 0001)
adapter 改回 / 再改 merge 后的 component保持:merge 后跑工厂 adapter
类型LayerConfigContent.container?.component

参考

  • DESIGN.md
  • ADR 0001
  • 集成测试:tests-vue3/integration/layer-config.test.tscomponent override

MIT Licensed