当前位置:首页 > VUE

vue实现秒表组件

2026-02-17 05:10:47VUE

实现思路

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

基础代码结构

<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数组,并添加记录分段的方法:

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

优化性能
使用requestAnimationFrame替代setInterval

vue实现秒表组件

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 组件可以通过多种方式实现,主要包括单文件组件(SFC)、全局注册和局部注册。以下是常见的实现方法: 单文件组件(SFC) 单文件组件是 Vue 最推荐的组件化开发方式…

vue 组件实现 遮罩

vue 组件实现 遮罩

Vue 组件实现遮罩层的方法 基础遮罩层实现 创建一个简单的遮罩层组件,使用绝对定位覆盖整个视口。以下是一个基础实现: <template> <div class="mask"…

vue 实现树组件

vue 实现树组件

Vue 树形组件实现 基础树形结构实现 使用递归组件实现树形结构,核心是通过组件自身调用自身渲染嵌套数据。 <template> <ul> <li v-fo…

vue实现图片组件

vue实现图片组件

Vue 实现图片组件的方法 基础图片组件实现 创建一个基础的图片组件,支持动态传入图片路径和替代文本。在Vue项目中新建一个ImageComponent.vue文件: <template>…

vue 组件实现原理

vue 组件实现原理

Vue 组件实现原理 Vue 组件的实现原理主要基于以下几个核心机制: 组件注册与定义 Vue 组件可以通过 Vue.component 全局注册或局部注册。组件定义通常包含模板(template)…

权限 vue组件 实现

权限 vue组件 实现

权限 Vue 组件实现 在 Vue 中实现权限控制通常涉及前端路由守卫、动态菜单渲染和按钮级权限控制。以下是几种常见的实现方法: 基于路由守卫的权限控制 通过全局前置守卫 beforeEach 校验…