Vant 2 的 Steps 组件解决的其实是一个非常具体的交互问题:把线性流程拆成多个节点,让用户快速感知当前进度。它和普通进度条不同,Progress 只表达百分比,Steps 还能展示每个节点的标题、描述和状态图标,因此在电商下单、会员认证、资料完善等页面中被大量使用。

一、先理清 Vant2 Steps 的基础属性与渲染逻辑
在 Vue 2 项目里使用 Vant2 时,步骤条由 <van-steps> 和 <van-step> 两个组件配合完成。<van-steps> 作为容器,控制整体方向、颜色和当前激活索引;<van-step> 负责单个节点的标题、描述和图标内容。最核心的属性是 active,它决定当前激活到第几步,起始值为 0,也就是第一步对应 0,第二步对应 1。
除了 active,还有几个属性会直接影响视觉表现。direction 用来切换横向和竖向布局,默认是 horizontal;active-color 控制当前激活步骤的颜色;inactive-color 控制未激活步骤的颜色;finish-color 控制已完成步骤的颜色。很多开发者只关注 active 和 direction,忽略了颜色属性之间的继承关系,这会导致切换状态时出现颜色不统一。
下面是一个最基础的横向步骤条示例,当前激活索引为 1,意味着第一个步骤已经完成,第二个步骤正在激活,第三个步骤还未开始。
<van-steps :active="1" active-color="#07c160" finish-color="#07c160"> <van-step title="买家下单" desc="订单已创建"></van-step> <van-step title="商家发货" desc="包裹运输中"></van-step> <van-step title="买家确认" desc="确认收货"></van-step> </van-steps>
这段代码中 :active="1" 是 Vue 的动态绑定写法,它等价于把 active 属性设置为数字 1。需要注意的是,如果直接写 active="1",Vant2 也能接收字符串并转换,但在比较索引时最好保持类型一致,避免出现 active 与数组下标严格不等的意外情况。
二、高频误区:Vant2 Steps 为什么总是不按预期显示
第一个误区是 active 起始索引。很多后端接口返回的步骤状态是从 1 开始计数的,比如 1 表示待支付、2 表示已发货。如果直接把这个值赋给 active,步骤条会整体往后错一位,用户看到的进度永远比真实状态慢一步。正确做法是在计算属性或赋值前做一次转换,例如使用 Math.max(0, backendStep - 1),确保第一步对应的激活值为 0。
第二个误区是把 icon 属性当成万能自定义入口。Vant2 的 <van-step> 确实提供了 icon 属性,但它只接受内置图标名称,比如 success、add-o、warning。如果你想放入一张图片地址或者自定义 DOM 结构,继续往 icon 里塞 URL 是无效的。Vant2 为步骤节点提供了 icon 插槽,使用 #icon 可以完全接管图标区域,渲染自定义图片、图标组件或带业务逻辑的元素。
<van-steps :active="0">
<van-step title="实名认证" desc="上传身份证">
<template #icon>
<img class="step-icon" src="/img/idcard.png" alt="身份证图标" />
</template>
</van-step>
</van-steps>
第三个误区是竖向步骤条容器高度问题。当 direction 设置为 vertical 后,步骤节点会沿着垂直方向排列,连接线也会变成长条。如果外层容器没有设置确定高度或最小高度,特别是在 flex 布局中,节点很容易被压缩成一条线。解决办法是给容器设置 min-height,或者保证每个 <van-step> 都有 desc 描述内容,让内部内容把高度撑起来。
第四个误区是动态步骤列表的 key 设置。使用 v-for 渲染步骤时,如果用 index 作为 key,在步骤数量固定时通常没有问题,但如果业务需要根据权限动态插入或删除步骤,key 的不稳定会导致连接线动画状态和图标状态错乱。建议给每个步骤配置一个稳定唯一的业务 key,例如 item.key,避免组件复用产生异常。
三、动态步骤切换与表单校验的完整实践
步骤条最终要落到业务里才有价值。一个常见场景是资料填写流程,用户需要按顺序完成姓名、手机号、地址等步骤,每步校验通过后才能进入下一步,最后一步显示提交按钮。下面这段代码把步骤配置抽成数组,通过 v-for 渲染,并配合按钮实现前进、后退和提交。
<template>
<div class="order-steps">
<van-steps :active="active" active-color="#07c160" finish-color="#07c160">
<van-step
v-for="(item, index) in steps"
:key="item.key"
:title="item.title"
:desc="item.desc"
></van-step>
</van-steps>
<div class="step-actions">
<van-button v-if="active > 0" @click="prev">上一步</van-button>
<van-button v-if="active < steps.length - 1" type="primary" @click="next">下一步</van-button>
<van-button v-else type="success" @click="submit">提交</van-button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
active: 0,
steps: [
{ key: 'order', title: '填写订单', desc: '收货人、地址' },
{ key: 'confirm', title: '确认信息', desc: '商品清单与金额' },
{ key: 'pay', title: '支付', desc: '选择支付方式' }
],
form: {
name: '',
phone: ''
}
};
},
methods: {
next() {
if (this.validateCurrentStep()) {
if (this.active < this.steps.length - 1) {
this.active += 1;
} else {
this.submit();
}
}
},
prev() {
if (this.active > 0) {
this.active -= 1;
}
},
validateCurrentStep() {
if (this.active === 0 && !this.form.name) {
this.$toast('请填写姓名');
return false;
}
if (this.active === 1 && !this.form.phone) {
this.$toast('请填写手机号');
return false;
}
return true;
},
submit() {
this.$toast('提交成功');
}
}
};
</script>
这段代码的一个关键点在于 next 方法中先调用 validateCurrentStep,只有校验通过才会改变 active。如果用户在没有填写姓名的情况下点击下一步,页面会弹出提示,但步骤不会前进。这比单纯使用按钮的 loading 或 disabled 控制更直观,也能避免用户跳过必填步骤。
另一个值得注意的细节是步骤数组使用了稳定的 key,而不是直接用 index。当步骤数量不变时,用 index 作为 key 也能工作,但如果业务需要根据权限动态增删步骤,例如未登录用户少一个确认步骤,使用 item.key 可以保证组件复用不出错。动态步骤变更后,active 的最大值也要同步限制在 steps.length - 1 以内,防止步骤条出现没有节点的空白状态。
四、样式覆盖与可维护性建议
Vant2 的组件默认样式已经能满足大多数后台和中后台场景,但遇到品牌色、字号、图标大小等定制需求时,还是需要做样式覆盖。由于 Vue 单文件组件通常使用 scoped 样式,直接写 .van-step__title 不会命中内部节点,需要使用 ::v-deep 或 /deep/ 深度选择器。下面是一个局部覆盖的示例。
.order-steps ::v-deep .van-step__title {
font-size: 14px;
color: #333;
max-width: 90px;
}
.order-steps ::v-deep .van-step__circle-container {
transform: scale(0.9);
}
需要注意的是,样式覆盖尽量限定在页面级容器选择器下,不要直接覆盖 .van-step 这种全局类名,否则会影响其他页面或弹窗里的步骤条。如果多个页面都需要统一风格,可以把覆盖样式放到一个独立的公共样式文件中,并显式引入,而不是依赖组件选项的全局污染。
从可维护性角度看,步骤条的定义应当与业务状态解耦。步骤标题、描述文案可以放在局部常量或从接口返回,通过数组渲染,而不是在模板里硬编码多个 <van-step>。这样后续增加或删除步骤只需要改数据源,不需要改动模板结构。步骤条本身只负责展示当前进度,真正的流程推进应该由外层按钮、表单校验和服务端状态共同决定,避免把复杂的业务逻辑塞进步骤条的显示层。
总结来说,Vant2 Steps 的核心要点就是三个:active 从 0 开始、自定义图标要使用插槽而不是 icon 属性塞 URL、竖向布局要注意容器高度。把这些基础概念理顺,再配合颜色属性和动态步骤管理,常见的步骤条展示问题基本都能避免。
Vant2 Steps步骤条Vant2步骤条误区步骤条组件修改时间:2026-09-18 06:21:25