当前位置:首页 > VUE

vue实现计时器

2026-01-22 03:32:47VUE

实现计时器的基本逻辑

在Vue中实现计时器通常需要利用setIntervalsetTimeout来更新计时状态,并通过Vue的响应式系统动态显示时间。计时器的核心是记录开始时间、暂停时间以及计算当前时间差。

使用Composition API实现

<template>
  <div>
    <p>{{ formattedTime }}</p>
    <button @click="startTimer">开始</button>
    <button @click="pauseTimer">暂停</button>
    <button @click="resetTimer">重置</button>
  </div>
</template>

<script setup>
import { ref, computed, onUnmounted } from 'vue';

const elapsedTime = ref(0);
const timerInterval = ref(null);
const isRunning = ref(false);

const formattedTime = computed(() => {
  const seconds = Math.floor(elapsedTime.value / 1000);
  const minutes = Math.floor(seconds / 60);
  const hours = Math.floor(minutes / 60);
  return `${hours.toString().padStart(2, '0')}:${(minutes % 60).toString().padStart(2, '0')}:${(seconds % 60).toString().padStart(2, '0')}`;
});

const startTimer = () => {
  if (isRunning.value) return;
  isRunning.value = true;
  const startTime = Date.now() - elapsedTime.value;
  timerInterval.value = setInterval(() => {
    elapsedTime.value = Date.now() - startTime;
  }, 1000);
};

const pauseTimer = () => {
  clearInterval(timerInterval.value);
  isRunning.value = false;
};

const resetTimer = () => {
  clearInterval(timerInterval.value);
  elapsedTime.value = 0;
  isRunning.value = false;
};

onUnmounted(() => {
  clearInterval(timerInterval.value);
});
</script>

使用Options API实现

<template>
  <div>
    <p>{{ formattedTime }}</p>
    <button @click="startTimer">开始</button>
    <button @click="pauseTimer">暂停</button>
    <button @click="resetTimer">重置</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      elapsedTime: 0,
      timerInterval: null,
      isRunning: false,
    };
  },
  computed: {
    formattedTime() {
      const seconds = Math.floor(this.elapsedTime / 1000);
      const minutes = Math.floor(seconds / 60);
      const hours = Math.floor(minutes / 60);
      return `${hours.toString().padStart(2, '0')}:${(minutes % 60).toString().padStart(2, '0')}:${(seconds % 60).toString().padStart(2, '0')}`;
    },
  },
  methods: {
    startTimer() {
      if (this.isRunning) return;
      this.isRunning = true;
      const startTime = Date.now() - this.elapsedTime;
      this.timerInterval = setInterval(() => {
        this.elapsedTime = Date.now() - startTime;
      }, 1000);
    },
    pauseTimer() {
      clearInterval(this.timerInterval);
      this.isRunning = false;
    },
    resetTimer() {
      clearInterval(this.timerInterval);
      this.elapsedTime = 0;
      this.isRunning = false;
    },
  },
  beforeUnmount() {
    clearInterval(this.timerInterval);
  },
};
</script>

实现倒计时功能

倒计时与正计时逻辑类似,但需要预设一个目标时间并从目标时间倒推。

<template>
  <div>
    <p>{{ formattedTime }}</p>
    <button @click="startCountdown">开始</button>
    <button @click="pauseCountdown">暂停</button>
    <button @click="resetCountdown">重置</button>
  </div>
</template>

<script setup>
import { ref, computed, onUnmounted } from 'vue';

const countdownTime = ref(60 * 1000); // 60秒倒计时
const remainingTime = ref(countdownTime.value);
const countdownInterval = ref(null);
const isRunning = ref(false);

const formattedTime = computed(() => {
  const seconds = Math.floor(remainingTime.value / 1000);
  return `${Math.floor(seconds / 60).toString().padStart(2, '0')}:${(seconds % 60).toString().padStart(2, '0')}`;
});

const startCountdown = () => {
  if (isRunning.value) return;
  isRunning.value = true;
  const endTime = Date.now() + remainingTime.value;
  countdownInterval.value = setInterval(() => {
    remainingTime.value = endTime - Date.now();
    if (remainingTime.value <= 0) {
      clearInterval(countdownInterval.value);
      remainingTime.value = 0;
      isRunning.value = false;
    }
  }, 1000);
};

const pauseCountdown = () => {
  clearInterval(countdownInterval.value);
  isRunning.value = false;
};

const resetCountdown = () => {
  clearInterval(countdownInterval.value);
  remainingTime.value = countdownTime.value;
  isRunning.value = false;
};

onUnmounted(() => {
  clearInterval(countdownInterval.value);
});
</script>

注意事项

  • 清除定时器:在组件卸载时务必清除定时器,避免内存泄漏。
  • 性能优化:计时器更新频率不宜过高(如1秒1次足够),避免频繁触发响应式更新。
  • 格式化时间:使用padStart确保时间显示为两位数格式(如01:05而非1:5)。

vue实现计时器

标签: 计时器vue
分享给朋友:

相关文章

vue实现用户信息表

vue实现用户信息表

Vue 实现用户信息表的方法 使用 Vue CLI 创建项目 安装 Vue CLI 并初始化项目: npm install -g @vue/cli vue create user-info-tabl…

vue 实现jqslidedown

vue 实现jqslidedown

在 Vue 中实现类似 jQuery 的 slideDown 效果,可以通过 Vue 的过渡系统或 CSS 动画结合动态样式绑定来实现。以下是几种实现方式: 使用 Vue Transition…

vue实现语音

vue实现语音

Vue 实现语音功能的方法 使用 Web Speech API Vue 可以结合 Web Speech API 实现语音识别和合成功能。Web Speech API 包含 SpeechRecognit…

vue实现主页

vue实现主页

Vue 实现主页的基本步骤 创建一个 Vue 主页通常涉及以下几个关键步骤,从项目初始化到页面布局和功能实现。 初始化 Vue 项目 使用 Vue CLI 或 Vite 初始化项目。Vue CLI…

vue 实现权限

vue 实现权限

Vue 实现权限控制的方法 在 Vue 项目中实现权限控制通常涉及前端路由、组件和按钮级别的权限管理。以下是几种常见的实现方式: 路由权限控制 通过路由守卫实现权限验证,过滤用户无权访问的路由:…

vue实现sso

vue实现sso

Vue 实现 SSO(单点登录)方案 单点登录(SSO)允许用户通过一次登录访问多个相关系统。以下是基于 Vue 的实现方案: 使用 OAuth2/OpenID Connect 协议 OAuth2…