当前位置:首页 > VUE

vue记录时长前端实现

2026-01-12 03:44:22VUE

Vue 前端实现时长记录功能

核心思路
通过 Date 对象或 performance.now() 记录开始/结束时间戳,计算差值后格式化为可读时间。

vue记录时长前端实现

基础实现方案(基于 Composition API)

// 组件内
import { ref, onUnmounted } from 'vue';

const startTime = ref(null);
const duration = ref(0);
let timer = null;

// 开始计时
const startTimer = () => {
  startTime.value = new Date();
  timer = setInterval(() => {
    duration.value = Math.floor((new Date() - startTime.value) / 1000);
  }, 1000);
};

// 停止计时
const stopTimer = () => {
  clearInterval(timer);
  const endTime = new Date();
  console.log(`总时长:${(endTime - startTime.value) / 1000}秒`);
};

onUnmounted(stopTimer); // 组件卸载时自动停止

高级封装(可复用 Hook)

// useTimer.js
import { ref, onUnmounted } from 'vue';

export default function useTimer() {
  const startTime = ref(null);
  const duration = ref(0);
  let timer = null;

  const start = () => {
    startTime.value = performance.now(); // 更高精度
    timer = setInterval(() => {
      duration.value = Math.floor((performance.now() - startTime.value) / 1000);
    }, 1000);
  };

  const stop = () => {
    clearInterval(timer);
    return (performance.now() - startTime.value) / 1000;
  };

  onUnmounted(stop);

  return { duration, start, stop };
}

组件中使用:

vue记录时长前端实现

const { duration, start, stop } = useTimer();

时间格式化显示

// utils/formatTime.js
export function formatDuration(seconds) {
  const h = Math.floor(seconds / 3600);
  const m = Math.floor((seconds % 3600) / 60);
  const s = seconds % 60;
  return `${h}h ${m}m ${s}s`;
}

持久化存储方案

结合 localStorage:

// 存储记录
localStorage.setItem('lastDuration', duration.value);

// 读取记录
const lastDuration = localStorage.getItem('lastDuration');

注意事项:

  • 精度选择:performance.now()Date 更适合短时长测量
  • 内存泄漏:务必在组件卸载时清除定时器
  • 暂停功能:可通过记录累计时间实现

完整组件示例

<template>
  <div>
    <button @click="start">开始</button>
    <button @click="stop">停止</button>
    <p>已持续:{{ formattedTime }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import useTimer from './useTimer';
import { formatDuration } from './utils/formatTime';

const { duration, start, stop } = useTimer();
const formattedTime = ref('0s');

watch(duration, (val) => {
  formattedTime.value = formatDuration(val);
});
</script>

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

相关文章

vue实现computed

vue实现computed

Vue 中 computed 的实现原理 computed 属性是 Vue 的一个核心特性,它基于响应式依赖进行缓存,仅在依赖发生变化时重新计算。以下是 computed 的实现方式: 基本用法 在…

vue实现框选

vue实现框选

Vue 实现框选功能 在 Vue 中实现框选功能通常需要监听鼠标事件,计算选区范围,并根据选区范围高亮或选中元素。以下是实现框选功能的关键步骤。 监听鼠标事件 在 Vue 模板中,为容器元素绑定鼠标…

vue实现幻灯

vue实现幻灯

Vue实现幻灯片的基础方法 使用Vue实现幻灯片功能可以通过多种方式完成,以下是几种常见方案: 方案一:基于Vue的过渡动画 通过Vue的<transition>或<transit…

vue 实现templateurl

vue 实现templateurl

在 Vue 中,templateUrl 是 Angular 中的一个概念,用于指定外部 HTML 文件作为模板。Vue 本身不直接支持 templateUrl,但可以通过以下方法实现类似功能: 使用…

vue广播实现

vue广播实现

vue广播实现 在Vue中实现广播功能可以通过事件总线(Event Bus)或Vuex来完成。以下是两种常见的实现方式: 使用事件总线(Event Bus) 事件总线是一种简单的跨组件通信方式,适用…

vue 实现路径

vue 实现路径

在 Vue 中实现路径管理通常涉及路由配置、动态路由、嵌套路由等场景,以下是具体实现方法: 基础路由配置 安装 Vue Router 并创建路由实例: npm install vue-router…