先给结论:不要为这个组件单独写一份“万能验收页”,而要把组件放回它实际出现的页面类型中,分别构造最小复现样例,直到能指出“哪一类页面的哪个环境条件让它表现不同”。如果验收样例只在空白模板里通过,它证明的是组件本身能工作,不能证明它在真实页面里稳定。
这类问题常见的矛盾是:同一个卡片、表单、导航或轮播,在列表页正常,在详情页错位;在首页正常,在栏目页闪烁;在一种内容长度下正常,换一段更长的文案就溢出。此时继续调组件样式往往无效,因为差异不在组件内部,而在页面给它的外部条件。
第一个解释是组件自身在不同页面被初始化成了不同状态。例如同一段脚本在列表页绑定了一次,在详情页因为局部刷新又绑定一次;或者组件依赖的配置对象在两类页面传入的字段不同。这类问题的特征是:把组件单独放到一个干净页面里,用同样参数调用,表现仍然不一致。
第二个解释是页面环境不同。组件代码没变,但父容器的宽度、可用高度、层叠上下文、字体加载时机、异步数据到达顺序不同。特征是把组件原样搬到另一类页面的容器里,问题跟着容器走,而不是跟着组件走。
两个解释会指向完全不同的修复动作。前者要查初始化与销毁逻辑,后者要查布局约束与加载顺序。验收样例如果只覆盖其中一种,就会得出错误结论。
有效证据来自控制变量。可以按下面顺序取三组样例:
这三组样例的价值在于:它们能排除“页面整体不同”这种笼统归因,把差异缩小到可操作的条件上。假设某详情页的侧栏组件在列表页正常、在详情页被截断,先做第三组对照,若换到无固定高度的容器后恢复正常,就可以把验收重点放在容器高度约束上,而不是继续改组件内部样式。
样例不是截图集合,而是一份可重放的记录。每个样例至少写清:页面类型、容器约束、传入数据、加载顺序、预期表现、实际表现。其中“容器约束”和“加载顺序”最容易被漏掉,却常常是差异根源。
动作上,先为出问题的组件建立一份这样的样例表,再逐条执行。执行结果会直接决定下一步:如果差异只出现在某个加载顺序下,就优先调整资源顺序;如果只出现在某类容器约束下,就优先修正布局契约,而不是增加组件内部的条件分支。
假设同一提交按钮在列表页可点击,在详情页被底部浮层遮住。两个解释分别是:按钮组件在详情页被重复初始化导致层级异常,或详情页的浮层与按钮处于同一层叠上下文。可以构造一个最小样例:把按钮组件原样放入一个与详情页结构相同的容器,只移除浮层,观察是否恢复;再保留浮层但把按钮移出该容器,观察是否恢复。若移除浮层后恢复,证据指向层叠上下文;若移出容器后恢复,证据指向容器约束。这个例子是假设,用于说明比较方法,不代表任何真实项目结果。
当样例能稳定复现差异后,验收条件应从“组件显示正常”改成带前提的表述,例如“在详情页固定高度容器内、异步数据先于组件脚本到达时,按钮不被浮层遮挡”。这样的条件可以被重复检查,也能在后续改版中作为回归项保留。若样例无法复现差异,说明当前记录缺少关键条件,应先补齐容器约束和加载顺序,而不是直接判定问题已修复。
对张家界网页设计项目而言,页面往往同时存在景区介绍、线路列表、表单预订等不同内容密度的模板,同一组件跨模板表现不同几乎是必然要面对的情况。把验收样例按页面类型和容器条件拆开,比追求一个通用样例更接近实际,也更容易在交付前发现真正遗漏的那个条件。