You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vuetify 2中如何拆分v-progress-linear为4段?求实现方案

Vuetify 2 v-table 实现分段上色进度条方案

完全可以不用额外工具包,靠 Vue 计算属性 + 原生 CSS 就能搞定,下面是具体实现思路:

核心思路

先把剩余时长转换成对应的进度段数,再根据段数是否≤4来决定分段上色规则,最后用 flex 容器渲染分段进度条。

1. 数据预处理(计算属性)

在组件里定义计算属性,把从 store 获取的剩余时长转换成分段数据:

computed: {
  progressSegments() {
    // 定义每段对应的时长(比如每段代表1小时,根据你的业务调整)
    const segmentDuration = 1;
    // 从store拿到用户剩余时长
    const remainingTime = this.$store.state.user.remainingTime;
    // 计算总段数(向上取整)
    const totalSegments = Math.ceil(remainingTime / segmentDuration);
    
    const segments = [];
    if (totalSegments <= 4) {
      // 自定义≤4段时的上色规则,按段数顺序用不同颜色
      const colorRules = ['#ff4444', '#ffbb33', '#00C851', '#33b5e5'];
      
      for (let i = 0; i < totalSegments; i++) {
        // 最后一段如果是部分填充,计算实际宽度比例
        const segmentWidth = i === totalSegments - 1 
          ? `${(remainingTime % segmentDuration) / segmentDuration * 100}%` 
          : '100%';
        
        segments.push({
          width: segmentWidth,
          color: colorRules[i]
        });
      }
      
      // 可选:如果需要填满4段容器,补充透明空白段
      while (segments.length < 4) {
        segments.push({ width: '100%', color: 'transparent' });
      }
    } else {
      // 超过4段时统一用同一种颜色
      const unifiedColor = '#ff4444';
      // 计算完整段数和最后一段的宽度
      const fullSegments = Math.floor(remainingTime / segmentDuration);
      const partialWidth = (remainingTime % segmentDuration) / segmentDuration * 100;
      
      for (let i = 0; i < fullSegments; i++) {
        segments.push({ width: '100%', color: unifiedColor });
      }
      // 处理剩余的部分时长段
      if (partialWidth > 0) {
        segments.push({ width: `${partialWidth}%`, color: unifiedColor });
      }
    }
    return segments;
  }
}

2. 在v-table中渲染分段进度条

在v-table的对应列插槽里,用flex容器渲染分段:

<template v-slot:item.remainingTime="{ item }">
  <div class="progress-container" style="display: flex; height: 8px; border-radius: 4px; overflow: hidden; width: 100%;">
    <div 
      v-for="(seg, idx) in progressSegments" 
      :key="idx"
      class="progress-segment"
      :style="{ width: seg.width, backgroundColor: seg.color }"
    ></div>
  </div>
</template>

补充说明

  • 如果一定要复用v-progress-linear组件,也可以把每个分段换成单独的v-progress-linear,设置width和color属性,不过自定义div的方式更轻量灵活。
  • 上色规则、每段时长都可以根据业务需求调整,比如把颜色换成Vuetify的主题色类(如primary、warning),直接绑定class即可。
  • 从store取数据的逻辑保持原有写法,计算属性里直接读取store状态就行。

内容的提问来源于stack exchange,提问作者Deniz Ozak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:15:42