VUE封装一个电商倒计时插件
在components文件夹下新建文件 2.代码如下
<template
>
<span
> 距离活动结束还剩
:{{ lastTime
| format
}} </span
>
</template
>
<script
>
function fixedZero(val
) {
return val
* 1 < 10 ? `0${val}` : val
}
export default {
name
: 'CountDown',
props
: {
format
: {
type
: Function
,
default: undefined
,
},
target
: {
type
: [Date
, Number
],
required
: true,
},
onEnd
: {
type
: Function
,
default: () => ({}),
},
},
data() {
return {
dateTime
: '0',
originTargetTime
: 0,
lastTime
: 0,
timer
: 0,
interval
: 1000,
}
},
filters
: {
format(time
) {
const hours
= 60 * 60 * 1000
const minutes
= 60 * 1000
const h
= Math
.floor(time
/ hours
)
const m
= Math
.floor((time
- h
* hours
) / minutes
)
const s
= Math
.floor((time
- h
* hours
- m
* minutes
) / 1000)
return `${fixedZero(h)}时${fixedZero(m)}分${fixedZero(s)}秒`
},
},
created() {
this.initTime()
this.tick()
},
methods
: {
initTime() {
let lastTime
= 0
let targetTime
= 0
this.originTargetTime
= this.target
try {
if (Object
.prototype
.toString
.call(this.target
) === '[object Date]') {
targetTime
= this.target
} else {
targetTime
= new Date(this.target
).getTime()
}
} catch (e) {
throw new Error('invalid target prop')
}
lastTime
= targetTime
- new Date().getTime()
this.lastTime
= lastTime
< 0 ? 0 : lastTime
},
tick() {
const { onEnd
} = this
this.timer
= setTimeout(() => {
if (this.lastTime
< this.interval
) {
clearTimeout(this.timer
)
this.lastTime
= 0
if (typeof onEnd
=== 'function') {
onEnd()
}
} else {
this.lastTime
-= this.interval
this.tick()
}
}, this.interval
)
},
},
beforeUpdate() {
if (this.originTargetTime
!== this.target
) {
this.initTime()
}
},
beforeDestroy() {
clearTimeout(this.timer
)
},
}
</script
>
<style scoped
>
</style
>
3.使用
<template
>
<div
><count
-down
:target
="startTime + interval" :on
-end
="onEndHandle" /></div
>
</template
>
<script
>
import CountDown
from '@/components/CountDown/CountDown'
export default {
components
: {
CountDown
},
data(){
return{
startTime
:new Date().getTime(),
interval
:13000000,
}
},
methods
:{
onEndHandle(){
console
.log('倒计时结束回调')
}
}
}
</script
>
4.页面展示 npm 安装:npm i countdown-vuejs yarn安装:yarn add countdown-vuejs 使用:
<template
>
<div
><count
-down
:target
="new Date().getTime() + 100000" :on
-end
="onEndHandle" /></div
>
</template
>
<script
>
import CountDown
from 'countdown-vuejs'
export default {
name
: 'Success',
components
: {CountDown
},
methods
: {
onEndHandle() {
console
.log('倒计时结束回调')
},
},
}
</script
>
<style scoped
>
</style
>
转载请注明原文地址:https://blackberry.8miu.com/read-44082.html