description: "dsh Web 客户端的 slot 注册表纯核心:普通扩展 slots、可复用 Component Factory、推导 props 类型、store 席位与渲染器安装约定。"
English | 中文
dsh-client-ui-slots 让 Web 客户端插件定义并组合带类型检查的 UI 区域。普通 Slots 提供 parent-owned 扩展位置;Component Factory 提供带调用方所选局部 Component 的可复用装配。两套 API 都从声明合并类型推导 scoped state、injection、locale 与 child-render props,并在插件加载期间报告冲突 definition。客户端需要渲染时,将这个不依赖 React 的包与 ui-renderer 配合使用。
编写客户端插件时都通过本包组合 UI:把组件注册进父级已声明的 slot,或声明组件将要渲染的子 slot。四种 kind 覆盖组合形态——single(单个占位者)、list(有序条目)、keyed(按键分派)与 chain(条目自行提名)。
当一个包定义装配、而互不相关的 parents 需要独立渲染它时,使用 Component Factory。在 SlotFactoryMap 中声明完整类型,通过 ctx.slots.registerFactory() 安装 definition,通过注入的 renderFactorySlot() 渲染 occurrences,并通过调用的 slots 选项选择每个已声明的局部 Component。definition 通过 useFactorySlot(name, fallback) 读取该选择。
Factory children 仍是普通全局 Slots 且必须与 SlotMap 匹配,而局部 slots 为每个 occurrence 选择一个 Component。occurrence 继承其渲染位置的 scope;renderFactorySlot() 不接受 Session identity。共享 Store handle 使用普通 scope 解析。Store factory 保持 lazy,直到 occurrence 首次物化时才为该渲染位置创建一个 handle;若持久化 Store spec 会让 persistence key 在 occurrences 之间冲突,renderer 会拒绝它。
每个已注册组件都会收到由五个框架 share 组合而成的 props:运行时 share(父级 render 调用点的 owner,加上会话标准工具包与全局席位)、child render share(静态缩窄到已声明 children 的 renderSlot)、Factory render share(renderFactorySlot)、store share(已声明 handle 的 selector 钩子与移除 draft 的 actions),以及业务 share(从 inject 推导)。组件引用推导出的 props 别名;它们绝不在本地重新定义任何 share 的类型。
register 调用可以用 store: defineStore(...) 声明 store 席位:init 推断状态 schema,actions 是完整的 draft-transform 写入集合。组件经 selector 钩子读取、经烘焙回调写入;defineStore 的引擎实现位于运行时包,并满足这里导出的 DefineStore 约定。
声明即认领:注册条目成为唯一被允许渲染该键的条目;注册未声明 slot、声明已声明过的子项、在两个 scope 下挂载同一个共享句柄、或注册缺少 select 的 chain,都会在加载时抛出。条目的 disposer 会递归移除其声明的子 slot——账本行、贡献与 store 挂载都随同一生命周期结束而移除。
以下页面覆盖引擎、渲染器与组合模型。
无。该包是浏览器端 UI 接线层,不注册任何面向模型的内容。
无;该包既不组装也不发送提供方请求。
这些限制定义注册表的规模扩展特性与已接受的类型噪声;它们是当前包约束。
isLive 会线性扫描所有记录:在 UI 插件的注册规模(数十项)下没有问题;如果账本变得频繁访问,再使用条目→记录反向引用改进。__renders 幻象锚点在 PropsRenderSlots 上可见:这是与类型链设计的 __accepts 相同且已接受的噪声;泛型方法签名在 key 联合之间比较宽松,因此必须依靠逆变标记强制执行「组件 key 集合 ⊆ children 声明」。运行时不变式: 不发布伴生入口。这是零依赖的纯注册表核心,本身不发出 Cordis 事件;ui-renderer SlotRegistry 负责事件桥及其不变式。本包的行为规范直接断言 define/register/dispose 的执行顺序。