Appearance
平台与实现边界
Vapor 配置与实际验证
当前项目 manifest.json 设置 uni-app-x.vapor=true、vapor-render-target=bytecode,这是 App 构建的 Vapor 配置。历史全库证据来自 HBuilderX 5.26、Web VDOM 和 Headless Edge Chromium 的 390/1280 宽度验证,保留在 COMPONENT_COMPLETENESS.md。本轮组件加固使用 HBuilderX 5.33、Web Edge,验证宽度为 390/1280,Tabbar 另覆盖 320;仅代表对应专项范围,不替换历史全库记录,也不表示本轮已对 112 个组件重新进行运行验收。Web VDOM 通过不能表述为 App Vapor 已验证。本轮专项结果与证据索引见项目根目录 COMPONENT_HARDENING.md。
未消费参数
“当前实现未消费”仅在 AST 没有发现模板、脚本、导入 helper 或已登记 provide/inject 组合契约消费时出现。它表示当前版本不应依赖该参数产生效果,不等于可以从公开类型中擅自删除。Checkbox/Radio 组传给子项的视觉参数、Descriptions 传给 DescriptionItem 的列数/布局/标签宽度/间距/边框/尺寸,以及 Grid 共享解析器参数均按组合契约记录。
布局与状态组件边界
- Space 使用子项 margin 实现间距,不依赖 CSS gap;传入
items时才能稳定包装每项并注入间距,空items的 default slot 仅提供排列容器,无法跨端自动包装任意 slot 子节点。 - Descriptions 及 DescriptionItem 使用百分比列宽;窄屏、多列、较大 labelWidth 与长文本组合可能压缩值区域,业务应按目标宽度降低 columns 或切换 vertical。
- StateView 只编排 content、loading、empty、error 反馈及 action/retry 事件,不接管请求发起、取消、重试或错误恢复状态。
设备 API 与未承诺范围
- Android、iOS、HarmonyOS 原生构建和真机交互未完成本轮全库验收。
- Safari、小程序、原生 Vapor 布局、字体、Canvas、安全区、键盘、返回键、焦点陷阱、读屏和 RTL 未统一验证。
- Web 通过不等价于相册选择、上传、系统预览、剪贴板、电话、系统取色、远程图片、权限申请等设备 API 通过;相关示例只证明调用契约和静态结构。
- 旧版
xtf-linkui的文档、Options API 和 props 不构成本插件契约。
具体组件的残余差集以项目根目录 COMPONENT_COMPLETENESS.md 和插件 readme.md 为准。
本轮契约变化
- xtf-search:actionMode 默认 auto:动作点击先取消待触发的防抖;auto 在原始值 length > 0 时 search,否则 cancel(空白串也算非空),不执行显式 cancel 的面板关闭/失焦。search 总是发 search(允许空值),cancel 总是关闭面板、失焦并发 cancel。未指定 actionText 时 search 文案为“搜索”,auto/cancel 文案为“取消”;文案不会决定行为。disabled/readonly/loading 会阻止动作。
- xtf-table:cell scope 为 { row, column, value, rowIndex, columnIndex }:row 为原始对象,value 为未经 formatter 的字段值;行索引对应当前排序/树展开/分页后的显示行,列索引对应过滤 hidden 后的可见列。未提供 cell 插槽时仍使用 formatter(value, row, column) 作为 fallback;提供插槽会替换整段单元格默认内容。selection 要求 rowKey(默认 id)在全量树数据中有效且唯一:允许字符串、布尔值及有限数值,缺失/重复/对象/NaN/Infinity 键不可选。
- xtf-virtual-list:refresh(): void 在 nextTick 重新测量视口,不测量每行;父级必须提供明确高度,itemHeight 单位为 px,行内容必须定高。WEB 仅在存在 ResizeObserver 时观察,APP 条件编译 UniResizeObserver,小程序无自动尺寸观察,应在父布局变化后显式 refresh。卸载断开观察并使旧测量任务失效。
- xtf-canvas:refresh(): void 在上下文 ready 且尺寸大于零时检查逻辑尺寸与 DPR,变化后重新配置位图并 redraw;无变化或未 ready 时不处理,不是清空 API。WEB || APP 条件编译 UniResizeObserver,小程序需在布局完成后显式调用;重建上下文与卸载会解除旧观察。
- xtf-signature:refresh(): void 在 ready 且尺寸/DPR 改变时停止回放、更新位图并重绘,不修改笔画与撤销历史,也不按新尺寸缩放笔画坐标。WEB || APP 条件编译 UniResizeObserver,小程序需在父布局变化后显式调用;未 ready、零尺寸或卸载后不处理,观察器在重建/卸载时断开。
- xtf-image-crop:refresh(): void 在 nextTick 重新测量 stage;有效尺寸变化会 initializeSelection,业务应注意裁剪框随之重新初始化,方法不负责导出。WEB || APP 条件编译 UniResizeObserver,WEB 另监听窗口 resize,小程序需显式调用。卸载时断开观察与窗口监听,旧图片加载结果受请求标识隔离。
- xtf-tabbar:badge/dot 的内部布局已允许 overflow:visible,标签自身仍截断;祖先容器的 overflow:hidden 仍可能裁切徽标。Demo 的 fixed 预览在滚动内容外,正文单独预留导航高度与安全区;文档内嵌示例默认 fixed=false,固定预览例显式切换。fixed 与 safeAreaInsetBottom 默认均为 true,组件不会替业务自动预留正文空间。
服务式边界
- xtf-dialog:服务式 Dialog 按请求隔离:beforeClose 等异步守卫未结束时再次 show/confirm,或在 confirm-detail、cancel-detail、action、输入/选项事件中重入新请求,旧请求的后续关闭与状态写回不会作用到新请求。update 修改当前请求,show 才创建新请求;内部请求标识不是业务 API。
- xtf-toast:toastManager.clear()(close 的同义入口)只关闭当前项,保留 queue,并在 nextTick 推进下一项;推进中重复 clear 不跳过队列项。clearAll() 关闭当前项、清空队列并使待推进任务失效,卸载清理应按业务所有权选择。非 queue 的 show 会替换当前项并清空旧队列。
- xtf-notify:相同 type/variant/title/message/description 在 240ms 内连续调用且旧项仍保留时会 dedup,返回同一保留通知项及其 id,可用 notifyManager.remove(id) 精确移除;它不是新通知句柄或 Promise。旧项已移除后再调用会创建新 id,notifyManager.clear() 清空全部通知并重置去重记录;只清理本页通知时应按持有的 id 调用 remove。