You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
5.3 KiB

var countdown = {
template: '<div><p v-if="msTime.show"><span v-if="tipShow">{{tipText}}:</span><span v-if="!tipShow">{{tipTextEnd}}:</span><span v-if="msTime.day>0"><span>{{msTime.day}}</span>天</span><span>{{msTime.hour}}</span>:<span>{{msTime.minutes}}</span>:<span>{{msTime.seconds}}</span></p><p v-if="!msTime.show">{{endText}}</p></div>',
replace:true,
data () {
return {
tipShow:true,
msTime:{ //倒计时数值
show:false, //倒计时状态
day:'', //天
hour:'', //小时
minutes:'', //分钟
seconds:'' //秒
},
star:'', //活动开始时间
end:'', //活动结束时间
current:'', //当前时间
}
},
props:{
//距离开始提示文字
tipText:{
type: String,
default :'距离开始'
},
//距离结束提示文字
tipTextEnd:{
type: String,
default :'距离结束'
},
//时间控件ID
id:{
type: String,
default :'1'
},
//当前时间
currentTime:{
type: Number
},
// 活动开始时间
startTime:{
type: Number
},
// 活动结束时间
endTime: {
type: Number
},
// 倒计时结束显示文本
endText:{
type:String,
default:'已结束'
},
//是否开启秒表倒计,未完成
secondsFixed:{
type:Boolean,
defaule:false
}
},
mounted () {
//判断是秒还是毫秒
this.startTime.toString().length==10 ? this.star = this.startTime*1000 : this.star = this.startTime;
this.endTime.toString().length==10 ? this.end = this.endTime*1000 : this.end = this.endTime;
if(this.currentTime){
this.currentTime.toString().length==10 ? this.current = this.currentTime*1000 : this.current = this.currentTime;
}else {
this.current=( new Date() ).getTime();
}
if(this.end<this.current){
/**
* 结束时间小于当前时间 活动已结束
*/
this.msTime.show = false;
this.end_message();
}
else if(this.current<this.star){
/**
* 当前时间小于开始时间 活动尚未开始
*/
this.$set(this,'tipShow',true);
setTimeout(()=>{
this.runTime(this.star,this.current,this.start_message);
},1);
}
else if(this.end>this.current&&this.star<this.current||this.star==this.current){
/**
* 结束时间大于当前并且开始时间小于当前时间,执行活动开始倒计时
*/
this.$set(this,'tipShow',false);
this.msTime.show = true;
this.$emit('start_callback', this.msTime.show);
setTimeout(()=>{
this.runTime(this.end,this.star,this.end_message,true)
},1);
}
},
methods: {
runTime (startTime,endTime,callFun,type) {
let msTime = this.msTime;
let timeDistance = startTime - endTime;
if( timeDistance > 0 ){
this.msTime.show = true;
msTime.day = Math.floor( timeDistance / 86400000 );
timeDistance-= msTime.day * 86400000;
msTime.hour = Math.floor( timeDistance / 3600000 );
timeDistance-= msTime.hour * 3600000;
msTime.minutes = Math.floor( timeDistance / 60000 );
timeDistance-= msTime.minutes * 60000;
//是否开启秒表倒计,未完成
// this.secondsFixed ? msTime.seconds = new Number(timeDistance / 1000).toFixed(2) : msTime.seconds = Math.floor( timeDistance / 1000 ).toFixed(0);
msTime.seconds = Math.floor( timeDistance / 1000 ).toFixed(0);
timeDistance-= msTime.seconds * 1000;
if( msTime.hour < 10){
msTime.hour = "0" + msTime.hour;
}
if(msTime.minutes < 10){
msTime.minutes= "0" + msTime.minutes;
}
if(msTime.seconds < 10) {
msTime.seconds = "0" + msTime.seconds;
}
let _s = Date.now();
let _e = Date.now();
let diffPerFunc = _e - _s;
setTimeout(()=>{
if(type){
this.runTime(this.end,endTime+=1000,callFun,true);
}else{
this.runTime(this.star,endTime+=1000,callFun);
}
},1000-diffPerFunc)
}
else {
callFun();
}
},
start_message () {
this.$set(this,'tipShow',false);
this.$emit('start_callback', this.msTime.show);
setTimeout(()=>{
this.runTime(this.end,this.star,this.end_message,true)
},1);
},
end_message(){
this.msTime.show = false;
this.$emit('end_callback', this.msTime.show);
}
}
};
var readme= {
template: '<p>11111</p>',
};