当前位置:首页 > VUE

vue记录时长前端实现

2026-03-06 16:30:39VUE

Vue 前端实现时长记录功能

核心思路
通过 Vue 的响应式数据结合浏览器 API(如 Date 对象或 performance.now())实现计时功能,需考虑开始、暂停、继续和重置等操作。

实现步骤

1. 定义响应式数据
在 Vue 组件中定义计时相关数据:

data() {
  return {
    startTime: null,      // 开始时间戳
    elapsedTime: 0,       // 累计时长(毫秒)
    isRunning: false,     // 是否正在计时
    timerInterval: null   // 定时器引用
  };
}

2. 核心计时逻辑
使用 setInterval 更新当前时长:

vue记录时长前端实现

methods: {
  startTimer() {
    if (this.isRunning) return;
    this.isRunning = true;
    this.startTime = Date.now() - this.elapsedTime;
    this.timerInterval = setInterval(() => {
      this.elapsedTime = Date.now() - this.startTime;
    }, 10); // 10ms 更新一次,提高精度
  },

  pauseTimer() {
    clearInterval(this.timerInterval);
    this.isRunning = false;
  },

  resetTimer() {
    clearInterval(this.timerInterval);
    this.isRunning = false;
    this.elapsedTime = 0;
  }
}

3. 格式化显示时长
将毫秒转换为 HH:MM:SS 格式:

computed: {
  formattedTime() {
    const date = new Date(this.elapsedTime);
    return [
      date.getUTCHours().toString().padStart(2, '0'),
      date.getUTCMinutes().toString().padStart(2, '0'),
      date.getUTCSeconds().toString().padStart(2, '0')
    ].join(':');
  }
}

4. 模板绑定
在模板中绑定数据和事件:

vue记录时长前端实现

<template>
  <div>
    <div>当前时长:{{ formattedTime }}</div>
    <button @click="startTimer" :disabled="isRunning">开始</button>
    <button @click="pauseTimer" :disabled="!isRunning">暂停</button>
    <button @click="resetTimer">重置</button>
  </div>
</template>

高级优化

持久化记录
使用 localStorage 保存计时状态,避免页面刷新丢失:

mounted() {
  const savedTime = localStorage.getItem('elapsedTime');
  if (savedTime) this.elapsedTime = parseInt(savedTime);
},
watch: {
  elapsedTime(newVal) {
    localStorage.setItem('elapsedTime', newVal.toString());
  }
}

性能优化
替换 Date.now() 为更高精度的 performance.now()

this.startTime = performance.now() - this.elapsedTime;
this.timerInterval = setInterval(() => {
  this.elapsedTime = performance.now() - this.startTime;
}, 10);

多组件复用
通过 Mixin 或自定义 Hook 复用逻辑(Vue 3):

// useTimer.js (Composition API)
import { ref, computed, onUnmounted } from 'vue';

export default function useTimer() {
  const elapsedTime = ref(0);
  const isRunning = ref(false);
  let startTime = null;
  let timerInterval = null;

  const start = () => {
    if (isRunning.value) return;
    isRunning.value = true;
    startTime = Date.now() - elapsedTime.value;
    timerInterval = setInterval(() => {
      elapsedTime.value = Date.now() - startTime;
    }, 10);
  };

  // 其他方法(pause/reset)...
  onUnmounted(() => clearInterval(timerInterval));

  return { elapsedTime, isRunning, start };
}

注意事项

  • 内存泄漏:组件销毁时需清除定时器(beforeUnmount 钩子)。
  • 精度选择:根据需求调整 setInterval 的间隔(如 1s 级更新可降低性能消耗)。
  • 跨标签页同步:通过 BroadcastChannel API 实现多标签页状态同步。

标签: 时长vue
分享给朋友:

相关文章

vue实现autocomplete

vue实现autocomplete

Vue 实现 Autocomplete 功能 Vue 中实现 Autocomplete(自动完成)功能可以通过自定义组件或使用现有库完成。以下是几种常见方法: 方法一:使用 Vue 原生实现 创建…

vue实现订单

vue实现订单

Vue 实现订单功能 订单数据结构设计 订单数据通常包含以下字段: order: { id: String, // 订单ID userId: String,…

vue 全景实现

vue 全景实现

Vue 全景实现方案 在Vue中实现全景效果,通常需要结合WebGL或第三方库来处理3D场景渲染。以下是几种常见方法: 使用Three.js库 Three.js是一个强大的WebGL库,适合创建3D…

vue 实现报价

vue 实现报价

Vue 实现报价功能 在 Vue 中实现报价功能通常涉及前端表单交互、数据计算和与后端 API 的通信。以下是实现报价功能的几种常见方法: 表单设计与数据绑定 使用 Vue 的 v-model 指…

vue 实现音乐

vue 实现音乐

Vue 实现音乐播放功能 在 Vue 中实现音乐播放功能,可以通过 HTML5 的 <audio> 元素或第三方库如 howler.js 来实现。以下是两种方法的详细步骤: 使用 HTM…

vue实现keepalive

vue实现keepalive

Vue 中实现 keep-alive 在 Vue 中,keep-alive 是一个内置组件,用于缓存动态组件或组件的状态,避免重复渲染和销毁。以下是实现 keep-alive 的几种方法: 基本用法…