Skip to content

v-countdown

显示到目标时间的倒计时。支持多种格式和完成回调。

起始版本: 1.3.0

用法

基本

vue
<template>
  <span v-countdown="targetDate"></span>
</template>

<script setup>
const targetDate = new Date('2026-12-31T00:00:00')
</script>

使用时间戳

vue
<template>
  <span v-countdown="Date.now() + 60000"></span>
</template>

带选项

vue
<template>
  <span v-countdown="{
    target: targetDate,
    format: 'dd:hh:mm:ss',
    onComplete: handleComplete
  }"></span>
</template>

API

类型

typescript
interface CountdownOptions {
  target: Date | number | string
  format?: string | ((time: CountdownTime) => string)
  interval?: number // 默认: 1000
  onComplete?: () => void
  onTick?: (time: CountdownTime) => void
  autoStart?: boolean // 默认: true
}

interface CountdownTime {
  days: number
  hours: number
  minutes: number
  seconds: number
  milliseconds: number
  total: number
}

选项

选项类型默认值描述
targetDate | number | string-目标时间(必填)
formatstring | Function'hh:mm:ss'显示格式或自定义函数
intervalnumber1000更新间隔(毫秒)
onComplete() => void-倒计时结束时的回调
onTick(time: CountdownTime) => void-每次更新的回调
autoStartbooleantrue是否自动开始倒计时

格式占位符

占位符描述
dd天数(2位数)
hh小时(2位数)
mm分钟(2位数)
ss秒数(2位数)
SSS毫秒(3位数)

Composable 用法

你也可以使用 useCountdown composable:

vue
<script setup>
import { useCountdown } from 'directix'

const targetDate = new Date(Date.now() + 60 * 60 * 1000) // 1小时后

const { time, formatted, running, completed, pause, resume, reset } = useCountdown({
  target: targetDate,
  format: 'hh:mm:ss',
  onComplete: () => console.log('完成!')
})
</script>

<template>
  <div>
    <p>{{ formatted }}</p>
    <p>剩余: {{ time.days }}天 {{ time.hours }}时 {{ time.minutes }}分 {{ time.seconds }}秒</p>
    <button @click="pause" v-if="running">暂停</button>
    <button @click="resume" v-if="!running && !completed">继续</button>
    <button @click="reset">重置</button>
  </div>
</template>

API

typescript
interface UseCountdownOptions {
  /** 目标时间(Date 对象、时间戳或 ISO 字符串) */
  target: Date | number | string | Ref<Date | number | string>
  /** 格式字符串或自定义格式函数 */
  format?: string | CountdownFormatFunction | Ref<string | CountdownFormatFunction>
  /** 倒计时完成时的回调 */
  onComplete?: () => void
  /** 每次更新的回调 */
  onTick?: (time: CountdownTime) => void
  /** 更新间隔(毫秒) */
  interval?: number | Ref<number>
  /** 是否自动开始 */
  autoStart?: boolean | Ref<boolean>
}

interface UseCountdownReturn {
  /** 当前倒计时时间 */
  time: Ref<CountdownTime>
  /** 格式化后的时间字符串 */
  formatted: Ref<string>
  /** 倒计时是否运行中 */
  running: Ref<boolean>
  /** 倒计时是否暂停 */
  paused: Ref<boolean>
  /** 倒计时是否已完成 */
  completed: Ref<boolean>
  /** 开始倒计时 */
  start: () => void
  /** 暂停倒计时 */
  pause: () => void
  /** 继续倒计时 */
  resume: () => void
  /** 重置倒计时 */
  reset: () => void
}

示例

促销倒计时

vue
<template>
  <div class="sale-banner">
    促销结束倒计时: <span v-countdown="{ target: saleEnd, format: 'dd:hh:mm:ss' }"></span>
  </div>
</template>

自定义格式

vue
<template>
  <span v-countdown="{
    target: targetDate,
    format: (time) => `${time.days}天 ${time.hours}时 ${time.minutes}分`
  }"></span>
</template>

带完成回调

vue
<template>
  <span
    v-countdown="{
      target: Date.now() + 5000,
      format: 'ss',
      onComplete: () => completed = true
    }"
  ></span>
  <span v-if="completed">已完成!</span>
</template>

基于 MIT 许可发布