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

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

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

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;
 }
})

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

(0)

相关推荐

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

    功能: 适用于电商应用的限时团购.商品秒杀等 先来看下最终效果: 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

  • 微信小程序实现倒计时调用相机自动拍照功能

    本文实例为大家分享了微信小程序定时拍照的具体代码,供大家参考,具体内容如下 在某些进行签到的场景,为了防止用户选择相册的照片或者不实时拍照,设置相机倒计时自动拍照. 一.首先是视图层index.wxml,视图层主要负责显示组件和图片. <!--index.wxml--> <view class="userinfo-login"> <view class="page-body"> <view class="page-

  • 微信小程序动态显示项目倒计时效果

    本文实例为大家分享了微信小程序动态显示项目倒计时的具体代码,供大家参考,具体内容如下 1.一般我们说的显示秒杀都是指的单条数据,循环我没做. 效果: 2.wxml代码: <p> <block wx:if="{{total_micro_second<=0}}">剩余时间:已经截止</block> <block wx:if="{{clock!='已经截止'}}">剩余时间:{{clock}}</block>

  • 微信小程序实现倒计时60s获取验证码

    本文实例为大家分享了微信小程序倒计时获取验证码的具体代码,供大家参考,具体内容如下 1.工具类(引用微信小程序提供的工具类) countdown.js class Countdown { constructor(options = {}) { Object.assign(this, { options, }) this.__init() } /** * 初始化 */ __init() { this.page = getCurrentPages()[getCurrentPages().length

  • 微信小程序实现团购或秒杀批量倒计时

    本文实例为大家分享了微信小程序实现批量倒计时的具体代码,供大家参考,具体内容如下 效果图 实现思路 微信小程序实现倒计时,可以将倒计时的时间进行每一秒的计算和渲染! JS 模拟商品列表数据 goodsList: 在 onLoad 周期函数中对活动结束时间进行提取: 建立时间格式化函数 timeFormat: 建立倒计时函数 countDown: 在 onLoad 周期函数的提取结尾执行倒计时函数 countDown. 倒计时函数详解 获取当前时间,同时得到活动结束时间数组: 循环活动结束时间数组

  • 微信小程序倒计时功能实例代码

    本实例的主要功能是:单击按钮弹出一个半透明的弹出层,在规定的时间后才能激活关闭按钮,关闭弹出层. wxml部分 <view class="wrap"> <view class="btns"> <button formType="submit" class="btn" hover-class='btn_on' bindtap='show'>使用说明</button> <but

  • 微信小程序倒计时功能实现代码

    倒计时功能是一个比较常见的功能,比如用户获取验证码就需要用到.这里记录一下在微信小程序里面倒计时功能的简单实现. 直接看看代码吧 //倒计时60秒 function countDown(that,count) { if (count == 0) { that.setData({ timeCountDownTop: '获取验证码', counting:false }) return; } that.setData({ counting:true, timeCountDownTop: count +

  • 微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能

    微信小程序+WEB使用JS实现注册[60s]倒计时功能开发步骤: 1.效果图: 2.页面仅仅利用了JS的相关功能,包含:wxml.js.wxss 2.1wxml页面代码: <text>绑定手机</text> <form bindsubmit="bindMobile"> <view class="form_group"> <text>手 机:</text> <input type="

  • 微信小程序电商常用倒计时实现实例

    微信小程序电商常用倒计时实现实例 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: &q

  • 微信小程序之发送短信倒计时功能

    点击后 代码 <form bindsubmit="formSubmit" bindreset="formReset"> <view class="fidpas"> <input type="number" class="fidpas_inp"placeholder-class="lgin_place" placeholder="请输入手机号&quo

随机推荐