微信小程序实现订单倒计时


Posted in Javascript onNovember 01, 2020

本文实例为大家分享了微信小程序实现订单倒计时的具体代码,供大家参考,具体内容如下

之前在做一个有拼团功能项目的时候遇到过倒计时的问题,由于当时技术不熟在这方面耽搁了好些时间,所以这里整理出来希望能为后来人提供些许启发。

1.实现思路

求出发起拼团时间与拼团结束时间的时间差
再将时间差格式化得到我们想要的格式如:

微信小程序实现订单倒计时

时间每秒递减使用了 setTimeout(this.setTimeCount,1000);这个函数,让这个函数每隔一秒执行一次。

效果图:

微信小程序实现订单倒计时

2.实现中的难点

若是要实现单个倒计时如60s发送验证码倒不是很难,难的是多条倒计时。

不同的订单下单时间是不一样的时间差time也就不一样,所以当初在这卡了很久,后来想通一切才觉得原来如此。

实现方法1:是后台计算出时间前端直接获取时间差,当时为了不影响项目进度我们用的就是这个方法,真是苦了那个些后台的兄弟还得迁就我这个菜鸟。

获取这个时间差time后我们就可以将它处理后放入数组循环。这样做的好处是前端不用将time作为一个属性添加到原数组中。

index.wxml

<view class="item">单条倒计时:{{time}}</view>
 <view class="item">多条倒计时</view>
 <view class='no'>暂无任何记录</view>
 <view class="content">
 <block wx:for="{{listData}}"wx:key="idx" wx:for-item="item" wx:for-index="{{idx}}">
 <view class="tip {{item.time<=0?'isShow':''}}">
 <view class="dis">
 <view class='dis_time left'>剩余时间:{{item.countDown}}</view>
 </view>
 </view>
 </block>
</view>

index.wxss

page{
 height:100%;
 background: #fff;
 position: relative;
}
.item{
 height:4%;
 background: #fff;
 text-align: center;
}
.content{
 border:1px solid rgb(167, 159, 159);
 background: #F6F8F8;
 margin-bottom:300rpx;
 border-bottom: none;
}
.no{
 text-align: center;
 position: absolute;
 top:8%;
 z-index: -11;
}
.tip{ 
 position: relative;
 background: #fff;
 width:100%;
 height:100rpx;
 margin-bottom: 5rpx;
 padding:20rpx 0;
 border-bottom: 1px solid gainsboro;
}
.isShow{
 display:none;
}
.dis{
 width:100%;
 font-size: 35rpx;
 color:#009FE5;
 box-sizing: border-box;
}
.dis_time{
 width:50%;
}

index.js

Page({
 /**
 * 页面的初始数据
 */
 data: {
 pingData: [
 {
 "id": "1",
 "icon": "../../images/image2.jpg",
 "number": "20",
 "pingTime": "2019-3-28 23:30:00",
 "time": "55267",
 "showList": "false",
 },
 {
 "id": "2",
 "icon": "../../images/image3.jpg",
 "number": "4566",
 "pingTime": "2019-3-28 12:30:00",
 "time": "58934",
 "showList": "false",
 },
 {
 "id": "3",
 "icon": "../../images/image2.jpg",
 "number": "20",
 "pingTime": "2019-3-28 08:30:00",
 "time": "555234",
 "showList": "false",
 }
 ],
 time:"30"
 },
 /**
 * 生命周期函数--监听页面加载
 */
 onLoad: function (options) {
 var that = this
 that.setData({
  listData: that.data.pingData
 })
 that.setCountDown(); 
 that.setTimeCount();
 },
 /**
 * 60s倒计时
 */
 setTimeCount:function(){
 let time=this.data.time
 time--;
 if (time <= 0) {
 time = 0;
 }
 this.setData({
 time:time
 })
 setTimeout(this.setTimeCount,1000);
 },
 /**
 * 倒计时
 */
 setCountDown: function () {
 let time = 1000;
 let { listData } = this.data;
 let list = listData.map((v, i) => {
 if (v.time <= 0) {
 v.time = 0;
 }
 let formatTime = this.getFormat(v.time);
 v.time -= time;
 v.countDown = `${formatTime.hh}:${formatTime.mm}:${formatTime.ss}`;
 return v;
 })
 this.setData({
 listData: list
 });
 setTimeout(this.setCountDown, time);
 },
 /**
 * 格式化时间
 */
 getFormat: function (msec) {
 let ss = parseInt(msec / 1000);
 let ms = parseInt(msec % 1000);
 let mm = 0;
 let hh = 0;
 if (ss > 60) {
 mm = parseInt(ss / 60);
 ss = parseInt(ss % 60);
 if (mm > 60) {
 hh = parseInt(mm / 60);
 mm = parseInt(mm % 60);
 }
 }
 ss = ss > 9 ? ss : `0${ss}`;
 mm = mm > 9 ? mm : `0${mm}`;
 hh = hh > 9 ? hh : `0${hh}`;
 return { ss, mm, hh };
 }
})

实现方法2:本着不想做菜鸟的心情,我在项目完成后由研究了下当初未完成的方法,即前端计算出时间差并将时间差数组作为原数组的属性加入循环遍历。当初一直不知如何在原数组中再添加一个数组作为它的一个属性。
在之前的基础上将time时间差作为一个属性放到原数组中

关键代码如下:

var pinData = that.data.pingData
 for (var i = 0; i < pinData.length;i++){
 console.log("计算出长度为" + pinData.length)
 var endtime = that.data.pingData[i].pingTime
 console.log("计算出长度为" + endtime)
 that.queryTime(endtime)
 var time ="pingData["+i+"].time"
 that.setData({
 [time]:that.queryTime(endtime),
 listData:pinData
 })
 }

新增计算时间差的方法:

queryTime:function(pintime){
 var start_date = new Date();
 var end_date = new Date(pintime.replace(/-/g, "/"));
 var days = end_date.getTime() - start_date.getTime();
 console.log("获取到时间差" + days)
 return days;
 }

之前困惑我的地方就是如何将时间差这个数组添加到原来的数组中,现在想想思路清晰,曾经的难题也不过尔尔。

index.js方法二修改后的代码

Page({
 /**
 * 页面的初始数据
 */
 data: {
 pingData: [
 {
 "id": "1",
 "icon": "../../images/image2.jpg",
 "number": "20",
 "pingTime": "2019-4-15 23:30:00",
 "time": "55267",
 "showList": "false",
 },
 {
 "id": "2",
 "icon": "../../images/image3.jpg",
 "number": "4566",
 "pingTime": "2019-4-13 12:30:00",
 "time": "58934",
 "showList": "false",
 },
 {
 "id": "3",
 "icon": "../../images/image2.jpg",
 "number": "20",
 "pingTime": "2019-4-13 08:30:00",
 "time": "555234",
 "showList": "false",
 }
 ],
 time:"60"
 },
 /**
 * 生命周期函数--监听页面加载
 */
 onLoad: function (options) {
 var that = this
 var pinData = that.data.pingData
 for (var i = 0; i < pinData.length;i++){
 console.log("计算出长度为" + pinData.length)
 var endtime = that.data.pingData[i].pingTime
 console.log("计算出长度为" + endtime)
 that.queryTime(endtime)
 var time ="pingData["+i+"].time"
 that.setData({
 [time]:that.queryTime(endtime),
 listData:pinData
 })
 }
 that.setCountDown(); 
 that.setTimeCount();
 },

 /**
 * 60s倒计时
 */
 setTimeCount:function(){
 let time=this.data.time
 time--;
 if (time <= 0) {
 time = 0;
 }
 this.setData({
 time:time
 })
 setTimeout(this.setTimeCount,1000);
 },
 /**
 * 倒计时
 */
 setCountDown: function () {
 let time = 1000;
 let { listData } = this.data;
 let list = listData.map((v, i) => {
 if (v.time <= 0) {
 v.time = 0;
 }
 let formatTime = this.getFormat(v.time);
 v.time -= time;
 v.countDown = `${formatTime.hh}:${formatTime.mm}:${formatTime.ss}`;
 return v;
 })
 this.setData({
 listData: list
 });
 setTimeout(this.setCountDown, time);
 },
 /**
 * 格式化时间
 */
 getFormat: function (msec) {
 let ss = parseInt(msec / 1000);
 let ms = parseInt(msec % 1000);
 let mm = 0;
 let hh = 0;
 if (ss > 60) {
 mm = parseInt(ss / 60);
 ss = parseInt(ss % 60);
 if (mm > 60) {
 hh = parseInt(mm / 60);
 mm = parseInt(mm % 60);
 }
 }
 ss = ss > 9 ? ss : `0${ss}`;
 mm = mm > 9 ? mm : `0${mm}`;
 hh = hh > 9 ? hh : `0${hh}`;
 return { ss, mm, hh };
 },
 queryTime:function(pintime){
 var start_date = new Date();
 var end_date = new Date(pintime.replace(/-/g, "/"));
 var days = end_date.getTime() - start_date.getTime();
 console.log("获取到时间差" + days)
 return days;
 }
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 动态获取节点代码innerHTML分析 [IE,FF]
Nov 30 Javascript
禁止空格提交表单的js代码
Nov 17 Javascript
JQuery给元素绑定click事件多次执行的解决方法
May 29 Javascript
js创建jsonArray传输至后台及后台全面解析
Apr 11 Javascript
解决前端跨域问题方案汇总
Nov 20 Javascript
vue2.0开发实践总结之入门篇
Dec 06 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
Apr 13 Javascript
使用vue-aplayer插件时出现的问题的解决
Mar 02 Javascript
vue之浏览器存储方法封装实例
Mar 15 Javascript
Vue中的组件及路由使用实例代码详解
May 22 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
Jul 26 Javascript
Python机器学习之决策树和随机森林
Jul 15 Javascript
Vue监听页面刷新和关闭功能
Jun 20 #Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
Jun 20 #Javascript
js实现页面多个日期时间倒计时效果
Jun 20 #Javascript
vue实现绑定事件的方法实例代码详解
Jun 20 #Javascript
javascript实现5秒倒计时并跳转功能
Jun 20 #Javascript
JS实现的简单tab切换功能完整示例
Jun 20 #Javascript
Vue 页面权限控制和登陆验证功能的实例代码
Jun 20 #Javascript
You might like
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
php获取根域名方法汇总
2014/10/28 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
Javascript倒计时代码
2010/08/12 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
2016/05/25 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
2018/06/04 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
pyqt4教程之widget使用示例分享
2014/03/07 Python
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
使用Python写CUDA程序的方法
2017/03/27 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
在Python中定义一个常量的方法
2018/11/10 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
科室工作的个人自我评价
2013/10/30 职场文书
设备管理实施方案
2014/05/31 职场文书
学习普通话的体会
2014/11/07 职场文书
单位计划生育责任书
2015/05/09 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
创业计划书之面包店
2019/09/12 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python