小程序实现一个 倒计时组件

小程序实现一个 倒计时组件

需求背景

  • 要做一个倒计时,可能是天级别,也可能是日级别,时级别,而且每个有效订单都要用,就做成组件了

效果图

Sep-14-2023 16-16-49.gif

Sep-14-2023 16-54-44.gif

需求分析

  1. 需要一个未来的时间戳,或者在服务度直接下发一个未来到现在时间差,我们只需要做倒计时
  2. 进入页面,看是否已经结束, 如果没结束就调用倒计时函数
  3. 每隔1000,做时间戳(毫秒) -1000。边做tick ,边做时间格式化。
  4. 每次调用前,先清除上一个定时器
  5. 组件销毁的时候,也要清除一下定时器

代码实现

  1. 设置初始值,也是1秒,这里单位时毫秒
const interval = 1000;
  1. 进入页面,初始化完成。开始判断是否结束
lifetimes: {ready() {this.startCountdown();},detached() {clearTimeout(this.timer);},},
startCountdown() {const lastTime = this.initTime(this.properties.expireTime); // 这一步,如果服务端返回了未来到现在的差值,则不需要自己计算时间差了// 如果最终时间 < 1000ms 说明 已经过期了,就不用展示倒计时了.if (lastTime > interval) {// 格式化要展示的数据this.defaultFormat(lastTime);this.setData({isCountOver: true, // 标识可以显示倒计时lastTime, // set lastTime});// 调用倒计时函数,主要的逻辑就是每隔1000ms ,让lastTime - 1000this.tick();}},

初始化时间: 如果服务度返回了时间差,这一步不用处理

//初始化时间
initTime(expireTime) {let lastTime = Number(new Date(expireTime * 1000)) - new Date().getTime();console.log('lastTime', lastTime);return Math.max(lastTime, 0);
},

时间的格式化处理,这里都是固定代码,没什么含量

//默认处理时间格式
defaultFormat(time) {const days = 60 * 60 * 1000 * 24;const hours = 60 * 60 * 1000;const minutes = 60 * 1000;const d = Math.floor(time / days);const h = Math.floor((time % days) / hours);const m = Math.floor((time % hours) / minutes);const s = Math.floor((time % minutes) / 1000);this.setData({d: this.fixedZero(d),h: this.fixedZero(h),m: this.fixedZero(m),s: this.fixedZero(s),});
},
// 格式化时间加0
fixedZero(val) {return val < 10 ? `0${val}` : val;
},

tick 倒计时函数

tick() {let { lastTime } = this.data;this.timer = setTimeout(() => {// 每次定时器之前,先把上一个定时器清除clearTimeout(this.timer);// 如果倒计时结束,这是结束的状态if (lastTime < interval) {this.setData({lastTime: 0,isCountOver: false,});} else {// 如果倒计时正常,则每次 -1000 ,并且格式化时间。再次调用tick,直到倒计时结束lastTime -= 1000;this.setData({lastTime,},() => {this.defaultFormat(lastTime);this.tick();},);}}, interval);},

完整代码

  • 父组件(我这里传了一个比较大的时间戳,2024,10.1结束的时间戳)
<order-time expireTime="{{ 1727712000 }}"><view slot="desc">还剩</view>
</order-time>
  • 子组件 (wxml)
<view wx:if="{{ isCountOver }}" class="timer-wrap"><slot name="desc" /><view class="reset-time"><text wx:if="{{ d != '00' }}"> {{ d }}</text>{{ h }}:{{ m }}:{{ s }}</view>
</view>
<view wx:else class="reset-time"> {{ emptyType === '1' ? '已超时': '' }} </view>
  • 子组件 (js)
let interval = 1000;
Component({options: {multipleSlots: true,},properties: {expireTime: {type: String,},emptyType: {type: String,value: '1',},},lifetimes: {ready() {this.startCountdown();},detached() {clearTimeout(this.timer);},},/*** 组件的初始数据*/data: {d: 0, //天h: 0, //时m: 0, //分s: 0, //秒lastTime: '', //倒计时的时间戳isCountOver: false, // 倒计时是否完成},/*** 组件的方法列表*/methods: {startCountdown() {const lastTime = this.initTime(this.properties.expireTime);if (lastTime > interval) {this.defaultFormat(lastTime);this.setData({isCountOver: true,lastTime,});this.tick();}},//默认处理时间格式defaultFormat(time) {const days = 60 * 60 * 1000 * 24;const hours = 60 * 60 * 1000;const minutes = 60 * 1000;const d = Math.floor(time / days);const h = Math.floor((time % days) / hours);const m = Math.floor((time % hours) / minutes);const s = Math.floor((time % minutes) / 1000);this.setData({d: this.fixedZero(d),h: this.fixedZero(h),m: this.fixedZero(m),s: this.fixedZero(s),});},//定时事件tick() {let { lastTime } = this.data;this.timer = setTimeout(() => {clearTimeout(this.timer);if (lastTime < interval) {this.setData({lastTime: 0,isCountOver: false,});} else {lastTime -= 1000;this.setData({lastTime,},() => {this.defaultFormat(lastTime);this.tick();},);}}, interval);},//初始化时间initTime(expireTime) {let lastTime = Number(new Date(expireTime * 1000)) - new Date().getTime();console.log('lastTime', lastTime);return Math.max(lastTime, 0);},// 格式化时间加0fixedZero(val) {return val < 10 ? `0${val}` : val;},},
});
  • 遇到相关变量,自己更改即可

End: 写作粗陋,有纰漏,建议之处,多多指教~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/108713.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LangChain系列 9】Prompt模版——MessagePromptTemplate

原文地址&#xff1a;【LangChain系列 9】Prompt模版——MessagePromptTemplate 本文速读&#xff1a; MessagePromptTemplate MessagesPlaceholder 在对话模型(chat model) 中&#xff0c; prompt主要是封装在Message中&#xff0c;LangChain提供了一些MessagePromptTemplat…

Java虚拟机(JVM)解析:内存区域、类加载、垃圾回收和选型考虑

目录 一、JVM内存区域划分 二、JVM类加载 三、JVM垃圾回收&#xff08;GC&#xff09; 一、JVM内存区域划分 栈堆方法区(元数据区)程序计数器 1.栈 举个例子&#xff1a; 那具体是怎么分的呢&#xff1f;如下图 本地方法栈&#xff1a;给JVM内部的方法准备的栈空间 虚拟…

企业微信自建应用开发流程

开发需知 1、企业微信后台管理&#xff08;不是小程序管理后台&#xff09;&#xff1a;企业微信 2、企业微信开发者文档&#xff08;不是小程序文档&#xff09;&#xff1a;概述 - 接口文档 - 企业微信开发者中心 3、开发应用的类型&#xff1a;根据开发应用类型选择文档。…

STM32F103VET6基于ENC28J60移植LWIP1.4.1(标准库,无RTOS)

目录 环境引脚连接1.准备LWIP2.新建arch3.网卡驱动4.新建分组5.项目头文件路径6.LWIIP头文件编写7.ethernetif.cvoid low_level_init(struct netif *netif)err_t low_level_output(struct netif *netif, struct pbuf *p)struct pbuf *low_level_input(struct netif *netif)void…

UG\NX CAM二次开发 设置安全平面的起点和法向 UF_CAM_set_auto_blank

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 设置安全平面的起点和法向 UF_CAM_set_auto_blank 效果: 代码: void MyClass::do_it() { //获取加工环境tagtag_t setup_tag=NULL_TAG;UF_SETUP_ask_setup(&setup_tag);//返回当前工序导…

财报解读:打好“新鲜牌”,光明乳业业绩规模能否持续扩大?

近期&#xff0c;各大乳企相继披露了中期业绩&#xff0c;从财报情况来看&#xff0c;伊利、蒙牛、光明仍然稳居营收规模上百亿的第一梯队。 值得一提的是&#xff0c;2023年上半年&#xff0c;乳制品行业的发展并非一帆风顺&#xff0c;牧业端饲料价格处在高位&#xff0c;养…

清水模板和混水模板的区别是什么?

清水模板和混水模板是建筑施工中常用的两种模板类型。它们在结构、外观和使用方面存在一些显著的区别。下面将详细介绍清水模板和混水模板的特点和区别。 1. 材料&#xff1a;清水模板是由高分子有机材料制成的&#xff0c;而混水模板则是由混凝土制成的。由于材料的不同&#…

【论文阅读】MARS:用于自动驾驶的实例感知、模块化和现实模拟器

【论文阅读】MARS&#xff1a;用于自动驾驶的实例感知、模块化和现实模拟器 Abstract1 Introduction2 Method2.1 Scene Representation2.3 Towards Realistic Rendering2.4 Optimization3.1 Photorealistic Rendering3.2 Instance-wise Editing3.3 The blessing of moduler des…

网上管理系统的分析及设计---应用UML建模

目 录 第1章 系统需求 第2章 需求分析 2.1 识别参与者 2.2 识别用例 2.3 用例的事件流描述 第3章 静态结构模型 3.1 定义系统对象 3.2 定义用户界面类 3.3 建立类图 第4章 动态行为模型 4.1 创建系统顺序图&#xff08;协作图&#xff09; 4.2 创建系统…

【Spring Boot】有这一文就够了

作者简介 前言 作者之前写过一个Spring Boot的系列&#xff0c;包含自动装配原理、MVC、安全、监控、集成数据库、集成Redis、日志、定时任务、异步任务等内容&#xff0c;本文将会一文拉通来总结这所有内容&#xff0c;不骗人&#xff0c;一文快速入门Spring Boot。 专栏地址…

Jmeter系列进阶-获取图片验证码(4)

安装工具 通过ocrserver工具识别图片验证码&#xff0c;解压后 .exe双击启动即可。 jmeter中使用 &#xff08;1&#xff09;HTTP请求获取验证码 &#xff08;2&#xff09;在获取验证码图片的接口下面添加监听器》保存响应到文件&#xff1b;如下图&#xff1a; &#x…

易点易动固定资产管理系统:为企业提供高效资产管理的必备利器

在如今竞争激烈的商业环境中&#xff0c;企业对于固定资产的管理显得尤为重要。然而&#xff0c;传统的手工管理方式已经无法满足企业对于高效、准确、智能化管理的需求。因此&#xff0c;引入一款先进的固定资产管理系统是必不可少的。易点易动固定资产管理系统作为一款领先的…