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

Vue.js实现基于创建日期的动态流逝时间实时更新求助

问题描述

在Laravel Blade页面中展示基于创建日期的流逝时间,但每次需要手动刷新才能更新。现有逻辑是将控制器传入的created_at传给Vue的setTimer方法计算时分秒,但尝试用setInterval实现实时更新失败,需要实现动态实时刷新的流逝时间。

解决方案

1. 调整Vue数据结构

在Vue的data中新增对象存储实时流逝时间,确保视图能响应数据变化:

data: {
  records: { data: [] }, // 保留原有records数据
  elapsedTimes: {}, // 键为记录唯一标识(如id),值为格式化后的流逝时间
  elapsedTimer: null // 存储定时器ID,用于后续清除
},

2. 重构时间计算逻辑

拆分原setTimer方法为纯计算函数和定时器控制函数,保证逻辑清晰可复用:

methods: {
  // 保留原有其他方法...
  
  // 计算单条记录的流逝时间
  calculateElapsedTime(createdAt) {
    const startDate = new Date(createdAt);
    const now = new Date();
    const elapsedSeconds = Math.floor((now - startDate) / 1000);
    
    const hours = Math.floor(elapsedSeconds / 3600);
    const minutes = Math.floor((elapsedSeconds % 3600) / 60);
    const seconds = elapsedSeconds % 60;

    return `${hours}h ${minutes}m ${seconds}s`;
  },

  // 启动/重启流逝时间更新定时器
  updateElapsedTimes() {
    // 清除旧定时器,避免重复执行
    if (this.elapsedTimer) clearInterval(this.elapsedTimer);
    
    // 初始化所有记录的流逝时间
    this.records.data.forEach(row => {
      this.$set(this.elapsedTimes, row.id, this.calculateElapsedTime(row.created_at));
    });

    // 每秒更新一次
    this.elapsedTimer = setInterval(() => {
      this.records.data.forEach(row => {
        this.$set(this.elapsedTimes, row.id, this.calculateElapsedTime(row.created_at));
      });
    }, 1000);
  }
},

使用$set是因为Vue无法直接检测对象新增属性的变化,确保数据更新后视图自动重渲染。

3. 初始化定时器

在数据加载完成后启动定时器,修改ready钩子(Vue 2.x推荐替换为mounted):

ready: function () {
  this.onReload();
  // 启动时间更新
  this.updateElapsedTimes();
},

// 组件销毁时清除定时器,防止内存泄漏
beforeDestroy() {
  if (this.elapsedTimer) clearInterval(this.elapsedTimer);
}

若records.data是异步加载(如接口请求),需在onReload方法的数据更新完成后调用updateElapsedTimes,确保定时器基于最新数据执行。

4. 修改Blade模板绑定

将原模板中调用setTimer的部分,改为直接绑定elapsedTimes中的对应值:

<td>
  @{{ elapsedTimes[row.id] || '0h 0m 0s' }}
</td>

添加默认值是为了避免初始化完成前显示空白。

关键说明

  • 确保每条记录有唯一的id字段作为elapsedTimes的键,若没有唯一标识,可临时用循环index替代,但需注意记录顺序变化可能导致的显示错误。
  • 每秒执行一次定时器是平衡实时性和性能的最优选择,无需更短的间隔。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:57:41