<template> <view class="uni-steps"> <view :class="[direction==='column'?'uni-steps__column':'uni-steps__row']"> <view :class="[direction==='column'?'uni-steps__column-text-container':'uni-steps__row-text-container']"> <view v-for="(item,index) in options" :key="index" :class="[direction==='column'?'uni-steps__column-text':'uni-steps__row-text']"> <text :style="{color:index === active?activeColor:deactiveColor}" :class="[direction==='column'?'uni-steps__column-title':'uni-steps__row-title']">{{item.title}}</text> <text :style="{color: deactiveColor}" :class="[direction==='column'?'uni-steps__column-desc':'uni-steps__row-desc']">{{item.desc}}</text> </view> </view> <view :class="[direction==='column'?'uni-steps__column-container':'uni-steps__row-container']"> <view :class="[direction==='column'?'uni-steps__column-line-item':'uni-steps__row-line-item']" v-for="(item,index) in options" :key="index"> <view :class="[direction==='column'?'uni-steps__column-line':'uni-steps__row-line',direction==='column'?'uni-steps__column-line--before':'uni-steps__row-line--before']" :style="{backgroundColor:index<=active&&index!==0?activeColor:index===0?'transparent':deactiveColor}"> </view> <view :class="[direction==='column'?'uni-steps__column-check':'uni-steps__row-check']" v-if="index === active"> <uni-icons :color="activeColor" :type="activeIcon" size="14"></uni-icons> </view> <view v-else :class="[direction==='column'?'uni-steps__column-circle':'uni-steps__row-circle']" :style="{backgroundColor:index<active?activeColor:deactiveColor}"></view> <view :class="[direction==='column'?'uni-steps__column-line':'uni-steps__row-line',direction==='column'?'uni-steps__column-line--after':'uni-steps__row-line--after']" :style="{backgroundColor:index<active&&index!==options.length-1?activeColor:index===options.length-1?'transparent':deactiveColor}"> </view> </view> </view> </view> </view> </template> <script> /** * Steps 步骤条 * @description 评分组件 * @tutorial https://ext.dcloud.net.cn/plugin?id=34 * @property {Number} active 当前步骤 * @property {String} direction = [row|column] 当前步骤 * @value row 横向 * @value column 纵向 * @property {String} activeColor 选中状态的颜色 * @property {Array} options 数据源,格式为:[{title:'xxx',desc:'xxx'},{title:'xxx',desc:'xxx'}] */ export default { name: 'UniSteps', props: { direction: { // 排列方向 row column type: String, default: 'row' }, activeColor: { // 激活状态颜色 type: String, default: '#2979FF' }, deactiveColor: { // 未激活状态颜色 type: String, default: '#B7BDC6' }, active: { // 当前步骤 type: Number, default: 0 }, activeIcon: { // 当前步骤 type: String, default: 'checkbox-filled' }, options: { type: Array, default () { return [] } } // 数据 }, data() { return {} } } </script> <style lang="scss"> $uni-primary: #2979ff !default; $uni-border-color:#EDEDED; .uni-steps { /* #ifndef APP-NVUE */ display: flex; width: 100%; /* #endif */ /* #ifdef APP-NVUE */ flex: 1; /* #endif */ flex-direction: column; } .uni-steps__row { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: column; } .uni-steps__column { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: row-reverse; } .uni-steps__row-text-container { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: row; align-items: flex-end; margin-bottom: 8px; } .uni-steps__column-text-container { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: column; flex: 1; } .uni-steps__row-text { /* #ifndef APP-NVUE */ display: inline-flex; /* #endif */ flex: 1; flex-direction: column; } .uni-steps__column-text { padding: 6px 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: $uni-border-color; /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: column; } .uni-steps__row-title { font-size: 14px; line-height: 16px; text-align: center; } .uni-steps__column-title { font-size: 14px; text-align: left; line-height: 18px; } .uni-steps__row-desc { font-size: 12px; line-height: 14px; text-align: center; } .uni-steps__column-desc { font-size: 12px; text-align: left; line-height: 18px; } .uni-steps__row-container { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: row; } .uni-steps__column-container { /* #ifndef APP-NVUE */ display: inline-flex; /* #endif */ width: 30px; flex-direction: column; } .uni-steps__row-line-item { /* #ifndef APP-NVUE */ display: inline-flex; /* #endif */ flex-direction: row; flex: 1; height: 14px; line-height: 14px; align-items: center; justify-content: center; } .uni-steps__column-line-item { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: column; flex: 1; align-items: center; justify-content: center; } .uni-steps__row-line { flex: 1; height: 1px; background-color: #B7BDC6; } .uni-steps__column-line { width: 1px; background-color: #B7BDC6; } .uni-steps__row-line--after { transform: translateX(1px); } .uni-steps__column-line--after { flex: 1; transform: translate(0px, 1px); } .uni-steps__row-line--before { transform: translateX(-1px); } .uni-steps__column-line--before { height: 6px; transform: translate(0px, -13px); } .uni-steps__row-circle { width: 5px; height: 5px; border-radius: 50%; background-color: #B7BDC6; margin: 0px 3px; } .uni-steps__column-circle { width: 5px; height: 5px; border-radius: 50%; background-color: #B7BDC6; margin: 4px 0px 5px 0px; } .uni-steps__row-check { margin: 0px 6px; } .uni-steps__column-check { height: 14px; line-height: 14px; margin: 2px 0px; } </style>