当前位置:首页 > 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 路由实现内部切换的方法 Vue Router 是 Vue.js 官方的路由管理器,用于实现单页应用(SPA)的页面切换。以下是几种常见的内部路由切换方式: 使用 <router-lin…

vue实现多用户登录

vue实现多用户登录

实现多用户登录的基本思路 在Vue中实现多用户登录通常需要结合后端API完成身份验证,并通过前端路由、状态管理(如Vuex或Pinia)和本地存储(如localStorage)来管理用户会话。以下是关…

vue组件实现

vue组件实现

Vue 组件实现基础 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。组件的实现包括定义、注册、数据传递和生命周期管理等。 定义组件 组件可以通过单文件组件(.…

vue datepicker 实现

vue datepicker 实现

实现 Vue Datepicker 的基本方法 在 Vue 项目中实现日期选择功能,可以使用第三方库如 vue-datepicker 或 v-calendar。以下是两种常见实现方式: 安装 vue…

vue实现div

vue实现div

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

vue实现autocomplete

vue实现autocomplete

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