当前位置:首页 > VUE

vue实现计时器

2026-01-22 03:32:47VUE

vue实现计时器

实现计时器的基本逻辑

在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 实现文件树的方法 使用递归组件 递归组件是处理嵌套数据结构的理想方式。文件树通常包含文件夹和文件的嵌套结构,适合用递归组件实现。 <template> <ul>…

vue登录业务的实现

vue登录业务的实现

实现登录业务的基本流程 在Vue中实现登录业务通常涉及前端界面设计、表单验证、API请求交互、状态管理以及路由控制等环节。以下是核心实现步骤: 登录表单设计与验证 创建包含用户名和密码输入框的登录组…

vue实现一个系统

vue实现一个系统

Vue 系统实现步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目: npm init vue@latest my-system 选择需要的配置(Router、Pinia 等)。…

实现vue模版

实现vue模版

Vue 模板的基本结构 Vue 模板基于 HTML 语法,通过 Vue 的指令和插值实现动态渲染。以下是一个基础模板示例: <template> <div id="app…

vue交互实现

vue交互实现

Vue 交互实现方法 Vue.js 提供了多种方式实现用户交互,包括事件处理、表单绑定、动态渲染等。以下是常见的交互实现方法: 事件处理 通过 v-on 或 @ 指令绑定事件,触发方法或直接执行表达…

vue实现主页

vue实现主页

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