先给结论:不要急着把组件改到“处处一致”,而要先判断差异来自数据形态、容器约束还是交互上下文。验收样例应当围绕这三类变量分别构造,每个样例只改变一个条件,并记录组件在保留、改写或退出三种决策下的表现。这样你才能知道哪些差异必须修,哪些只是正常适配。
同一段代码放在列表页和详情页,外观不同,可能根本不是组件本身的问题。列表页通常数据字段少、容器窄、条目密集;详情页字段全、容器宽、交互入口多。如果你直接拿两个截图对比,很容易把布局差异误判为组件缺陷。
验收前先做一次归因:打开开发者工具,检查两处渲染出的 DOM 结构是否一致,再对比传入的属性、插槽内容和外层容器宽度。如果结构相同、属性不同,说明是调用方式差异;如果结构不同,说明组件内部有分支逻辑。这个判断会直接决定下一步是改调用方还是改组件本身。
很多团队的做法是“列表页测一遍、详情页测一遍”,结果两边都只覆盖了各自最常见的状态,边界情况仍然漏掉。更有效的方式是把差异拆成可独立控制的变量,每个样例只动一个变量。
构造样例时,给每个样例写一行前提说明,例如“容器宽度设为组件最小宽度的 80%,数据字段为空”。这样别人复现时不需要猜你的环境。
发现差异后,处理方式大致分三类,但并不是每类都适用于你的情况。
当差异只出现在容器约束不同、且组件本身没有溢出或遮挡时,保留是合理的。比如列表页用紧凑模式、详情页用宽松模式,这属于有意的适配。这时验收样例要记录的是“在什么容器宽度下切换到哪种模式”,而不是要求两处完全一致。
当同一数据形态在不同页面渲染出不同结构,且这种不同不是设计意图时,应该改写组件。典型信号是:详情页正常显示,列表页出现文字截断或按钮错位,而两处传入的数据字段相同。改写前先补一个最小复现样例,确认改动能同时通过两个页面的验收项。
如果组件在某个页面的交互上下文里需要大量覆盖样式或额外逻辑才能正常工作,说明它不适合这个场景。这时更务实的做法是让该页面使用更简单的展示结构,而不是继续给组件加分支。退出的判断依据是:维护成本是否已经超过单独实现一个轻量结构的成本。
假设你有一个卡片组件,在列表页显示标题和摘要,在详情页侧栏显示标题和更新时间。差异出现在摘要为空时,列表页卡片高度塌陷,侧栏不受影响。
可以这样写样例:前提:摘要字段为空,容器宽度为 320px;操作:渲染卡片组件;预期:卡片保持最小高度,标题不换行溢出;记录:列表页高度变化,侧栏无变化。这个样例只改变了数据形态,没有同时改容器和交互,所以能定位到问题来自空值处理。
执行后如果列表页仍然塌陷,下一步就是检查组件是否对空摘要做了条件渲染;如果侧栏也出现同样问题,说明是组件内部逻辑而非调用方差异。这个结果会直接决定你是改组件还是改列表页的调用方式。
每个样例跑完后,不要只记“通过”或“不通过”。记录三件事:差异是否可复现、复现所需的最小条件、以及按当前决策处理后的影响范围。如果某个差异只在特定容器宽度下出现,且该宽度在真实页面中不会出现,可以标记为低优先级并说明理由。
反过来,如果差异出现在核心数据字段上,并且影响用户读取或点击,就应该优先处理。处理方式可以是改写组件,也可以是调整调用方传入的数据格式。无论选哪种,都要回到同一组样例重新验证,确认改动没有让另一个页面出现新的差异。这样验收样例就不只是一次性检查,而是后续修改的回归依据。