当前位置:首页 > 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中实现皮肤切换功能,通常涉及动态修改CSS变量或类名。核心是通过状态管理当前主题,并在组件中应用对应的样式。 使用CSS变量实现主题切换 CSS变量(自定义属性)是实…

vue前端实现登录

vue前端实现登录

实现登录功能的基本流程 使用Vue实现登录功能需要结合前端框架和后端API交互。以下是一个典型的实现方案: 安装必要依赖 确保项目已安装axios用于HTTP请求: npm install a…

vue怎么实现动画

vue怎么实现动画

Vue 动画实现方法 Vue 提供了多种方式实现动画效果,包括内置过渡系统、第三方库集成以及 CSS 动画。以下是常见实现方法: 使用 Vue 过渡系统 通过 <transition>…

vue实现好友列表

vue实现好友列表

实现好友列表的Vue组件 数据准备 在Vue组件的data中定义好友列表数据,通常是一个数组对象,每个对象包含好友的基本信息如ID、头像、昵称等。 data() { return {…

vue实现文字播放栏

vue实现文字播放栏

Vue 实现文字播放栏(跑马灯效果) 方法一:使用 CSS 动画 + Vue 数据绑定 通过 CSS 的 @keyframes 实现动画效果,结合 Vue 的动态数据绑定控制内容。 <tem…

vue穿梭框组件实现

vue穿梭框组件实现

实现基础穿梭框组件 在Vue中实现穿梭框组件,可以使用<el-transfer>(Element UI)或手动实现。以下是手动实现的核心逻辑: <template> &…