130 lines
2.8 KiB
JavaScript
130 lines
2.8 KiB
JavaScript
import util from '../../utils/util'
|
||
|
||
Component({
|
||
properties: {
|
||
// useSlot: Boolean,
|
||
// 截止的时间
|
||
date: String,
|
||
// 分隔符, colon为英文冒号,zh为中文
|
||
separator: {
|
||
type: String,
|
||
value: 'zh'
|
||
},
|
||
// 组件样式, text为纯文本,custom为带背景色
|
||
style: {
|
||
type: String,
|
||
value: 'text'
|
||
},
|
||
},
|
||
|
||
data: {
|
||
// 倒计时数据
|
||
dynamic: {
|
||
day: '00',
|
||
hou: '00',
|
||
min: '00',
|
||
sec: '00'
|
||
},
|
||
// 分隔符文案
|
||
separatorText: {
|
||
day: '天',
|
||
hou: '时',
|
||
min: '分',
|
||
sec: '秒'
|
||
}
|
||
},
|
||
|
||
attached() {
|
||
// 分隔符文案
|
||
this.separatorText()
|
||
// 开始倒计时
|
||
this.onTime()
|
||
},
|
||
|
||
detached() {
|
||
|
||
},
|
||
|
||
|
||
methods: {
|
||
|
||
// 分隔符文案
|
||
separatorText() {
|
||
const separatorText = this.data.separatorText
|
||
if (this.data.separator === 'colon') {
|
||
separatorText.day = ':'
|
||
separatorText.hou = ':'
|
||
separatorText.min = ':'
|
||
separatorText.sec = ''
|
||
}
|
||
this.setData({
|
||
separatorText
|
||
})
|
||
},
|
||
|
||
// 开始倒计时
|
||
onTime(deep = 0) {
|
||
const app = this
|
||
const dynamic = {}
|
||
|
||
// 获取当前时间,同时得到活动结束时间数组
|
||
const newTime = new Date().getTime()
|
||
// 对结束时间进行处理渲染到页面
|
||
const endTime = new Date(util.format_date(app.data.date)).getTime();
|
||
|
||
// 如果活动未结束,对时间进行处理
|
||
if ((endTime - newTime) <= 0) {
|
||
return false
|
||
}
|
||
|
||
const diffTime = (endTime - newTime) / 1000;
|
||
// 获取时、分、秒
|
||
const day = parseInt(diffTime / 86400),
|
||
hou = parseInt(diffTime % 86400 / 3600),
|
||
min = parseInt(diffTime % 86400 % 3600 / 60),
|
||
sec = parseInt(diffTime % 86400 % 3600 % 60);
|
||
dynamic.day = app.timeFormat(day)
|
||
dynamic.hou = app.timeFormat(hou)
|
||
dynamic.min = app.timeFormat(min)
|
||
dynamic.sec = app.timeFormat(sec)
|
||
|
||
// 渲染,然后每隔一秒执行一次倒计时函数
|
||
app.setData({
|
||
dynamic
|
||
})
|
||
// 判断倒计时是否结束
|
||
const isEnd = app.isEnd()
|
||
// 结束后执行回调函数
|
||
if (isEnd) {
|
||
deep > 0 && app.triggerEvent('finish')
|
||
}
|
||
// 重复执行
|
||
if (!isEnd) {
|
||
setTimeout(() => {
|
||
app.onTime(++deep)
|
||
}, 1000)
|
||
}
|
||
},
|
||
|
||
// 判断倒计时是否结束
|
||
isEnd() {
|
||
const {
|
||
dynamic
|
||
} = this.data
|
||
if (dynamic.day == '00' && dynamic.hou == '00' && dynamic.min == '00' && dynamic.sec == '00') {
|
||
return true
|
||
}
|
||
return false
|
||
},
|
||
|
||
/**
|
||
* 小于10的格式化函数
|
||
*/
|
||
timeFormat(value) {
|
||
return value < 10 ? '0' + value : value
|
||
}
|
||
|
||
|
||
|
||
}
|
||
}) |