时分秒倒计时组件
template
<template>
<!-- 倒计时组件 -->
<div class="downTime-wrapper">
<!-- 这里是显示还未结束时的内容,这里只是我这得布局,你可以随意。-->
<div class="time" v-show="!isShow">
<!-- <span class="hour">{{myDay}}</span> : -->
<div class="hour">
<span>{{getHours1}}</span>
<span>{{getHours2}}</span>
</div>
<span class="dian">:</span>
<div class="minute">
<span>{{getMinutes1}}</span>
<span>{{getMinutes2}}</span>
</div>
<span class="dian">:</span>
<div class="second">
<span>{{getSeconds1}}</span>
<span>{{getSeconds2}}</span>
</div>
</div>
<!-- 这里是显示结束后的内容 -->
<span class="second" v-show="isShow">{{clocker}}</span>
</div>
</template>
script
<script>
export default {
name: 'downTime',
props: { // 接收父组件传递过来的参数, 这里传了 结束时间 - 开始时间 - 结束后显示的内容
endTime: {type: Number},
startTime: {type: Number},
endMsg: {type: String}
},
data () {
return {
isShow: false, // 控制显示结束或还未结束显示的内容
clocker: '', // 结束后显示的内容
timeObj: null, // 时间对象, 下方会用到
myDay: 0, // 我定义来接收计算出来的 天 的
myHours: 0, // 我定义来接收计算出来的 小时 的
myMinutes: 0, // 我定义来接收计算出来的 分钟 的
mySeconds: 0// 我定义来接收计算出来的 秒钟 的
}
},
computed: {getHours1 () {return this.myHours < 10 ? 0 : parseInt((this.myHours % 100) / 10)
},
getHours2 () {return parseInt(this.myHours % 10)
},
getMinutes1 () {return this.myMinutes < 10 ? 0 : parseInt((this.myMinutes % 100) / 10)
},
getMinutes2 () {return parseInt(this.myMinutes % 10)
},
getSeconds1 () {return this.mySeconds < 10 ? 0 : parseInt((this.mySeconds % 100) / 10)
},
getSeconds2 () {return parseInt(this.mySeconds % 10)
}
},
mounted () {},
methods: {option () {
// 计算时间差
let timeLag = (this.endTime - this.startTime) / 1000
// 判断当前是否时分秒的值是否大于 10
const add = num => {return num < 10 ? '0' + num : num}
// 时间倒计时运算的方法
const timeFunction = () => {
const time = timeLag--
this.timeObj = { // 时间对象
seconds: Math.floor(time % 60),
minutes: Math.floor(time / 60) % 60,
hours: Math.floor(time / 60 / 60) % 24,
days: Math.floor(time / 60 / 60 / 24)
}
// 计算出时分秒
this.myDay = `${add(this.timeObj.days)}`
this.myHours = `${add(this.timeObj.hours)}`
this.myMinutes = `${add(this.timeObj.minutes)}`
this.mySeconds = `${add(this.timeObj.seconds)}`
// 当时间差小于等于 0 时, 停止倒计时
if (time <= 0) {
this.isShow = true
this.clocker = this.endMsg
clearInterval(go)
}
}
// 开始执行倒计时
timeFunction()
// 每一秒执行一次
const go = setInterval(() => {timeFunction()
}, 1000)
}
},
watch: {
endTime: {handler (newName, oldName) {this.option()
},
immediate: true,
deep: true
}
}
}
</script>
备注:我将时分秒使用计算属性分成了个位和十位两部分展示,在 watch 中深度监听 endTime 属性的变化并重新调用定时器
style
<style lang="scss" scoped>
.downTime-wrapper{
display: inline-block;
.dian {
font-weight: bold;
position: relative;
top: -5px;
}
.hour{
display: inline-block;
font-size: 36px;
span {
border-radius:6px;
color: #FFFFFF;
background:rgba(27,23,22,1);
padding: 1px 10px;
margin: 0 2px;
}
}
.minute{
display: inline-block;
font-size: 36px;
span {
border-radius:6px;
color: #FFFFFF;
background:rgba(27,23,22,1);
padding: 1px 10px;
margin: 0 2px;
}
}
.second {
display: inline-block;
font-size: 36px;
margin-top: -5px;
span {
border-radius:6px;
color: #FFFFFF;
background:rgba(27,23,22,1);
padding: 1px 10px;
margin: 0 2px;
}
}
}
</style>
使用
在页面中引入并注册后即可使用
<timer
:endTime="item.endTime"
:startTime="new Date().getTime()"
:endMsg="item.endMsg">
</timer>
毫秒倒计时效果
在 template 中加入 <b id="timehs">:00</b>
声明 timeDt 方法
methods: {timeDt () {this.timer1 = setTimeout(function () {
var haomiao = 99
document.getElementById('timehs').innerHTML = ':' + haomiao
this.timer2 = setInterval(function () {const timehs = document.getElementById('timehs')
if (timehs) {timehs.innerHTML = `:${haomiao < 10 ? `0${haomiao}` : haomiao}`
}
haomiao--
if (haomiao < 0) {haomiao = 99}
}, 10)
}, 1000)
}
}
在 create 生命周期函数中调用 timeDt 方法
created () {this.$nextTick(() => {this.timeDt()
})
},