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

Vue如何实现时长累加并按XhXXm格式进行显示

实现方案

核心思路确认

你提到的先统一用分钟作为数值存储、再拆分格式用于UI展示的思路完全正确,是这类时间累加需求的标准实现方式,避免多单位混合计算出错,后续扩展也更灵活。

修改步骤

  1. 调整存储变量
    把原来存储格式化字符串的timeSpent改成存储总分钟数的数字类型变量,初始值为0。
  2. 修改累加方法
    点击时不再直接赋值,而是把传入的分钟数累加到总时长变量上。
  3. 新增格式化计算属性
    通过Vue计算属性自动把总分钟数转换成你需要的XhXXm格式,不用手动维护展示字符串。

完整修改后代码

模板部分(新增展示位示例)

<!-- 时长展示位 -->
<div>总时长:{{ formattedTime }}</div>

<ul class="time-list">
   <li style="margin-right:2px;"><a href="#" @click.prevent="addTime(15)">+15m</a></li><span>|</span>
   <li style="margin-right:2px;"><a href="#" @click.prevent="addTime(30)">+30m</a></li><span>|</span>
   <li style="margin-right:2px;"><a href="#" @click.prevent="addTime(45)">+45m</a></li><span>|</span>
   <li style="margin-right:2px;"><a href="#" @click.prevent="addTime(60)">+1h</a></li><span>|</span>
   <li><a href="#">---</a></li>
</ul>

注:加了.prevent修饰符阻止a标签默认跳转行为

逻辑部分

export default {
  data () {
    return {
        // 存储总分钟数,数字类型方便计算
        totalMinutes: 0,
    }
  },
  computed: {
    formattedTime() {
      const hours = Math.floor(this.totalMinutes / 60)
      const minutes = this.totalMinutes % 60
      // 按需拼接格式
      if (hours === 0) {
        return `${minutes}m`
      }
      // 分钟小于10自动补0,比如1h05m
      return `${hours}h${minutes.toString().padStart(2, '0')}m`
    }
  },
  methods: {
    addTime(time){
       this.totalMinutes += time
       // 如果需要加时长上限,比如最多8小时,可以在这里加判断
       // this.totalMinutes = Math.min(this.totalMinutes, 8*60)
    },
  }
}

扩展说明

如果需要重置时长,只要新增一个方法把totalMinutes设为0即可,计算属性会自动更新展示内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 08:42:01