微信小程序使用setInterval实现倒计时功能
创作时间:
作者:
@小白创作中心
微信小程序使用setInterval实现倒计时功能
引用
CSDN
1.
https://blog.csdn.net/qq_53816329/article/details/145566120
在微信小程序开发中,倒计时功能是一个常见的需求,特别是在投票、限时活动等场景中。本文将详细介绍如何使用setInterval实现倒计时功能,包括从获取结束时间到计算剩余时间,再到页面展示的完整流程。
需求描述
本需求针对投票功能,需要通过调取接口获取投票功能的结束投票时间(时间可存数据库),即倒计时的结束时间。当然,如果没有获取时间的接口,也可以直接在项目代码中给定结束时间,只不过在结束时间需要改动的情况下需要修改业务代码,不太好维护。
方案制定
1. 声明变量(结束投票时间)
data: {
timeData: {
hour: null, // 时
min: null, // 分
second: null // 秒
}, // 在页面上展示的变量
endTime: '' // 结束投票时间
}
2. 获取数据
- 从接口返回的数据中解构出投票结束时间
- 获取当前时间 (nowTime),使用 new Date().getTime() 获取当前时间戳(以毫秒为单位)
- 将结束时间转换为时间戳
computedTime () {
let { endTime, timeData } = this.data
const nowTime = new Date().getTime() // 当前时间戳
let end = new Date(endTime).getTime() // 结束时间时间戳
let totalSeconds = (end - nowTime) / 1000 // 从当前时间到结束时间的总秒数
timeData.hour = (Math.floor(totalSeconds / 3600) < 0 ? 0 : Math.floor(totalSeconds / 3600)).toString().padStart(2, '0')
timeData.min = (Math.floor((totalSeconds % 3600) / 60) < 0 ? 0 : Math.floor((totalSeconds % 3600) / 60)).toString().padStart(2, '0')
timeData.second = (Math.floor(totalSeconds % 60) < 0 ? 0 : Math.floor(totalSeconds % 60)).toString().padStart(2, '0')
this.setData({
endTime,
timeData
})
},
async fetchStartTime () {
// 如果是直接在项目代码中给定结束时间,则不需要调用接口
const data = await 用于获取投票结束时间接口
this.setData({
endTime: new Date(data.endTime).getTime() // 从回响数据中结构出endTime,并且完成时间戳转换
// endTime: new Date(this.data.endTime).getTime() //指定结束时间
})
let { timer } = this.data
clearInterval(timer) // 及时清除定时器
this.computedTime() // 调用核心处理函数
timer = setInterval(() => {
this.computedTime()
}, 1000); // 声明定时器,每1s调用一次,页面倒计时实现动态修改
this.setData({
timer
})
},
3. 计算剩余时间
计算从当前时间到结束时间的总秒数,通过 (结束时间时间戳 - 当前时间戳) / 1000 得到
格式化时间:
小时:计算剩余的小时数,并确保其为两位数。如果剩余时间小于0,则设置为0。
timeData.hour = (Math.floor(totalSeconds / 3600) < 0 ? 0 : Math.floor(totalSeconds / 3600)).toString().padStart(2, '0')
分钟:计算剩余的分钟数,并确保其为两位数。如果剩余时间小于0,则设置为0。
timeData.min = (Math.floor((totalSeconds % 3600) / 60) < 0 ? 0 : Math.floor((totalSeconds % 3600) / 60)).toString().padStart(2, '0')
秒:计算剩余的秒数,并确保其为两位数。如果剩余时间小于0,则设置为0。
timeData.second = (Math.floor(totalSeconds % 60) < 0 ? 0 : Math.floor(totalSeconds % 60)).toString().padStart(2, '0')
/** * targetLength:目标字符串的最小长度。如果原字符串已经等于或超过这个长度,则不会进行填充 * padString(可选):用于填充的字符串,默认为空格。如果 padString 的长度超过了需要填充的长度,它会被截断 * **/ // 在这里 padStart 用于确保小时、分钟和秒数始终为两位数 let _str = str.padStart(targetLength, padString)
完整代码
Page({
data: {
timeData: {
hour: null,
min: null,
second: null
},
endTime: '',
},
onShow: function () {
this.fetchStartTime()
},
async fetchStartTime () {
const data = await 用于获取投票结束时间接口
this.setData({
endTime: new Date(data.endTime).getTime()
})
let { timer } = this.data
clearInterval(timer)
this.computedTime()
timer = setInterval(() => {
this.computedTime()
}, 1000);
this.setData({
timer
})
},
onHide () { // 页面触发隐藏事件,及时清除定时器
this.setData({
timer: clearInterval(this.data.timer)
})
},
computedTime () {
let { endTime, timeData } = this.data
const nowTime = new Date().getTime()
let end = new Date(endTime).getTime()
let totalSeconds = (end - nowTime) / 1000
timeData.hour = (Math.floor(totalSeconds / 3600) < 0 ? 0 : Math.floor(totalSeconds / 3600)).toString().padStart(2, '0')
timeData.min = (Math.floor((totalSeconds % 3600) / 60) < 0 ? 0 : Math.floor((totalSeconds % 3600) / 60)).toString().padStart(2, '0')
timeData.second = (Math.floor(totalSeconds % 60) < 0 ? 0 : Math.floor(totalSeconds % 60)).toString().padStart(2, '0')
this.setData({
endTime,
timeData
})
},
})
页面展示
<view>
<view class="time-item" >{{timeData.hour}}</view>
<view class="radio">: </view>
<view class="time-item">{{timeData.min}}</view>
<view class="radio">:</view>
<view class="time-item" >{{timeData.second}}</view>
</view>
演示
可以脑补动态【bushi hahahahaha】
小小彩蛋
蜘蛛停下工作,看了一会儿日出。 —阿巴斯-
热门推荐
为何美国的猪肉4元一斤,牛肉也才8元一斤,背后的原因令人深思
屋顶防水层的维护保养与修复方法
女人夜里盗汗的原因和治疗方法
韩国戒严风波背后:右翼博主传播虚假信息
建站前期准备全攻略:如何高效规划网站架构与内容布局
让传统“鲜活”当下,广东有什么“圈粉”利器?
膝关节测试的意义
企业考勤管理:迟到早退的定义、管理与合规性解析
麻仁润肠丸孕妇可以吃吗
从优雅到俗气,中国“丈夫文化”的称谓经历了哪些变化?
单位考勤管理制度怎么制定才能符合法律法规?
CSMA/CD协议详解:以太网通信机制的核心原理
普洱生姜茶缓解胃酸过多:功效、饮用方法及注意事项全面解析
晋惠帝“何不食肉糜”背后的历史审视
与心相约,“育”见美好,同享教育公平——君山区全力解决进城务工人员子女教育问题
元谋土林:云南三大奇林之一的地质瑰宝
武则天的一生:历史故事的真实详细解读
个人征信报告查询次数影响贷款吗 如何避免风险
曾侯乙编钟写入新修订历史教材
透过斑斓图案 探寻多彩贵州的文化瑰宝
空调安装位置有什么讲究?
小金丸对治疗肺结节有效吗
小金丸治疗肺结节效果怎么样
吸尘器功率与吸力关系及选购注意事项
法考刑法比法硕难:解析二者的比较与备考策略
LPR重定价周期选择6个月还是12个月,如何选择最优方案?
商标申请续展是什么:从法律角度解析商标续展的时间与程序
从灭活苗到mRNA疫苗:不同技术路线如何塑造免疫记忆?
打造“世界中医药之都”,为什么是亳州?
和声学基础知识