当前位置:首页 > 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实现滑动输入条

用vue实现滑动输入条

使用 Vue 实现滑动输入条 使用原生 HTML5 input range 实现 在 Vue 模板中直接使用 <input type="range">,通过 v-model 绑定数据:…

vue实现iframe

vue实现iframe

Vue 中实现 iframe 的方法 在 Vue 项目中,可以通过多种方式实现 iframe 的嵌入。以下是几种常见的方法: 使用原生 HTML iframe 标签 直接在 Vue 组件的模板中使用…

jq 实现 vue

jq 实现 vue

jq 实现 Vue 的核心功能 jq 是一个轻量级的 JavaScript 库,主要用于 DOM 操作和事件处理。虽然它不能完全替代 Vue,但可以通过一些技巧模拟 Vue 的核心功能,如数据绑定、事…

vue 路由 实现

vue 路由 实现

Vue 路由实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue 路由的详细步骤: 安装 Vue Router 通过 npm 或 ya…

vue实现截图

vue实现截图

Vue 实现截图的方法 使用 html2canvas 库 安装 html2canvas 库: npm install html2canvas 在 Vue 组件中使用: import html2ca…

vue架构实现

vue架构实现

Vue 架构实现核心方案 Vue.js 的架构实现通常围绕模块化、组件化和状态管理展开。以下为常见实现方案: 基于单文件组件(SFC)的模块化 通过 .vue 文件组织模板、脚本和样式: <…