vue3-countdown
Version:
A simple countdown component for Vue3.x.
233 lines (186 loc) • 5.89 kB
Markdown
# vue3-countdown
A simple countdown component for Vue3.x.
[Live Demo](https://wuanrin.github.io/vue3-countdown/)
## Installation
```
npm install vue3-countdown --save
```
```js
import { defineComponent } from 'vue'
import Countdown from 'vue3-countdown'
export default defineComponent({
components: { Countdown }
})
```
## Usage
### Basic
```html
<countdown :time="30 * 60 * 60 * 1000" />
```
### Custom Format
```html
<countdown
:time="30 * 60 * 60 * 1000"
format="DD ~Day, HH:mm:ss"
/>
```
> `~` is an escape character to prevent the character `D` in `Day` from being escaped to a date.
### Custom Style
```html
<countdown
:time="30 * 60 * 60 * 1000"
format="HH:mm:ss"
>
<template #="{ resolved }">
<span class="countdown-item">{{ resolved.HH }}</span> :
<span class="countdown-item">{{ resolved.mm }}</span> :
<span class="countdown-item">{{ resolved.ss }}</span>
</template>
</countdown>
```
### Masual Control
```html
<countdown
ref="countdown"
:time="30 * 60 * 60 * 1000"
:auto-start="false"
/>
<div class="control-buttons">
<Button ="start">Start</Button>
<Button ="pause">Pause</Button>
<Button ="reset">Reset</Button>
</div>
```
```js
import { ref } from 'vue'
export default {
setup () {
const countdown = ref()
const start = () => countdown.value.start()
const pause = () => countdown.value.stop()
const reset = () => countdown.value.reset()
return {
countdown,
start,
pause,
reset
}
}
}
```
### Second Count Down
```html
<Button :disabled="inCountdown" ="handleClick">
<template v-if="!inCountdown">Start</template>
<countdown
v-else
ref="countdown"
:time="60 * 1000"
:auto-start="false"
format="ss~s"
="inCountdown = false"
/>
</Button>
```
```js
import { ref, nextTick } from 'vue'
export default {
setup () {
const countdown = ref()
const inCountdown = ref(false)
const handleClick = () => {
inCountdown.value = true
nextTick(() => {
countdown.value.reset()
countdown.value.start()
})
}
return {
countdown,
inCountdown,
handleClick
}
}
}
```
### Events
```html
<countdown
:time="5 * 1000"
format="ss"
="handleChange"
="handleFinish"
/>
```
```js
export default {
setup () {
const handleChange = ({ currentTime, resolved, formatted }) => {
console.log(currentTime, resolved, formatted)
}
const handleFinish = () => {
console.log('finished')
}
return {
handleChange,
handleFinish
}
}
}
```
## API
### Props
| Prop | Description | Type | Default |
| ---------- | -------------------------------- | ------- | -------- |
| time | Total time | number | 0 |
| format | Time format | string | HH:mm:ss |
| auto-start | Whether to auto start count down | boolean | true |
### Available formats
| Format | Description |
| ------ | -------------------- |
| D | Day |
| DD | Day, leading zero |
| H | Hour |
| HH | Hour, leading zero |
| m | Minute |
| mm | Minute, leading zero |
| s | Second |
| ss | Second, leading zero |
| S | Millisecond, 1-digit |
| SS | Millisecond, 2-digit |
You can prefixing the character `~` before the unit character if you don't want to convert a unit charactor.
For example, format prop `DD Day HH:mm:ss` will be converted to `01 1ay HH:mm:ss`, the word `Day` is incorrectly converted to `1ay`, using `DD ~Day HH:mm:ss` to avoid this problem.
### Events
| Event | Description | Arguments |
| ------ | -------------------------------- | --------- |
| change | Emitted when count down changed | { currentTime, resolved, formatted } |
| finish | Emitted when count down finished | - |
### Slots
| Name | Description | SlotProps |
| ------- | -------------- | ------------------------------ |
| default | Custom Content | countdown, resolved, formatted |
#### SlotProps
| Name | Type | Description |
| --------- | ------ | ------------------------------------ |
| countdown | number | Remaining countdown |
| resolved | object | Remaining countdown after resolving |
| formatted | string | Remaining countdown after formatting |
`resolved` is an object contains resolved countdown according to the `format` prop.
For example, `resolved` may be `{ mm: 10, ss: 10, SS: 10 }` when `format` is `mm:ss:SS`.
So you can custom display according `resolved`.
> If an time unit is not in prop `format`, it will not be in `resolved`.
### Methods
| Name | Description | Attribute | Return Value |
| ----- | ---------------- | --------- | ------------ |
| start | Start count down | - | - |
| stop | Stop count down | - | - |
| reset | Reset count down | - | - |
### Attributes
| Name | Type | Description |
| ----------- | ------- | ------------------------------------ |
| currentTime | number | Remaining countdown |
| resolved | object | Remaining countdown after resolving |
| formatted | string | Remaining countdown after formatting |
| inCountdown | boolean | Whether in countdown |
## License
vue3-countdown is licensed under [The MIT License](https://github.com/wuanrin/vue3-countdown/blob/master/LICENSE).