微信小程序实战:计时器 ——setTimeout、setInterval 与 clearInterval 实现倒计时
计时器是日常生活中最常见的功能之一也是学习定时器 API 的经典案例。本文通过微信小程序实现一个 60 秒倒计时器首页先显示空白页面2 秒后自动展示计时界面支持开始、停止、重新计时三种操作并完成 在时间显示界面上增加形容时间如流水的背景文字 的功能扩展。1 案例背景小程序运行后首页显示空白界面过 2 秒以后显示计时界面。计时界面包含计时数字和三个计时按钮开始计时、停止计时、重新计时。计时按钮的初始值为 60。这个案例用来练习 setTimeout、setInterval、clearInterval 三个定时器 API 的配合使用。2 案例目标与实现效果本案例一共有六个实现效果效果 1刚开始展示空白页面2 秒钟以后展示计时界面紫色边框区域内显示 计时器函数的应用、数字 60下方显示三个按钮 效果 2点击 开始计时 按钮开始倒计时 效果 3点击 停止计时 按钮停止计时 效果 4再点击 开始计时 按钮继续计时接着当前的数字倒计时 效果 5计时完成数字倒计时到 0此时点击 开始计时 或 停止计时数字仍然是 0 效果 6点击 重新计时 按钮从 60 开始重新倒计时。3 技术要点3.1 setTimeout延迟执行一次setTimeout (function callback, number delay) 用于设定一个定时器在定时到期以后执行注册的回调函数且只执行一次回调函数。本案例用它实现 过 2 秒以后显示计时界面。3.2 setInterval周期执行setInterval (function callback, number delay) 按照指定的周期以毫秒计反复执行注册的回调函数。本案例用 1000ms 的周期执行回调实现每秒减 1 的倒计时。3.3 clearInterval取消定时器clearInterval (number intervalID) 用于取消由 setInterval 设置的定时器参数是要取消的定时器的 ID。点击 停止计时 时调用它停止倒计时。3.4 生命周期函数与数据绑定onLoad 在页面加载时触发一次适合在这里启动 2 秒的延迟定时器this.setData () 修改 data 中的值并驱动界面更新。4 实现步骤4.1 新建项目在微信开发者工具中新建一个不使用云服务、不使用模板的小程序项目。4.2 修改 app.json使用 webview 渲染引擎将 renderer 设置为 webview。4.3 修改 index.wxml计时界面主要由计时显示界面和三个按钮组成。外层用一个紫色边框区域timer-panel把提示文字和计时数字包起来计时数字用 {{number}} 绑定三个按钮用 view 实现并分别绑定点击响应函数 startCountdown、stopCountdown、restartCountdown计时界面整体用 wx:if{{showTimer}} 控制显示。4.4 修改 index.wxss编写紫色边框区域、计时数字显示界面和三个按钮的样式。数字显示界面是蓝色圆角矩形、内部显示黄色数字三个按钮为绿色圆角按钮固定宽度、带间隙地横向排列page 和 .scrollarea 的样式是创建项目时自动生成的其它都是新增的样式。4.5 修改 app.wxss设置页面背景等全局样式。4.6 修改 index.jsonLoad 中通过 setTimeout 延迟 2 秒把 showTimer 置为 truestartCountdown 用 setInterval 每秒让 number 减 1stopCountdown 用 clearInterval 停止restartCountdown 先停止、再把数字重置为 60、然后重新开始倒计时。5 功能扩展作业要求在时间显示界面上增加形容时间如流水的背景文字。实现方式在数字显示界面上加入文字 逝者如斯夫 不舍昼夜使用 CSS 伪元素 .time::before并采用绝对定位position: absolute;同时将宿主元素.time上加上相对定位position: relative;。这样背景文字以 .time 盒子为定位参考白色文字叠加在蓝色圆角框内部上方、计时数字的上方与计时界面融为一体。6 关键代码6.1 index.wxml 关键片段view classmain wx:if{{showTimer}} view classtimer-panel view classtip计时器函数的应用/view view classtime{{number}}/view /view view classbtn-group view classtimer-btn bind:tapstartCountdown开始计时/view view classtimer-btn bind:tapstopCountdown停止计时/view view classtimer-btn bind:taprestartCountdown重新计时/view /view /view6.2 index.wxss 关键片段紫色边框 功能扩展 按钮.timer-panel { width: 560rpx; border: 4rpx solid #9b59f6; /* 紫色边框区域 */ border-radius: 20rpx; display: flex; flex-direction: column; align-items: center; } .time { position: relative; /* 宿主元素加上相对定位 */ ... } .time::before { content: 逝者如斯夫 不舍昼夜; position: absolute; /* 伪元素绝对定位 */ top: 18rpx; /* 白色文字叠加在蓝色圆角框内部上方 */ left: 50%; transform: translateX(-50%); color: #ffffff; ... } .btn-group { display: flex; flex-direction: row; align-items: center; margin-top: 50rpx; } .timer-btn { width: 170rpx; /* 按钮固定宽度保证不超出屏幕 */ height: 76rpx; line-height: 76rpx; text-align: center; font-size: 28rpx; color: #ffffff; background-color: #07c160; border-radius: 12rpx; margin: 0 16rpx; /* 按钮之间的缝隙 */ }6.3 index.js 关键片段onLoad() { // 过 2 秒以后显示计时界面setTimeout 只执行一次 setTimeout(() { this.setData({ showTimer: true }) }, 2000) } // 开始计时每秒减 1已到 0 则保持 0 startCountdown() { if (this.timer) return this.timer setInterval(() { if (this.data.number 0) { clearInterval(this.timer) this.timer null return } this.setData({ number: this.data.number - 1 }) }, 1000) } // 停止计时取消定时器 stopCountdown() { if (this.timer) { clearInterval(this.timer) this.timer null } } // 重新计时从 60 开始重新倒计时 restartCountdown() { this.stopCountdown() this.setData({ number: 60 }) this.startCountdown() }7 踩坑与注意事项重复点击 开始计时 会叠加多个定时器导致倒计时加速。解决方式在创建定时器前先判断是否已有定时器在运行已有则直接返回停止时把定时器置空。倒计时到 0 后要清除定时器并置空同时不再让数字减到负数这样再点 开始 或 停止数字仍然保持 0。重新计时 的语义是重置为 60 并重新开始倒计时因此要先停止旧定时器再重置数字最后重新开始。定时器要在页面卸载onUnload时清理避免页面关闭后定时器仍在执行。伪元素 ::before 要配合绝对定位使用且宿主元素必须设置相对定位否则定位参考不正确。微信 button 组件自带默认边框和宽高样式容易把按钮撑宽、超出屏幕建议用 view 配合固定宽度实现按钮并保留清晰间隙。8 总结本案例利用 setTimeout 延迟 2 秒显示计时界面、setInterval 每秒减 1 实现倒计时、clearInterval 停止计时并处理好 到 0 保持 0 和 重新计时 等边界逻辑界面采用紫色边框区域布局功能扩展通过 CSS 伪元素 .time::before 配合绝对定位在时间显示界面增加了 逝者如斯夫 不舍昼夜 的白色背景文字。掌握定时器 API 与边界状态处理可以进一步实现秒表、番茄钟、倒计时抢购等实用功能。9 参考资料[1] 微信开放文档・定时器setTimeout—— number setTimeout(function callback, number delay, any rest) | 微信开放文档[2] 微信开放文档・定时器setInterval—— number setInterval(function callback, number delay, any rest) | 微信开放文档[3] 微信开放文档・定时器clearInterval—— clearInterval(number intervalID) | 微信开放文档[4] MDN・CSS ::before 伪元素 ——https://developer.mozilla.org/zh-CN/docs/Web/CSS/::before

相关新闻

YARN调度器深度解析:Fair与Capacity选型、参数调优与故障排查

YARN调度器深度解析:Fair与Capacity选型、参数调优与故障排查

1. 项目概述:为什么一个调度器值得单独写三篇?Yarn调度器——这个词在日常开发中出现频率其实不高,但凡你遇到过“任务卡在ACCEPTED状态不动”“明明集群资源充足却一直排队”“同一个队列里A任务占满资源,B任务饿死”这类问题&am…

2026/10/14 12:43:48 阅读更多 →
Python类型标注详解:从基础语法到工程实践

Python类型标注详解:从基础语法到工程实践

1. 变量类型标注的本质与价值第一次在PyCharm里看到那个黄色的小灯泡提示"Missing type hints"时,我正忙着调试一个复杂的数据处理函数。当时觉得这种标注纯粹是多此一举——Python本来就是动态类型语言,加这些类型声明不是开倒车吗&#xff1…

2026/10/14 12:43:48 阅读更多 →
J2摄动对卫星轨道的影响及Python实现

J2摄动对卫星轨道的影响及Python实现

1. 轨道力学中的J2摄动现象解析 当我们在讨论人造卫星轨道时,常会遇到一个有趣的现象:理论上按照二体问题计算的轨道,在实际观测中总会产生偏差。这种偏差主要来自地球非球形引力场的影响,其中J2项(地球扁率项&#xf…

2026/10/14 12:43:48 阅读更多 →

最新新闻

ESXi 升级到 8.0 后 VM 快照删不掉?一篇讲透 “in progress“ 死循环的 3 种解法

ESXi 升级到 8.0 后 VM 快照删不掉?一篇讲透 “in progress“ 死循环的 3 种解法

本文适用版本:ESXi 7.0 U3 → 8.0 U2 升级场景(vSphere 6.7 升级也会遇到) 阅读时长:约 8 分钟 难度:⭐⭐⭐(操作不可逆,生产 VM 强烈建议先备份再动)一、为什么写这篇文章?最近私信里又有几位网友问:ESXi 7.0 升到 8.0 之后,VM 的快照怎么都删不掉,vSphere Client 里一直显示…

2026/10/15 2:48:27 阅读更多 →
ESXi ping 得通但连不上 vCenter?一篇讲透 hostd 假死的全套救法

ESXi ping 得通但连不上 vCenter?一篇讲透 hostd 假死的全套救法

本文适用版本:ESXi 7.0 U3 / 8.0 U2 / 9.0 GA 阅读时长:约 7 分钟 难度:⭐⭐(SSH 能进就能修,但要分清是 hostd 还是 vpxd 的锅)一、为什么写这篇文章?最近私信里又陆续收到几位网友问:ESXi 能 ping 通、SSH 也能进、DCUI 也正常,但 vCenter 里主机显示"未响应"或&q…

2026/10/15 2:48:27 阅读更多 →
前端XSS防御实战:xss-filters上下文转义库详解

前端XSS防御实战:xss-filters上下文转义库详解

简介:前端开源库-xss-filters是一份面向前端开发者与安全入门者的XSS防护工具源码包,聚焦于解决用户输入回显场景下的跨站脚本注入风险。资源共30个文件,以20个js源码与测试脚本为主体,辅以3个json配置、3个md说明文档&#xff0c…

2026/10/15 2:48:27 阅读更多 →
ESXi 装系统报错 “bootbank is corrupted“ 怎么办?一篇讲透三种根治方案

ESXi 装系统报错 “bootbank is corrupted“ 怎么办?一篇讲透三种根治方案

本文适用版本:ESXi 7.0 U3 / 8.0 U2 / 9.0 GA(三版统一报错,解决方案略有差异) 阅读时长:约 8 分钟 难度:⭐⭐⭐(需在 DCUI/物理机前操作,不建议生产机远程盲操作)一、为什么写这篇文章? 最近陆续有几位网友私信问同一个问题:装 ESXi 的时候跑到一半,屏幕突然卡住,报 bootbank…

2026/10/15 2:48:27 阅读更多 →
React Native position 定位详解:relative 与 absolute 实战指南

React Native position 定位详解:relative 与 absolute 实战指南

1. 为什么 position 定位值得单独拎出来讲做 React Native 开发的人,迟早都会在布局上栽跟头。Flexbox 那一套东西,flexDirection、justifyContent、alignItems三板斧抡完,大部分界面确实能搭出来。但总有一些场景,光靠 Flex 流式…

2026/10/15 2:48:27 阅读更多 →
从零开发聚合9大视频网站的桌面App:技术选型与发布运营复盘

从零开发聚合9大视频网站的桌面App:技术选型与发布运营复盘

前阵子我在一个技术交流群里发了句感叹:“现在做桌面应用,是不是有点逆潮流?”结果有个朋友直接回我:“你做一个有用的桌面工具试试,用户在乎的是好不好用,又不是你用什么平台。”我当时不以为然&#xff0…

2026/10/15 2:47:27 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →