Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小程序倒计时深究

小程序倒计时深究

作者头像
张炳
发布于 2019-08-02 08:24:44
发布于 2019-08-02 08:24:44
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

小程序倒计时重叠抖动问题

因为请求数据写在onShow 函数里面,所以每次切换界面都会刷新,这就会导致,如果当前 定时器在跑的话,再次刷新会再次常见定时, 那么就会导致刷新几次有几个定时器,同时在跑,那么前端界面显示的计时数字 就会不时跳动,所以需要保证在跑的定时器只有一个。将定时器对象创建为全局的,在每次开启定时器的时候先清空之前的定时器。就可以解决刷新后计时闪动的问题了,或者在在tab页面,运用 onHide 周期 进行 clearTimeInterval清空 , 在 非tab页面,运用onUload() 周期 进行 clearTimeInterval清空,百度都可以找到类似解决方案,其中在我的历史文章小程序实战踩坑之B2B商城项目总结也有总结,代码类似如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
   * 清除interval
  * @param that
  */
 clearTimeInterval: function (that) {
    var interval = that.data.interval;
    clearInterval(interval)
  },
 
 /**
   * 生命周期函数--监听页面卸载
   * 退出本页面时停止计时器
  */
 onUnload:function () {
      var that = this;
      that.clearTimeInterval(that)
 },
 
 /**
   * 生命周期函数--监听页面隐藏
   * 在后台运行时停止计时器
  */
 onHide:function () {
      var that = this;
      that.clearTimeInterval(that)
 }

倒计时使用setInterval或setTimeout触摸屏幕导致时间显示的突跳,突慢问题,卡顿,甚至停止

不信的同学,可以尝试用手指触摸屏幕,上下小幅上下移动不放,你会发觉时间竟然停止了。(特别是针对低端机型)

通常同学写代码都会如此:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                let self = this;
                let lefttimeSec = time - new Date().getTime();
                let calc = setInterval(function() {
                    lefttimeSec -= 1000;
                    self.endtimestr = '距离拼单结束还有' + self.dateformat(lefttimeSec);
                    self.$apply();
                    if (lefttimeSec <= 0) {
                        clearInterval(calc);
                    }
                }, 1000);

使用setInterval后,即使用了上面说的“小程序倒计时重叠抖动问题”解决方案,只是解决了倒计时重叠问题,这样写法,会导致的一些精准度不高。其实很简单,解决代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                showCountTime(time){
                    let self = this;
                    setTimeout(function(){
                        let lefttimeSec = time - new Date().getTime();
                        lefttimeSec -= 1000;
                        self.endtimestr = '距离拼单结束还有' + self.dateformat(lefttimeSec);
                        self.$apply();
                        self.showCountTime(time);
                    },1000);
                }

注意,这里用了setTimeout,要tab页面,运用onHide周期进行clearTimeout清空, 在非tab页面,运用onUload()周期 进行clearTimeout清空定时器。这步必须要做,就不多说了,要不还是会出现上面说的“小程序倒计时重叠抖动问题”问题。

用了上面代码,补失的精准度不足。小心的测试同学会发现触摸屏幕导致的突跳,突慢问题,甚至停止!于是各种寻思,去找了拼多多小程序,京东购物小程序各种对比。 结论是拼多多存在和我一样的问题,京东购物小程序的倒计时没这样的问题,给个赞!

出现问题环境描述:

  • 小程序框架:wepy : "^1.7.2"
  • 测试机型:红米3

自身思路是wepy脏检查在触摸(滚动)屏幕下引起性能占用导致的一些效率不足问题,做了进一步测试,还是用红米3机型,抛掉组件,抛掉data,只保留data,做一个简单的渲染,将页面高度固定,让屏幕可以上下滑动,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<style>
    .content {
        height: 2000rpx;
        border: 1rpx solid red;
    }
    .child {
        height: 500rpx;
    }
</style>
<template>
    <view class="content">
        <view class="child"></view>
        {{endtimestr}}
    </view>
</template>
<script>
    import wepy from 'wepy';
    export default class test extends wepy.page {
        data = {
            endtimestr: ''
        }
        showCountTime(time) {
            let self = this;
            setTimeout(function() {
                let lefttimeSec = time - new Date().getTime();
                lefttimeSec -= 1000;
                self.endtimestr = '距离拼单结束还有' + self.dateformat(lefttimeSec);
                self.$apply();
                self.showCountTime(time);
            }, 1000);
        }
        dateformat = (micro_second) => {
            // 总秒数
            var second = Math.floor(micro_second / 1000);
            // 天数
            var day = Math.floor(second / 3600 / 24);
            // 小时
            var hr = Math.floor(second / 3600 % 24);
            // 分钟
            var min = Math.floor(second / 60 % 60);
            // 秒
            var sec = Math.floor(second % 60);
            hr = hr < 10 ? '0' + hr : hr;
            min = min < 10 ? '0' + min : min;
            sec = sec < 10 ? '0' + sec : sec;
            if (day > 0) {
                return day + " 天" + ' ' + hr + ":" + min + ":" + sec;
            } else {
                return hr + ":" + min + ":" + sec;
            }
        }
        onLoad() {
            //api模拟得到time
            this.showCountTime(1545899950167);
        }
    }
</script>

结论是: 倒计时在触摸(滚动)情况下正常了!!!那也表明wepy的脏检查存在一些性能的不足呀,希望未来wepy有改进!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【黄啊码】微信小程序倒计时秒杀功能
在使用完定时器后一定要清除定时器,否则定时器将一直运行,占用程序资源,甚至程序报错。关于有效清除定时器方法在微信开放社区的讨论:微信小程序使用clearInterval清除定时函数无效? | 微信开放社区
黄啊码
2021/09/26
8010
微信小程序之自定义倒计时组件
开头 最近写小程序写上瘾了,业务上需要实现一个倒计时的功能,考虑到可拓展以及使用方便,便将其封装成组件(写习惯了JSX不得不吐槽小程序自定义组件的繁琐) 需求 可配置倒计时的时间 倒计时结束后执行事件 可配置倒计时时间的格式 步骤 先定义自定义组件的properties,这里有两个父组件传给该倒计时组件的参数target倒计时的时间,format倒计时时间的格式 properties: { target: { type: String, }, format: {
w候人兮猗
2020/07/01
2.3K0
小程序实现简单的倒计时秒杀效果
2:时分秒倒计时+样式 拼团秒杀功能 https://blog.csdn.net/qq_41473887/article/details/81287786
王小婷
2022/05/13
1K0
小程序实现简单的倒计时秒杀效果
js倒计时,秒倒计时,天倒计时
距某某开幕式还有 [<script language="JavaScript" type="text/javascript">djs()</script>] 天
用户3055976
2018/09/12
11.9K0
JavaScript案例:倒计时
案例分析 核心算法:输入的时间减去现在的时间就是剩余时间,即倒计时,但是不能拿时分秒去减,比如05分减去25分,结果是负数。 用时间戳来实现,用户输入时间总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的毫秒数。 把剩余时间的毫秒数转换为时分秒标准格式。 转换公式 d = parselnt(总秒数/60/60/24);//计算天数 h = parselnt(总秒数/60/60%24); //计算小时 m = parselnt(总秒数/60%60); //计算分数 s = parselnt(总秒数%60
岳泽以
2022/10/26
1.8K0
js倒计时代码最简单的(js倒计时10秒代码)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127705.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/25
10.7K0
手把手带你分解 Vue 倒计时组件
因为我的页面中需要使用到倒计时功能,发现大佬的已经写了个现成的倒计时组件,于是直接就拿过来用了。
@超人
2022/01/10
1.6K0
手把手带你分解 Vue 倒计时组件
考研倒计时
<style> .gn_box{border: none; border-radius: 15px; } .gn_box { padding: 10px 10px; margin: 10px; margin-bottom: 16px; text-align: center; background-color: #000; //背景颜色} .time{color: #ded6d6; //时间文字颜色 h3{} font-size: 18px;}
后端码匠
2021/08/19
2.2K0
前端如何写一个精确的倒计时
关于写倒计时大家可能都都比较熟悉,使用 setTimeout 或 setInterval 就可以搞定。几秒钟或者几分钟的倒计时这样写没有问题,但是如果是长时间的倒计时,这样写就会不准确。如果用户修改了他的设备时间,这样的倒计时就没有意义了。今天就说说写一个精确的倒计时的方法。
零式的天空
2022/03/28
8280
前端如何写一个精确的倒计时
react 倒计时 hook
import { useRef, useState, useEffect } from 'react'; /** * 解析毫秒为天、时、分、秒 * @param milliseconds 毫秒 */ const parseMs = (milliseconds: number) => { return { days: Math.floor(milliseconds / 86400000), hours: Math.floor(milliseconds / 3600000) % 2
小鑫
2022/04/25
8490
html倒计时免费代码,JS倒计时代码汇总[通俗易懂]
Temp=Yearleft+’年, ‘+Monthleft+’月, ‘+Dateleft+’天, ‘+Hourleft+’小时, ‘+Minuteleft+’分, ‘+Secondleft+’秒’
全栈程序员站长
2022/07/22
5.6K0
小程序Ticker倒计时最佳实践
01 什么是ticker? tick本来的意思是钟表的滴答声。Ticker类为游戏开发提供了一个主要的定时类。它主要的目的就是把stage渲染的工作集中起来,也就是说定时调用stage.update()这个方法。Ticker设置的频率也就是游戏的帧数了。我们把Ticker应用到小程序开发中,频率设置为1s。 Ticker的使用如下,初始化Ticker对象,添加侦听tick事件,启动ticker。 const ticker = new Ticker()// 参数为Object类型,必须有t
腾讯NEXT学位
2019/11/04
1.1K0
小程序Ticker倒计时最佳实践
前端技术前沿8
实现倒计时(天数、时、分、秒) parseInt() 函数可解析一个字符串,并返回一个整数。 <body onload="leftTimer()"> <h2>剩余时间:</h2> <div id="timer"></div> </body> <script language="javascript" type="text/javascript"> function leftTimer(year,month,day,hour,minute,second){ var leftTime =
达达前端
2019/07/03
5.9K0
前端技术前沿8
使用react render props实现倒计时
react的组件模式可以观看Michael Chan的演讲视频,平时大家常听到的react模式也是HOC, HOC的使用场景很多,譬如react-redux的connect,这里不赘述HOC相关,感兴趣可以自行了解。
IMWeb前端团队
2019/12/03
1.3K0
使用react render props实现倒计时
微信小程序----团购或秒杀的批量倒计时实现
效果图 实现思路 微信小程序实现倒计时,可以将倒计时的时间进行每一秒的计算和渲染! JS 模拟商品列表数据 goodsList; 在 onLoad 周期函数中对活动结束时间进行提取; 建立时间格
Rattenking
2021/02/01
1.2K0
微信小程序----团购或秒杀的批量倒计时实现
为handsome博客添加侧边栏倒计时
代码/usr/themes/handsome/component/sitebar.php 大约第26行位置添加
小屁的博客
2022/05/13
2910
在Vue.js中实现倒计时计时器
服务水平协议(SLAs)通常有严格的时间要求,对剩余时间进行可视化表示非常重要。在本文中,我们将探讨如何在Vue.js中实现一个倒计时计时器,用于显示SLAs的剩余时间。
泽霖
2024/02/03
1.4K0
简易的倒计时代码_简单的网页代码
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125290.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/02
1.2K0
简易的倒计时代码_简单的网页代码
小程序实践(八):验证码倒计时功能
 效果如下:点击发送验证码按钮,按钮背景变色,不可点击,显示倒计时文字   首先js文件的data里面 声明一个变量用于表示当前是否可以点击,codeIsCanClick = true,  默认是可以
听着music睡
2018/07/19
1.1K0
春节倒计时
handsome今天更新到6.0 逛博友博客的时候看到春节倒计时 他竟然没贴代码 妥妥看上了就扒走ctrl+u走起
Qicloud
2022/01/28
8490
相关推荐
【黄啊码】微信小程序倒计时秒杀功能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验