当前位置:首页 > 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 更新当前时长:

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. 模板绑定
在模板中绑定数据和事件:

<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):

vue记录时长前端实现

// 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实现路由导航

vue实现路由导航

路由导航的实现方式 在Vue中,路由导航主要通过Vue Router实现。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。 基本路由配置 安装Vue Router后…

vue实现上移下移插件

vue实现上移下移插件

实现上移下移功能的 Vue 插件 在 Vue 中实现列表项的上移和下移功能,可以通过自定义指令或组件封装的方式完成。以下是两种常见实现方式: 基于数组操作的通用方法 通过操作数组索引实现元素位置交换…

vue实现积分

vue实现积分

Vue 实现积分功能 在 Vue 中实现积分功能通常涉及前端展示、交互逻辑以及与后端 API 的通信。以下是常见的实现方法和步骤: 积分展示组件 创建一个积分展示组件,用于显示当前用户的积分。可以使…

vue实现div

vue实现div

Vue 实现 DIV 元素的方法 在 Vue 中实现 DIV 元素可以通过多种方式,以下是几种常见的实现方法: 使用模板语法 在 Vue 的模板中直接使用 HTML 的 <div> 标签…

vue实现alert

vue实现alert

实现自定义 Alert 组件 在 Vue 中可以通过组件化方式实现自定义 Alert 弹窗。以下是基于 Vue 3 的实现示例: 组件代码 (Alert.vue) <template>…

vue实现滑块

vue实现滑块

Vue 实现滑块组件的方法 使用原生 HTML 和 Vue 指令 通过 Vue 的 v-model 和事件监听实现基础滑块功能。创建一个包含 input 元素的组件,类型设置为 range,并绑定到…