微信小程序使用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】
小小彩蛋
蜘蛛停下工作,看了一会儿日出。 —阿巴斯-
热门推荐
冬季避寒胜地:除了海南,中国其他不冷的地方
合同诉讼证据应该如何保存
金冠仙人球花期全解析:从生长到开花的全方位养护指南
详述怎样将U盘分区并给U盘分区添加启动盘引导
长沙机场直达五一广场,“机场快线”正式开通,记者还为你整理了这几种出行方式、票价
干股与实股权益区别解析:探究公司股权结构中的两种类型
聪明人看劳动合同会注意的细节
Perampanel吡仑帕奈片在难治性癫痫治疗中的疗效与安全性分析
四大菩萨,你拜对了吗?拜佛也是一门学问
鼻骨骨折怎么办
机械设计基础:从失效分析到材料选择的全面指南
空腹血糖这个数还不算糖尿病,别急着吃药
宝宝适合吃哪些辅食?适合小宝宝吃的营养辅食汇总
宝宝添加辅食后的常见反应及应对方法
到2030年,可再生能源制氢可能具有成本竞争力
人工髋关节材料:金属、高分子、陶瓷
怎样挑选一个合适月嫂
牛肚菌的三种美味做法
广电卡哪款套餐最适合使用5G网络?
如何通过美元汇率影响黄金行情?
团队作业如何量化考核
炉石传说英雄之麦迪文的故事
Excel中统计相同名称个数的多种方法
56岁农民阿姨把土坯房收拾成展厅:共享菜园如何促进社区和谐?
肌酐偏低要警惕三种疾病
9310碳钢的力学性能与热处理工艺详解
废油作肥能让茉莉爆花? “绿小武”专家:切勿轻信土方
AI绘画 | 别找了,一篇搞定中国风
大学专业有哪些?全国大学专业分类大全及介绍(816个)
Excel数据分析插件:从入门到精通的全面指南