当前位置:首页 > VUE

vue 实现多个倒计

2026-02-19 17:38:18VUE

实现多个独立倒计时

在Vue中实现多个独立倒计时可以通过v-for循环渲染多个计时器组件,每个组件管理自己的倒计时状态。以下是实现方式:

<template>
  <div>
    <div v-for="(timer, index) in timers" :key="index">
      <p>倒计时 {{ index + 1 }}: {{ formatTime(timer.remaining) }}</p>
      <button @click="startTimer(index)">开始</button>
      <button @click="pauseTimer(index)">暂停</button>
      <button @click="resetTimer(index)">重置</button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      timers: [
        { remaining: 60, interval: null, isRunning: false },
        { remaining: 120, interval: null, isRunning: false },
        { remaining: 180, interval: null, isRunning: false }
      ]
    }
  },
  methods: {
    formatTime(seconds) {
      const mins = Math.floor(seconds / 60)
      const secs = seconds % 60
      return `${mins}:${secs < 10 ? '0' : ''}${secs}`
    },
    startTimer(index) {
      if (this.timers[index].isRunning) return

      this.timers[index].isRunning = true
      this.timers[index].interval = setInterval(() => {
        if (this.timers[index].remaining > 0) {
          this.timers[index].remaining--
        } else {
          clearInterval(this.timers[index].interval)
          this.timers[index].isRunning = false
        }
      }, 1000)
    },
    pauseTimer(index) {
      clearInterval(this.timers[index].interval)
      this.timers[index].isRunning = false
    },
    resetTimer(index) {
      this.pauseTimer(index)
      this.timers[index].remaining = [60, 120, 180][index]
    }
  },
  beforeDestroy() {
    this.timers.forEach(timer => {
      clearInterval(timer.interval)
    })
  }
}
</script>

使用计算属性优化显示

添加计算属性可以更好地管理时间格式显示:

computed: {
  formattedTimers() {
    return this.timers.map(timer => {
      return {
        ...timer,
        display: this.formatTime(timer.remaining)
      }
    })
  }
}

使用Vuex管理全局状态

当需要跨组件共享倒计时状态时,可以使用Vuex:

// store.js
export default new Vuex.Store({
  state: {
    timers: []
  },
  mutations: {
    UPDATE_TIMER(state, { index, remaining }) {
      state.timers[index].remaining = remaining
    },
    SET_TIMER_INTERVAL(state, { index, interval }) {
      state.timers[index].interval = interval
    }
  },
  actions: {
    startTimer({ commit, state }, index) {
      const interval = setInterval(() => {
        if (state.timers[index].remaining > 0) {
          commit('UPDATE_TIMER', {
            index,
            remaining: state.timers[index].remaining - 1
          })
        } else {
          clearInterval(state.timers[index].interval)
        }
      }, 1000)
      commit('SET_TIMER_INTERVAL', { index, interval })
    }
  }
})

使用Composition API实现

在Vue 3中可以使用Composition API更简洁地实现:

import { ref, onUnmounted } from 'vue'

export default {
  setup() {
    const timers = ref([
      { remaining: 60, interval: null },
      { remaining: 120, interval: null },
      { remaining: 180, interval: null }
    ])

    const formatTime = (seconds) => {
      const mins = Math.floor(seconds / 60)
      const secs = seconds % 60
      return `${mins}:${secs < 10 ? '0' : ''}${secs}`
    }

    const startTimer = (index) => {
      if (timers.value[index].interval) return

      timers.value[index].interval = setInterval(() => {
        if (timers.value[index].remaining > 0) {
          timers.value[index].remaining--
        } else {
          clearInterval(timers.value[index].interval)
          timers.value[index].interval = null
        }
      }, 1000)
    }

    onUnmounted(() => {
      timers.value.forEach(timer => {
        if (timer.interval) clearInterval(timer.interval)
      })
    })

    return { timers, formatTime, startTimer }
  }
}

注意事项

清除定时器非常重要,避免组件销毁后定时器继续运行导致内存泄漏。在beforeDestroyonUnmounted钩子中清除所有定时器。

vue 实现多个倒计

对于复杂场景,可以考虑使用第三方库如countdown.jsday.js来处理时间格式和计算。

标签: 多个vue
分享给朋友:

相关文章

在线脑图 vue 实现

在线脑图 vue 实现

在线脑图 Vue 实现方案 使用开源库实现 推荐使用 mind-elixir 或 jsmind 这类开源库,它们专为脑图设计且支持 Vue 集成。 安装依赖: npm install mind-e…

vue实现矩阵

vue实现矩阵

Vue 实现矩阵的方法 在 Vue 中实现矩阵操作可以通过多种方式完成,以下是一些常见的方法: 使用二维数组表示矩阵 矩阵可以用二维数组来表示,每个元素对应矩阵中的一个值。在 Vue 的 data…

vue实现mouseout

vue实现mouseout

Vue 实现 mouseout 事件的方法 在 Vue 中实现 mouseout 事件可以通过多种方式完成,以下是几种常见的方法: 使用 v-on 指令 Vue 提供了 v-on 指令(或简写为 @…

vue实现Siri

vue实现Siri

Vue 实现 Siri 风格语音交互 实现类似 Siri 的语音交互功能需要结合语音识别、语音合成和前端交互逻辑。Vue 作为前端框架,可以很好地管理这些功能的交互状态。 语音识别集成 使用 Web…

vue实现swiper

vue实现swiper

Vue 中实现 Swiper 的方法 安装 Swiper 依赖 在 Vue 项目中安装 Swiper 和相关依赖: npm install swiper vue-awesome-swiper 全局引…

vue实现等级选择

vue实现等级选择

实现等级选择的方法 在Vue中实现等级选择功能,可以通过多种方式完成,以下是几种常见的实现方法: 使用v-for渲染星级选择 通过v-for指令循环渲染星级图标,结合点击事件实现等级选择: <…