微信小程序电商常用倒计时实现实例
微信小程序电商常用倒计时实现实例
wxml文件放个text
在js文件中调用
functioncountdown(that){
varsecond=that.data.second
if(second==0){
//console.log("TimeOut...");
that.setData({
second:"TimeOut..."
});
return;
}
vartime=setTimeout(function(){
that.setData({
second:second-1
});
countdown(that);
}
,1000)
}
Page({
data:{
second:3
},
onLoad:function(){
countdown(this);
}
});
运行验证下,从10走到1s,然后显示时间到。
于是继续将毫秒完善,注意毫秒的步长受限于系统的时间频率,于是我们精确到0.01s即10ms
js
/*秒级倒计时*/
functioncountdown(that){
varsecond=that.data.second
if(second==0){
that.setData({
second:"Timeout!",
micro_second:"micro_secondtoo."
});
clearTimeout(micro_timer);
return;
}
vartimer=setTimeout(function(){
that.setData({
second:second-1
});
countdown(that);
}
,1000)
}
/*毫秒级倒计时*/
//初始毫秒数,同时用作归零
varmicro_second_init=100;
//当前毫秒数
varmicro_second_current=micro_second_init;
//毫秒计时器
varmicro_timer;
functioncountdown4micro(that){
if(micro_second_current<=0){
micro_second_current=micro_second_init;
}
micro_timer=setTimeout(function(){
that.setData({
micro_second:micro_second_current-1
});
micro_second_current--;
countdown4micro(that);
}
,10)
}
Page({
data:{
second:2,
micro_second:micro_second_init
},
onLoad:function(){
countdown(this);
countdown4micro(this);
}
});
wxml文件
second:{{second}}s {{micro_second}}
如此,当秒级运行完毕时,毫秒级timer即clearTimeout,并将字本显示为'micro_secondtoo'
再添加一个countdown4micro方法,使得显示剩余0:3:1989这样形式的倒数
functiondateformat(second){
vardateStr="";
varhr=Math.floor(second/3600);
varmin=Math.floor((second-hr*3600)/60);
varsec=(second-hr*3600-min*60);//equalto=>varsec=second%60;
dateStr=hr+":"+min+":"+sec;
returndateStr;
}
//目前有2个时钟,影响性能,合并下去掉countdown,于是countdown4micro变成以下的样子:
functioncountdown4micro(that){
varloop_second=Math.floor(loop_index/100);
//得知经历了1s
if(cost_micro_second!=loop_second){
//赋予新值
cost_micro_second=loop_second;
//总秒数减1
total_second--;
}
//每隔一秒,显示值减1;渲染倒计时时钟
that.setData({
clock:dateformat(total_second-1)
});
if(total_second==0){
that.setData({
//micro_second:"",
clock:"时间到"
});
clearTimeout(micro_timer);
return;
}
if(micro_second_current<=0){
micro_second_current=micro_second_init;
}
micro_timer=setTimeout(function(){
that.setData({
micro_second:micro_second_current-1
});
micro_second_current--;
//放在最后++,不然时钟停止时还有10毫秒剩余
loop_index++;
countdown4micro(that);
}
,10)
}
如此这般,毫秒与时分秒是分别运行渲染的,再次改造,程序可读性更好。dateformat针对于毫秒操作,而不接受秒为数。同时还省却了计算100次为1s的运算
/**
*需要一个目标日期,初始化时,先得出到当前时间还有剩余多少秒
*1.将秒数换成格式化输出为XX天XX小时XX分钟XX秒XX
*2.提供一个时钟,每10ms运行一次,渲染时钟,再总ms数自减10
*3.剩余的秒次为零时,return,给出tips提示说,已经截止
*/
//定义一个总毫秒数,以一分钟为例。TODO,传入一个时间点,转换成总毫秒数
vartotal_micro_second=2*1000;
/*毫秒级倒计时*/
functioncountdown(that){
//渲染倒计时时钟
that.setData({
clock:dateformat(total_micro_second)
});
if(total_micro_second<=0){
that.setData({
clock:"已经截止"
});
//timeout则跳出递归
return;
}
setTimeout(function(){
//放在最后--
total_micro_second-=10;
countdown(that);
}
,10)
}
//时间格式化输出,如3:25:1986。每10ms都会调用一次
functiondateformat(micro_second){
//秒数
varsecond=Math.floor(micro_second/1000);
//小时位
varhr=Math.floor(second/3600);
//分钟位
varmin=Math.floor((second-hr*3600)/60);
//秒位
varsec=(second-hr*3600-min*60);//equalto=>varsec=second%60;
//毫秒位,保留2位
varmicro_sec=Math.floor((micro_second%1000)/10);
returnhr+":"+min+":"+sec+""+micro_sec;
}
Page({
data:{
clock:''
},
onLoad:function(){
countdown(this);
}
});
经过如上优化,代码量减少一半,运行效率也高了。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!