<template> <view class="tm-countdown d-inline-block text-size-n"> <slot name="default" :timeData="{data:time_data,finish:isfinish}">{{text}}</slot> </view> </template> <script> /** * 倒计时 * @description 倒计时。 * @property {Number} time = [] 默认 10*1000,单位毫秒,倒计时的总时长。 * @property {String} format = [] 默认 'DD天HH小时MM分SS秒',格式。如果只想要秒:SS秒。 * @property {Boolean} autoStart = [] 默认 true,自动开始倒计时。 * @property {Function} change 时间变化时触发。 * @property {Function} finish 倒计时结束时触发。 * @example <tm-button size="s"><tm-countdown format="SS秒" :time="6*1000"> <template v-slot:default="{timeData}"> {{timeData.finish?'结束':timeData.data.seconds}} </template> </tm-countdown></tm-button> */ export default { name:"tm-countdown", props:{ time:{ type:Number, default:10 * 1000 }, format:{ type:String, default:'DD天HH小时MM分SS秒' }, autoStart:{ type:Boolean, default:true } }, data() { return { timid:null, now:0, time_data:{} }; }, computed:{ text:function(){ let minaox = this.formatTime(this.time - this.now); let ps = this.format; ps = ps.replace(/(DD)/g,minaox.day); ps = ps.replace(/(MM)/g,minaox.minutes); ps = ps.replace(/(HH)/g,minaox.hour); ps = ps.replace(/(SS)/g,minaox.seconds); return ps; }, isfinish:function(){ if(this.now == this.time||this.now==0) return true; return false; } }, destroyed() { clearInterval(this.time); }, mounted() { this.formatTime(this.time); if(this.autoStart){ this.start(); } }, methods: { formatTime(my_time){ var daysRound = Math.floor(my_time/1000/60/60/24); var hoursRound = Math.floor(my_time/1000/60/60%24); var minutesRound = Math.floor(my_time/1000/60%60); var secondsRound = Math.floor(my_time/1000%60); var millisecondRound = Math.floor(my_time % 1000); let time = { day:daysRound>9?daysRound:'0'+daysRound,//天 hour:hoursRound>9?hoursRound:'0'+hoursRound,//小时, minutes:minutesRound>9?minutesRound:'0'+minutesRound,//分. seconds:secondsRound>9?secondsRound:'0'+secondsRound,//秒。 millisecond:millisecondRound>9?millisecondRound:'0'+millisecondRound//毫秒。 }; this.time_data = time; return time; }, // 开始或者继续。 start() { let t = this; clearInterval(this.timid); this.timid = setInterval(()=>{ let lst = t.now + 50; if(lst == t.time){ t.$emit('finish') } if(lst > t.time){ clearInterval(t.timid); return; } t.now =lst; t.$emit('change',t.time_data) },50) }, // 停止,直接结束。 stop(){ clearInterval(this.timid); this.now = this.time; }, // 暂停。 pause(){ clearInterval(this.timid); }, // 重置。 resinit(){ clearInterval(this.timid); this.now = 0; } }, } </script> <style lang="scss"> </style>