当前位置:首页 > 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>

实现倒计时功能

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

vue实现计时器

<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 中实现文档导入功能通常涉及文件上传、解析和处理。以下是几种常见的方法: 使用原生文件输入和 FileReader 通过 HTML 的原生 <input…

vue卖座网实现

vue卖座网实现

Vue 卖座网实现 项目结构搭建 使用 Vue CLI 快速初始化项目,安装必要依赖如 Vue Router、Vuex、Axios。 创建核心目录结构:components(通用组件)、views(页…

vue实现拖放

vue实现拖放

Vue 实现拖放功能 Vue 中实现拖放功能通常可以通过 HTML5 的原生拖放 API 或第三方库(如 vuedraggable)来实现。以下是两种方法的详细说明。 使用 HTML5 原生拖放 A…

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue实现阻塞

vue实现阻塞

Vue 实现阻塞的方法 在 Vue 中实现阻塞操作通常涉及异步控制、状态管理或生命周期钩子的使用。以下是几种常见方法: 使用 async/await 处理异步阻塞 通过 async/await 可…

vue实现幻灯

vue实现幻灯

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