news 2026/8/19 13:49:51

微信小程序篮球计分板实战:计时、暂停和撤销怎么设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微信小程序篮球计分板实战:计时、暂停和撤销怎么设计

做篮球计分板时,最容易被低估的是状态一致性。

比分加减并不难,真正容易出错的是这些场景:计时正在运行时用户切到后台;记录暂停后,主计时和进攻计时没有一起停;误点一次两分球,撤销后总分恢复了,但节比分和操作记录没有恢复。

如果只围绕页面按钮写逻辑,功能越加越难维护。更稳妥的做法,是先把比赛状态、计时器和业务事件分开。

## 计时显示不是状态源

计分板通常需要保存以下字段:

```js
const matchState = {
timerMode: 'down', // down:倒计时;up:正计时
clockSeconds: 600,
clockRunning: false,
period: 1,
homeScore: 0,
awayScore: 0,
events: []
}
```

页面上的 `10:00` 只是 `clockSeconds` 的格式化结果,不应成为业务状态。切换正计时和倒计时时,也只需要重置秒数:

```js
function resetClock(mode, periodMinutes) {
return mode === 'down' ? periodMinutes * 60 : 0
}

function stepClock(mode, seconds) {
return mode === 'down'
? Math.max(0, seconds - 1)
: seconds + 1
}
```

这样,显示格式、节次设置和比赛结果保存都围绕同一份秒数工作,不必从文本中反向解析时间。

## 不要假设 setInterval 永远准时

小程序进入后台后,定时器可能暂停或延迟。如果重新显示页面时继续沿用离开前的数值,比赛时间就会少走一段。

处理方法是:页面隐藏时记下时间戳和运行状态,并停止定时器;页面恢复时计算实际经过的秒数。

```js
onHide() {
this.hiddenAt = Date.now()
this.clockWasRunning = this.data.clockRunning
this.stopClock()
},

onShow() {
if (!this.hiddenAt || !this.clockWasRunning) return

const elapsed = Math.floor(
(Date.now() - this.hiddenAt) / 1000
)

const next = this.data.timerMode === 'down'
? Math.max(0, this.data.clockSeconds - elapsed)
: this.data.clockSeconds + elapsed

this.setData({ clockSeconds: next })
this.startClock()
}
```

倒计时恢复到零时,不应再次启动定时器,而应直接进入本节结束处理。进攻计时也要使用同样的恢复规则,并且不能越过主计时的结束点。

## 暂停不是弹出一个对话框

一次球队暂停至少包含四个动作:

- 增加该队暂停次数;
- 写入一条带节次和时间的比赛事件;
- 停止主计时;
- 停止进攻计时。

这四步应放在同一个业务入口里。只显示“已暂停”的弹窗,却忘记停止其中一个计时器,现场记录很快就会对不上。

```js
function handleTeamTimeout(side) {
saveUndoSnapshot('暂停')
increaseTimeoutCount(side)
appendEvent({
period: state.period,
time: getEventTime(),
team: side,
action: '暂停'
})
stopMainClock()
stopShotClock()
}
```

是否继续读秒、是否播放暂停音乐,可以交给后续交互确认。比赛状态先停稳,再处理声音和提示,业务逻辑会清楚很多。

## 撤销要恢复一组关联状态

误点得分时,只把总分减回去并不够。一次得分可能同时改变总分、单节比分、球员得分和最近操作。

简单可靠的方式,是在执行可撤销操作前保存快照:

```js
function pushUndoSnapshot(label) {
undoStack.push({
label,
data: {
homeScore: state.homeScore,
awayScore: state.awayScore,
periodScores: clone(state.periodScores),
playerStats: clone(state.playerStats),
events: clone(state.events)
}
})

undoStack = undoStack.slice(-30)
}

function undoLastAction() {
const snapshot = undoStack.pop()
if (!snapshot) return

restoreState(snapshot.data)
saveMatchRecord()
}
```

快照只保存会被本次操作修改的字段。实时比赛时间通常不跟随一次比分撤销回退,否则用户撤销两分球时,计时也可能跳回几秒前。

如果后续需要多人协同记录或云端审计,可以把快照升级为命令模式:每次操作保存动作类型、前值、后值、操作者和时间,再为每类动作编写对应的逆操作。

**操作记录要能回答“为什么变成这样”**

最近操作不能只显示“主队 +2”。更有用的事件结构包括:

```js
{
id: 'event-id',
period: 2,
time: '03:18',
team: '主队',
action: '#7 李明 得分 +2',
score: '36-31'
}
```

这条记录能帮助现场人员确认三件事:发生在哪一节、当时比赛时间是多少、操作后的比分是多少。出现争议时,也能快速定位需要撤销或核对的动作。

## 上线前至少测试这些场景

1. 正计时和倒计时分别运行、暂停、恢复、归零。
2. 计时过程中切后台十秒,再返回前台。
3. 记录球队暂停后,主计时和进攻计时是否同时停止。
4. 连续记录两分、犯规和换人,再逐次撤销。
5. 撤销栈为空时是否给出明确提示。
6. 一节结束时是否阻止重复蜂鸣和重复结算。
7. 页面退出或比赛结束时,最后状态是否已经保存。

篮球计分板不是单纯的数字面板。把时间当作独立状态,把暂停当作完整业务动作,把撤销设计成关联状态恢复,后续增加节次、犯规、球员统计和赛果保存时会更容易控制。

完整的现场操作顺序可参考:[篮球比赛现场计分指南]

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 13:49:46

雷克萨斯NX特别版深度解析:设计、配置与市场策略

1. 从一张官图,看雷克萨斯NX特别版的“特别”之处 最近,雷克萨斯在芝加哥车展上放出了一组NX特别版的官图。对于车迷和潜在买家来说,这组图片的信息量,远比乍看之下要大得多。它不像一次简单的年度改款,更像是一次精准…

作者头像 李华
网站建设 2026/8/19 13:45:08

推荐系统实战翻车:学了两周理论跑代码时,我才发现AWS课程强调的特征工程有多重要

推荐系统实战翻车:学了两周理论跑代码时,我才发现AWS课程强调的特征工程有多重要 从理论到实践:一个推荐系统工程师的完整成长路径 从理论自信到第一次报错:数据质量的警醒 刚学完推荐系统基础理论时,我确实沉浸在掌握矩阵分解算法的成就感中。那时的笔记本上还保留着我对SVD…

作者头像 李华
网站建设 2026/8/19 13:44:19

AgenticCache:缓存驱动的异步规划如何解决具身智能体行动卡顿难题

1. 从“卡顿”到“流畅”:具身智能体的行动瓶颈与缓存驱动异步规划的诞生如果你尝试过让一个具身AI智能体(比如一个家庭服务机器人)去执行一个稍微复杂点的任务,比如“去厨房倒杯水,然后拿到客厅的茶几上”&#xff0c…

作者头像 李华
网站建设 2026/8/19 13:42:30

AI工具链实战:零代码基础,几天内搭建现代化企业官网

你爸是不是也说过类似的话:“儿子啊,公司这个网站太老了,客户都说看着像十年前的东西。你懂电脑,能不能帮忙弄一下?” 作为技术人,我们当然想帮忙,但一想到要从前端设计、后端逻辑、服务器部署一…

作者头像 李华
网站建设 2026/8/19 13:42:05

汽车ESP传感器:从MEMS原理到故障排查的深度解析

1. 从一次深夜的“甩尾”说起:为什么ESP的传感器是汽车的“第六感”几年前,我还在主机厂做底盘电控标定的时候,有一次冬季路试的经历让我至今记忆犹新。那是在一条结冰的环路上,我驾驶着一辆测试车,以大约60公里每小时…

作者头像 李华
网站建设 2026/8/19 13:40:37

基于蓝牙串口与LabVIEW FPGA的嵌入式无线控制项目实践

1. 项目概述:当蓝牙遇上嵌入式控制 最近在整理实验室的NI myRIO设备时,发现了一个挺有意思的玩法:用手机通过蓝牙,远程控制myRIO板载的LED灯。听起来好像很简单,不就是点个灯嘛?但当你真正把蓝牙模块HC-05、…

作者头像 李华