微信小程序 倒计时组件实现代码


Posted in Javascript onOctober 24, 2016

功能: 适用于电商应用的限时团购、商品秒杀等

先来看下最终效果:

微信小程序 倒计时组件实现代码

git源:http://git.oschina.net/dotton/CountDown

分步骤-性子急的朋友,可以直接看最后那段代码。

wxml文件放个text

<text>second: {{second}} micro second:{{micro_second}}</text>

在js文件中调用

function countdown(that) {
 var second = that.data.second
 if (second == 0) {
  // console.log("Time Out...");
  that.setData({
   second: "Time Out..."
  });
  return ;
 }
 var time = setTimeout(function(){
  that.setData({
   second: second - 1
  });
  countdown(that);
 }
 ,1000)
}

Page({
  data: {
    second: 3
  },
  onLoad: function() {
    countdown(this);
  }
});

运行验证下,从10走到1s,然后显示时间到。

于是继续将毫秒完善,注意毫秒的步长受限于系统的时间频率,于是我们精确到0.01s即10ms

js

/* 秒级倒计时 */
function countdown(that) {
 var second = that.data.second
 if (second == 0) {
  that.setData({
   second: "Time out!",
   micro_second: "micro_second too."
  });
  clearTimeout(micro_timer);
  return ;
 }
 var timer = setTimeout(function(){
  that.setData({
   second: second - 1
  });
  countdown(that);
 }
 ,1000)
}

/* 毫秒级倒计时 */
// 初始毫秒数,同时用作归零
var micro_second_init = 100;
// 当前毫秒数
var micro_second_current = micro_second_init;
// 毫秒计时器
var micro_timer;

function countdown4micro(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文件

<text style="display: block;">second: {{second}}s</text>

<text>{{micro_second}}</text>

如此,当秒级运行完毕时,毫秒级timer即clearTimeout,并将字本显示为'micro_second too'

再添加一个countdown4micro方法,使得显示剩余 0:3:19 89这样形式的倒数

function dateformat(second) {
  var dateStr = "";
  var hr = Math.floor(second / 3600);
  var min = Math.floor((second - hr * 3600) / 60);
  var sec = (second - hr * 3600 - min * 60);// equal to => var sec = second % 60;
  dateStr = hr + ":" + min + ":" + sec;
  return dateStr;
}
目前有2个时钟,影响性能,合并下去掉countdown,于是countdown4micro变成以下的样子:

function countdown4micro(that) {

  var loop_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,传入一个时间点,转换成总毫秒数
var total_micro_second = 2 * 1000;

/* 毫秒级倒计时 */
function countdown(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:19 86。每10ms都会调用一次
function dateformat(micro_second) {
   // 秒数
   var second = Math.floor(micro_second / 1000);
   // 小时位
   var hr = Math.floor(second / 3600);
   // 分钟位
   var min = Math.floor((second - hr * 3600) / 60);
   // 秒位
  var sec = (second - hr * 3600 - min * 60);// equal to => var sec = second % 60;
  // 毫秒位,保留2位
  var micro_sec = Math.floor((micro_second % 1000) / 10);
  return hr + ":" + min + ":" + sec + " " + micro_sec;
}

Page({
  data: {
    clock: ''
  },
  onLoad: function() {
    countdown(this);
  }
});

经过如上优化,代码量减少一半,运行效率也高了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
分享十五款 jQuery 社交网络分享插件
May 16 Javascript
smartcrop.js智能图片裁剪库
Oct 14 Javascript
Sublime Text 3常用插件及安装方法
Dec 16 Javascript
jquery实现简单的瀑布流布局
Dec 11 Javascript
jQuery插件之validation插件
Mar 29 jQuery
如何编写jquery插件
Mar 29 jQuery
jquery.uploadView 实现图片预览上传功能
Aug 10 jQuery
vue实现某元素吸顶或固定位置显示(监听滚动事件)
Dec 13 Javascript
Bootstrap 中data-[*] 属性的整理
Mar 13 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
Sep 30 Javascript
JavaScript适配器模式原理与用法实例详解
Mar 09 Javascript
vue实现在data里引入相对路径
Jun 05 Vue.js
微信小程序 WXDropDownMenu组件详解及实例代码
Oct 24 #Javascript
微信小程序 购物车简单实例
Oct 24 #Javascript
Select2.js下拉框使用小结
Oct 24 #Javascript
微信小程序 绘图之饼图实现
Oct 24 #Javascript
用jmSlip编写移动端顶部日历选择控件
Oct 24 #Javascript
微信小程序 富文本转文本实例详解
Oct 24 #Javascript
微信小程序 参数传递详解
Oct 24 #Javascript
You might like
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
php文件上传简单实现方法
2015/01/24 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
用 JSON 处理缓存
2007/04/27 Javascript
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
JavaScript中的prototype使用说明
2010/04/13 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
详解Angular路由之路由守卫
2018/05/10 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
Python3基础之基本运算符概述
2014/08/13 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
python之super的使用小结
2018/08/13 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
Python笔记之代理模式
2019/11/20 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
英国电子专家:maplin
2019/09/04 全球购物
日本最大的彩色隐形眼镜销售网站:CharmColor
2020/09/09 全球购物
历史专业毕业生的自我鉴定
2013/11/15 职场文书
绿色城市实施方案
2014/03/19 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
学校募捐倡议书
2014/05/14 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis