当前位置:首页 > VUE

用vue实现秒表应用

2026-02-20 17:14:00VUE

实现秒表功能

创建Vue组件Stopwatch.vue,定义数据属性time(记录时间)、isRunning(状态标识)和timer(存储计时器)。使用setInterval实现计时逻辑,通过padStart方法格式化显示时间。

<template>
  <div class="stopwatch">
    <div class="display">{{ formattedTime }}</div>
    <button @click="start" :disabled="isRunning">Start</button>
    <button @click="stop" :disabled="!isRunning">Stop</button>
    <button @click="reset">Reset</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      time: 0,
      isRunning: false,
      timer: null
    }
  },
  computed: {
    formattedTime() {
      const minutes = Math.floor(this.time / 60000)
      const seconds = Math.floor((this.time % 60000) / 1000)
      const milliseconds = Math.floor((this.time % 1000) / 10)
      return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${milliseconds.toString().padStart(2, '0')}`
    }
  },
  methods: {
    start() {
      if (!this.isRunning) {
        this.isRunning = true
        this.timer = setInterval(() => {
          this.time += 10
        }, 10)
      }
    },
    stop() {
      if (this.isRunning) {
        clearInterval(this.timer)
        this.isRunning = false
      }
    },
    reset() {
      this.stop()
      this.time = 0
    }
  },
  beforeDestroy() {
    clearInterval(this.timer)
  }
}
</script>

添加样式增强体验

在组件中添加CSS样式,优化视觉呈现和交互效果。使用Flex布局居中显示,为按钮添加悬停效果。

<style scoped>
.stopwatch {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1rem;
  font-family: Arial, sans-serif;
}

.display {
  font-size: 3rem;
  font-weight: bold;
  color: #333;
}

button {
  padding: 0.5rem 1rem;
  font-size: 1rem;
  cursor: pointer;
  background-color: #4CAF50;
  color: white;
  border: none;
  border-radius: 4px;
  transition: background-color 0.3s;
}

button:hover {
  background-color: #45a049;
}

button:disabled {
  background-color: #cccccc;
  cursor: not-allowed;
}
</style>

扩展功能实现分段计时

增加分段计时功能,允许用户记录多个时间点。添加laps数组存储分段数据,并实现相关UI展示。

<template>
  <div class="stopwatch">
    <!-- 原有模板内容 -->
    <button @click="recordLap" :disabled="!isRunning">Lap</button>
    <div class="laps" v-if="laps.length > 0">
      <h3>Laps:</h3>
      <ul>
        <li v-for="(lap, index) in laps" :key="index">
          Lap {{ index + 1 }}: {{ formatTime(lap) }}
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      // 原有数据
      laps: []
    }
  },
  methods: {
    // 原有方法
    recordLap() {
      this.laps.push(this.time)
    },
    formatTime(time) {
      // 与computed中相同的格式化逻辑
    }
  }
}
</script>

<style scoped>
/* 新增样式 */
.laps {
  margin-top: 1rem;
  width: 100%;
  max-height: 200px;
  overflow-y: auto;
}

ul {
  list-style-type: none;
  padding: 0;
}

li {
  padding: 0.5rem;
  border-bottom: 1px solid #eee;
}
</style>

使用Composition API重构

对于Vue 3项目,可以使用Composition API实现更简洁的代码组织。通过setup()函数和ref响应式变量重构组件。

用vue实现秒表应用

<script>
import { ref, computed, onBeforeUnmount } from 'vue'

export default {
  setup() {
    const time = ref(0)
    const isRunning = ref(false)
    const timer = ref(null)
    const laps = ref([])

    const formattedTime = computed(() => {
      const minutes = Math.floor(time.value / 60000)
      const seconds = Math.floor((time.value % 60000) / 1000)
      const milliseconds = Math.floor((time.value % 1000) / 10)
      return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${milliseconds.toString().padStart(2, '0')}`
    })

    const start = () => {
      if (!isRunning.value) {
        isRunning.value = true
        timer.value = setInterval(() => {
          time.value += 10
        }, 10)
      }
    }

    const stop = () => {
      if (isRunning.value) {
        clearInterval(timer.value)
        isRunning.value = false
      }
    }

    const reset = () => {
      stop()
      time.value = 0
      laps.value = []
    }

    const recordLap = () => {
      laps.value.push(time.value)
    }

    onBeforeUnmount(() => {
      clearInterval(timer.value)
    })

    return {
      time,
      isRunning,
      laps,
      formattedTime,
      start,
      stop,
      reset,
      recordLap
    }
  }
}
</script>

标签: 秒表vue
分享给朋友:

相关文章

vue聊天实现

vue聊天实现

Vue 聊天应用实现步骤 创建 Vue 项目 使用 Vue CLI 或 Vite 初始化项目,安装必要依赖(如 Vue 3、Element UI 或 Vuetify 用于 UI 组件)。 npm c…

vue实现高亮

vue实现高亮

Vue 实现文本高亮的方法 在 Vue 中实现文本高亮可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-html 指令 通过 v-html 指令可以动态插入 HTML 内容,将需要高…

vue轮询实现

vue轮询实现

Vue 轮询实现方法 在 Vue 中实现轮询可以通过以下几种方式: 使用 setInterval data() { return { pollInterval: null } },…

vue 实现打印

vue 实现打印

Vue 实现打印功能的方法 在Vue项目中实现打印功能,可以通过以下几种方式实现: 使用window.print()方法 通过调用浏览器的原生打印API实现基础打印功能,适用于简单内容打印。 //…

vue 实现轮播

vue 实现轮播

Vue 实现轮播的方法 使用第三方库(如 Swiper) 安装 Swiper 库: npm install swiper 在 Vue 组件中引入 Swiper: <template>…

vue实现拖拉

vue实现拖拉

实现拖拽功能的基本步骤 在Vue中实现拖拽功能可以通过原生HTML5的拖放API或第三方库如vuedraggable完成。以下是两种方法的详细说明。 使用HTML5原生拖放API HTML5提供了原…