当前位置:首页 > VUE

vue实现秒表组件

2026-02-17 05:10:47VUE

实现思路

使用Vue的响应式特性,通过data属性记录当前时间、计时状态及间隔ID。核心逻辑包括开始、暂停、继续和重置功能,利用setInterval实现计时更新。

vue实现秒表组件

基础代码结构

<template>
  <div class="stopwatch">
    <div class="display">{{ formattedTime }}</div>
    <button @click="start" :disabled="isRunning">开始</button>
    <button @click="pause" :disabled="!isRunning">暂停</button>
    <button @click="reset" :disabled="!hasStarted">重置</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      startTime: 0,
      elapsedTime: 0,
      isRunning: false,
      intervalId: null,
      hasStarted: false
    };
  },
  computed: {
    formattedTime() {
      const ms = this.elapsedTime % 1000;
      const seconds = Math.floor(this.elapsedTime / 1000) % 60;
      const minutes = Math.floor(this.elapsedTime / 60000) % 60;
      const hours = Math.floor(this.elapsedTime / 3600000);

      return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${ms.toString().padStart(3, '0')}`;
    }
  },
  methods: {
    start() {
      this.startTime = Date.now() - this.elapsedTime;
      this.isRunning = true;
      this.hasStarted = true;
      this.intervalId = setInterval(this.updateTime, 10);
    },
    pause() {
      clearInterval(this.intervalId);
      this.isRunning = false;
    },
    reset() {
      clearInterval(this.intervalId);
      this.elapsedTime = 0;
      this.isRunning = false;
      this.hasStarted = false;
    },
    updateTime() {
      this.elapsedTime = Date.now() - this.startTime;
    }
  },
  beforeDestroy() {
    clearInterval(this.intervalId);
  }
};
</script>

<style scoped>
.stopwatch {
  text-align: center;
  font-family: monospace;
}
.display {
  font-size: 2em;
  margin-bottom: 10px;
}
button {
  margin: 0 5px;
  padding: 5px 10px;
}
</style>

功能扩展

添加分段计时功能
data中新增laps数组,并添加记录分段的方法:

vue实现秒表组件

data() {
  return {
    laps: []
  };
},
methods: {
  recordLap() {
    this.laps.push(this.formattedTime);
  }
}

优化性能
使用requestAnimationFrame替代setInterval

start() {
  this.startTime = Date.now() - this.elapsedTime;
  this.isRunning = true;
  const update = () => {
    if (this.isRunning) {
      this.elapsedTime = Date.now() - this.startTime;
      requestAnimationFrame(update);
    }
  };
  requestAnimationFrame(update);
}

注意事项

  1. 清除定时器:在组件销毁前通过beforeDestroy钩子清除定时器,避免内存泄漏。
  2. 时间精度:根据需求调整setInterval的间隔(如10ms),更高精度需使用performance.now()
  3. 状态管理:通过isRunninghasStarted控制按钮的禁用状态,避免逻辑冲突。

标签: 秒表组件
分享给朋友:

相关文章

vue实现多级组件

vue实现多级组件

Vue 多级组件实现方法 在 Vue 中实现多级组件通常涉及父子组件通信、动态组件或递归组件等技术。以下是几种常见实现方式: 父子组件嵌套 通过逐层嵌套组件实现多级结构,适用于固定层级场景:…

vue组件实现

vue组件实现

Vue 组件实现 Vue 组件是 Vue.js 的核心特性之一,允许开发者将 UI 拆分为独立、可复用的模块。以下是实现 Vue 组件的几种常见方式: 单文件组件(SFC) 单文件组件是 Vue 中…

react组件如何通讯

react组件如何通讯

React 组件通讯方式 React 组件间的通讯方式主要包括以下几种方法,适用于不同场景下的数据传递和状态管理需求。 父子组件通讯(Props 传递) 父组件通过 props 向子组件传递数据或回…

uniapp 滑动组件

uniapp 滑动组件

uniapp 滑动组件实现方法 使用swiper组件 uniapp内置的swiper组件可以实现滑动效果,适用于轮播图或页面切换场景。 示例代码: <swiper :indicator-d…

vue实现组件切换

vue实现组件切换

Vue 组件切换的实现方法 在 Vue 中实现组件切换有多种方式,以下是几种常见的方法: 动态组件 使用 Vue 内置的 <component> 元素和 is 属性可以动态切换组件:…

vue实现search组件

vue实现search组件

Vue 实现搜索组件 基础实现 创建一个基础的搜索组件需要包含输入框和搜索逻辑。以下是一个简单的实现示例: <template> <div class="search-cont…