鸿蒙 ArkTS 实战:厨房纸消耗的状态建模、核心算法与交互实现
鸿蒙 ArkTS 实战:厨房纸消耗的状态建模、核心算法与交互实现
前言
厨房纸消耗是一款面向具体生活场景的库存流水工具,主要用于按卷登记厨房纸消耗,并同步计算剩余库存和使用记录。
项目使用 ArkTS 编写业务状态和函数,使用 ArkUI 组织页面结构,核心数据包括 rolls、used、history。
与只展示固定文字的页面不同,这个项目围绕计算属性、库存下限、unshift 流水与重置操作建立了完整的数据闭环。
默认状态为初始 12 卷、已用 0 卷、空流水,打开页面后即可观察剩余库存、累计用量和倒序记录流水。
本文以真实页面源码为基础,解释状态从输入控件进入业务函数,再转化为结果区域的全过程。
图 1:DevEco Studio 提供 ArkTS 编辑、构建、预览与调试能力,本文代码可直接在该环境中运行。
小型工具页面的技术价值不取决于组件数量,而取决于输入、规则、边界和反馈能否形成可复算的闭环。
当每个结果都能追溯到明确状态时,界面行为会更稳定,临界条件也更容易验证。
本项目最值得关注的实现主线是 计算属性、库存下限、unshift 流水与重置操作,它直接决定页面结论是否符合业务直觉。
文章只讨论当前源码已经实现的本地能力,不虚构网络接口、数据库、后台服务或跨设备同步。
一、库存口径与业务对象
1.1 数据与结构
厨房纸消耗在这一部分围绕库存口径与业务对象展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
库存不是静态数字,而是初始卷数与累计消耗的差值。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
1.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
1.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
1.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
| 库存口径与业务对象维度 | 当前实现 | 页面作用 |
|---|---|---|
| 状态 | rolls、used、history | 保存当前业务数据 |
| 规则 | remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水 | 生成剩余库存、累计用量和倒序记录流水 |
| 边界 | 库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存 | 防止无效状态 |
| 反馈 | 剩余库存、累计用量和倒序记录流水 | 形成可读结论 |
二、getter 计算剩余量
2.1 数据与结构
厨房纸消耗在这一部分围绕getter 计算剩余量展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
流水采用 unshift 插入首位,让最近一次消耗始终优先显示。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
2.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
2.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
2.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
三、消耗操作的前置条件
3.1 数据与结构
厨房纸消耗在这一部分围绕消耗操作的前置条件展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
重置只清除本次使用量和流水,不修改用户设置的初始库存。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
3.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
3.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
3.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
- 读取当前状态,确认输入处于控件允许范围。
- 调用成员函数,计算中间值或更新目标记录。
- 执行阈值判断、数组更新、取整或非负保护。
- 由 ArkUI 重新读取状态并刷新结果区域。
四、流水记录的时间顺序
4.1 数据与结构
厨房纸消耗在这一部分围绕流水记录的时间顺序展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
库存不是静态数字,而是初始卷数与累计消耗的差值。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
4.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
4.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
4.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
| 流水记录的时间顺序维度 | 当前实现 | 页面作用 |
|---|---|---|
| 状态 | rolls、used、history | 保存当前业务数据 |
| 规则 | remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水 | 生成剩余库存、累计用量和倒序记录流水 |
| 边界 | 库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存 | 防止无效状态 |
| 反馈 | 剩余库存、累计用量和倒序记录流水 | 形成可读结论 |
五、库存滑块的联动收敛
5.1 数据与结构
厨房纸消耗在这一部分围绕库存滑块的联动收敛展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
流水采用 unshift 插入首位,让最近一次消耗始终优先显示。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
5.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
5.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
5.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
六、空记录与有记录分支
6.1 数据与结构
厨房纸消耗在这一部分围绕空记录与有记录分支展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
重置只清除本次使用量和流水,不修改用户设置的初始库存。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
6.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
6.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
6.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
- 厨房纸消耗只保存会被用户操作改变或需要持续展示的状态。
- consume 及相关表达式负责当前项目的计算和组合更新。
- 剩余库存、累计用量和倒序记录流水把内部数值和状态转化为当前场景可理解的信息。
- 厨房纸消耗使用颜色强化状态,但最终结论仍由文字和数字共同表达。
七、重置语义与状态范围
7.1 数据与结构
厨房纸消耗在这一部分围绕重置语义与状态范围展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
库存不是静态数字,而是初始卷数与累计消耗的差值。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
7.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
7.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
7.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
八、库存耗尽场景演算
8.1 数据与结构
厨房纸消耗在这一部分围绕库存耗尽场景演算展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
流水采用 unshift 插入首位,让最近一次消耗始终优先显示。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
8.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
8.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
8.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
| 库存耗尽场景演算维度 | 当前实现 | 页面作用 |
|---|---|---|
| 状态 | rolls、used、history | 保存当前业务数据 |
| 规则 | remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水 | 生成剩余库存、累计用量和倒序记录流水 |
| 边界 | 库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存 | 防止无效状态 |
| 反馈 | 剩余库存、累计用量和倒序记录流水 | 形成可读结论 |
九、ArkTS 页面入口与组件职责
9.1 数据与结构
厨房纸消耗在这一部分围绕ArkTS 页面入口与组件职责展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
重置只清除本次使用量和流水,不修改用户设置的初始库存。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
9.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
9.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
9.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
- 读取当前状态,确认输入处于控件允许范围。
- 调用成员函数,计算中间值或更新目标记录。
- 执行阈值判断、数组更新、取整或非负保护。
- 由 ArkUI 重新读取状态并刷新结果区域。
十、@State 响应式状态链路
10.1 数据与结构
厨房纸消耗在这一部分围绕@State 响应式状态链路展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
库存不是静态数字,而是初始卷数与累计消耗的差值。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
10.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
10.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
10.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
十一、业务函数与界面构建分离
11.1 数据与结构
厨房纸消耗在这一部分围绕业务函数与界面构建分离展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
流水采用 unshift 插入首位,让最近一次消耗始终优先显示。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
11.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
11.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
11.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
- 厨房纸消耗只保存会被用户操作改变或需要持续展示的状态。
- consume 及相关表达式负责当前项目的计算和组合更新。
- 剩余库存、累计用量和倒序记录流水把内部数值和状态转化为当前场景可理解的信息。
- 厨房纸消耗使用颜色强化状态,但最终结论仍由文字和数字共同表达。
十二、ArkUI 控件的事件回调
12.1 数据与结构
厨房纸消耗在这一部分围绕ArkUI 控件的事件回调展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
重置只清除本次使用量和流水,不修改用户设置的初始库存。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
12.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
12.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
12.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
| ArkUI 控件的事件回调维度 | 当前实现 | 页面作用 |
|---|---|---|
| 状态 | rolls、used、history | 保存当前业务数据 |
| 规则 | remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水 | 生成剩余库存、累计用量和倒序记录流水 |
| 边界 | 库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存 | 防止无效状态 |
| 反馈 | 剩余库存、累计用量和倒序记录流水 | 形成可读结论 |
十三、声明式刷新与结果派生
13.1 数据与结构
厨房纸消耗在这一部分围绕声明式刷新与结果派生展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
库存不是静态数字,而是初始卷数与累计消耗的差值。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
13.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
13.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
13.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
十四、输入边界和异常值保护
14.1 数据与结构
厨房纸消耗在这一部分围绕输入边界和异常值保护展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
流水采用 unshift 插入首位,让最近一次消耗始终优先显示。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
14.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
14.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
14.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
十五、页面布局与信息层级
15.1 数据与结构
厨房纸消耗在这一部分围绕页面布局与信息层级展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
重置只清除本次使用量和流水,不修改用户设置的初始库存。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
15.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
15.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
15.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
- 读取当前状态,确认输入处于控件允许范围。
- 调用成员函数,计算中间值或更新目标记录。
- 执行阈值判断、数组更新、取整或非负保护。
- 由 ArkUI 重新读取状态并刷新结果区域。
十六、颜色、文字与状态反馈
16.1 数据与结构
厨房纸消耗在这一部分围绕颜色、文字与状态反馈展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
库存不是静态数字,而是初始卷数与累计消耗的差值。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
16.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
16.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
16.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
| 颜色、文字与状态反馈维度 | 当前实现 | 页面作用 |
|---|---|---|
| 状态 | rolls、used、history | 保存当前业务数据 |
| 规则 | remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水 | 生成剩余库存、累计用量和倒序记录流水 |
| 边界 | 库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存 | 防止无效状态 |
| 反馈 | 剩余库存、累计用量和倒序记录流水 | 形成可读结论 |
十七、默认数据的首次运行
17.1 数据与结构
厨房纸消耗在这一部分围绕默认数据的首次运行展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
流水采用 unshift 插入首位,让最近一次消耗始终优先显示。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
17.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
17.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
17.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
十八、连续操作下的状态迁移
18.1 数据与结构
厨房纸消耗在这一部分围绕连续操作下的状态迁移展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
重置只清除本次使用量和流水,不修改用户设置的初始库存。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
18.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
18.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
18.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
- 厨房纸消耗只保存会被用户操作改变或需要持续展示的状态。
- consume 及相关表达式负责当前项目的计算和组合更新。
- 剩余库存、累计用量和倒序记录流水把内部数值和状态转化为当前场景可理解的信息。
- 厨房纸消耗使用颜色强化状态,但最终结论仍由文字和数字共同表达。
十九、关键路径的验证方法
19.1 数据与结构
厨房纸消耗在这一部分围绕关键路径的验证方法展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
库存不是静态数字,而是初始卷数与累计消耗的差值。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
19.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
19.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
19.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
二十、性能与可维护性分析
20.1 数据与结构
厨房纸消耗在这一部分围绕性能与可维护性分析展开。源码使用 rolls、used、history 保存页面需要持续观察的业务数据。
流水采用 unshift 插入首位,让最近一次消耗始终优先显示。 这项设计与“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”的操作顺序一致。
20.2 规则与原因
核心规则可以概括为:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
厨房纸消耗把关键判断集中在 consume 及相关成员逻辑中,build 只读取结果并声明控件。
20.3 交互与刷新
用户操作厨房纸消耗的输入控件后,回调写回 rolls、used、history 中对应字段,结果区域随状态刷新。
当前操作最终反馈为剩余库存、累计用量和倒序记录流水,每次交互都能在界面中找到对应结果。
20.4 边界与结论
这一部分需要遵守的边界是:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
厨房纸消耗在输入层和业务层共同执行“库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存”,让异常值无法扩散到结果文案。
| 性能与可维护性分析维度 | 当前实现 | 页面作用 |
|---|---|---|
| 状态 | rolls、used、history | 保存当前业务数据 |
| 规则 | remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水 | 生成剩余库存、累计用量和倒序记录流水 |
| 边界 | 库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存 | 防止无效状态 |
| 反馈 | 剩余库存、累计用量和倒序记录流水 | 形成可读结论 |
二十一、真实源码分段解读
21.1 源码片段 1
下面的 ArkTS 代码直接取自厨房纸消耗页面,用于对应状态、函数或组件分析。
@Entry
@Component
struct Index {
@State rolls: number = 12;
该片段参与按卷登记厨房纸消耗,并同步计算剩余库存和使用记录的实现,需要结合前后状态字段和事件回调理解。
21.2 源码片段 2
下面的 ArkTS 代码直接取自厨房纸消耗页面,用于对应状态、函数或组件分析。
@State used: number = 0;
@State history: string[] = [];
get remaining(): number { return Math.max(0, this.rolls - this.used); }
consume(): void {
该片段参与按卷登记厨房纸消耗,并同步计算剩余库存和使用记录的实现,需要结合前后状态字段和事件回调理解。
21.3 源码片段 3
下面的 ArkTS 代码直接取自厨房纸消耗页面,用于对应状态、函数或组件分析。
if (this.remaining > 0) {
this.used += 1;
this.history.unshift('已记录 1 卷,剩余 ' + this.remaining + ' 卷');
}
该片段参与按卷登记厨房纸消耗,并同步计算剩余库存和使用记录的实现,需要结合前后状态字段和事件回调理解。
21.4 源码片段 4
下面的 ArkTS 代码直接取自厨房纸消耗页面,用于对应状态、函数或组件分析。
}
build() {
Column() {
Row() { Text('厨房纸消耗').fontSize(26).fontWeight(FontWeight.Bold); Text('库存追踪').fontSize(14).fontColor('#667085').margin({ left: 10 }) }.width('100%')
该片段参与按卷登记厨房纸消耗,并同步计算剩余库存和使用记录的实现,需要结合前后状态字段和事件回调理解。
21.5 源码片段 5
下面的 ArkTS 代码直接取自厨房纸消耗页面,用于对应状态、函数或组件分析。
Text('按卷登记消耗,及时知道何时补货').fontSize(14).fontColor('#667085').margin({ top: 6, bottom: 18 }).width('100%')
Row() { Column() { Text('当前库存').fontSize(13).fontColor('#667085'); Text(this.remaining + ' 卷').fontSize(34).fontWeight(FontWeight.Bold).fontColor('#157A6E') }.alignItems(HorizontalAlign.Start); Column() { Text('已用').fontSize(13).fontColor('#667085'); Text(this.used + ' 卷').fontSize(30).fontWeight(FontWeight.Bold) }.alignItems(HorizontalAlign.Start).margin({ left: 42 }) }.width('100%').padding(18).backgroundColor('#E7F5F2').borderRadius(12)
Text('初始库存:' + this.rolls + ' 卷').fontSize(15).margin({ top: 18 }).width('100%')
Slider({ value: this.rolls, min: 1, max: 40, step: 1 }).onChange((v: number) => { this.rolls = Math.round(v); if (this.used > this.rolls) this.used = this.rolls; }).width('100%')
该片段参与按卷登记厨房纸消耗,并同步计算剩余库存和使用记录的实现,需要结合前后状态字段和事件回调理解。
21.6 源码片段 6
下面的 ArkTS 代码直接取自厨房纸消耗页面,用于对应状态、函数或组件分析。
Button('记录消耗一卷').width('100%').height(48).margin({ top: 14 }).onClick(() => this.consume())
Text('记录流水').fontSize(18).fontWeight(FontWeight.Bold).margin({ top: 24, bottom: 8 }).width('100%')
if (this.history.length === 0) { Text('还没有消耗记录').fontColor('#98A2B3').width('100%') }
ForEach(this.history, (item: string) => { Text(item).width('100%').padding(12).backgroundColor('#F6F8FA').margin({ bottom: 6 }).borderRadius(8) })
该片段参与按卷登记厨房纸消耗,并同步计算剩余库存和使用记录的实现,需要结合前后状态字段和事件回调理解。
21.7 源码片段 7
下面的 ArkTS 代码直接取自厨房纸消耗页面,用于对应状态、函数或组件分析。
Button('重置本次使用量').width('100%').height(42).margin({ top: 14 }).backgroundColor('#E8EEF2').fontColor('#344054').onClick(() => { this.used = 0; this.history = []; })
}.width('100%').height('100%').padding(22).backgroundColor('#FFFFFF')
}
}
该片段参与按卷登记厨房纸消耗,并同步计算剩余库存和使用记录的实现,需要结合前后状态字段和事件回调理解。
21.8 源码片段 8
下面的 ArkTS 代码直接取自厨房纸消耗页面,用于对应状态、函数或组件分析。
consume(): void {
该片段参与按卷登记厨房纸消耗,并同步计算剩余库存和使用记录的实现,需要结合前后状态字段和事件回调理解。
二十二、典型运行案例
22.1 默认场景
使用初始 12 卷、已用 0 卷、空流水启动页面,核对剩余库存、累计用量和倒序记录流水是否与初始字段一致。
验证时同时观察源状态、consume 相关逻辑和结果文案,不能只查看颜色变化。
如果计算属性、库存下限、unshift 流水与重置操作变化后仍能得到可复算的剩余库存、累计用量和倒序记录流水,就说明该项目的状态链路保持一致。
该场景需要连续执行两次,重点观察rolls、used、history是否出现旧值滞留。
22.2 最小边界
把可调参数移动到最小值,重点验证:库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存。
验证时同时观察源状态、consume 相关逻辑和结果文案,不能只查看颜色变化。
如果计算属性、库存下限、unshift 流水与重置操作变化后仍能得到可复算的剩余库存、累计用量和倒序记录流水,就说明该项目的状态链路保持一致。
该场景需要连续执行两次,重点观察rolls、used、history是否出现旧值滞留。
22.3 临界条件
围绕计算属性、库存下限、unshift 流水与重置操作测试阈值前、阈值本身和阈值后的输入。
验证时同时观察源状态、consume 相关逻辑和结果文案,不能只查看颜色变化。
如果计算属性、库存下限、unshift 流水与重置操作变化后仍能得到可复算的剩余库存、累计用量和倒序记录流水,就说明该项目的状态链路保持一致。
该场景需要连续执行两次,重点观察rolls、used、history是否出现旧值滞留。
22.4 连续操作
连续执行新增、计算、切换或记录操作,观察状态与结果是否同步。
验证时同时观察源状态、consume 相关逻辑和结果文案,不能只查看颜色变化。
如果计算属性、库存下限、unshift 流水与重置操作变化后仍能得到可复算的剩余库存、累计用量和倒序记录流水,就说明该项目的状态链路保持一致。
该场景需要连续执行两次,重点观察rolls、used、history是否出现旧值滞留。
| 验证维度 | 当前实现 | 页面作用 |
|---|---|---|
| 状态 | rolls、used、history | 保存当前业务数据 |
| 规则 | remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水 | 生成剩余库存、累计用量和倒序记录流水 |
| 边界 | 库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存 | 防止无效状态 |
| 反馈 | 剩余库存、累计用量和倒序记录流水 | 形成可读结论 |
二十三、实现中的技术取舍
23.1 本地状态
厨房纸消耗把本地状态作为当前单页实现的重要组成部分。
它服务于按卷登记厨房纸消耗,并同步计算剩余库存和使用记录,并与计算属性、库存下限、unshift 流水与重置操作共同形成可理解的操作流程。
厨房纸消耗当前只维护本地页面状态,计算属性、库存下限、unshift 流水与重置操作均可在一个组件内追踪,职责边界明确。
23.2 具名函数
厨房纸消耗把具名函数作为当前单页实现的重要组成部分。
它服务于按卷登记厨房纸消耗,并同步计算剩余库存和使用记录,并与计算属性、库存下限、unshift 流水与重置操作共同形成可理解的操作流程。
厨房纸消耗当前只维护本地页面状态,计算属性、库存下限、unshift 流水与重置操作均可在一个组件内追踪,职责边界明确。
23.3 声明式组件
厨房纸消耗把声明式组件作为当前单页实现的重要组成部分。
它服务于按卷登记厨房纸消耗,并同步计算剩余库存和使用记录,并与计算属性、库存下限、unshift 流水与重置操作共同形成可理解的操作流程。
厨房纸消耗当前只维护本地页面状态,计算属性、库存下限、unshift 流水与重置操作均可在一个组件内追踪,职责边界明确。
23.4 清晰边界
厨房纸消耗把清晰边界作为当前单页实现的重要组成部分。
它服务于按卷登记厨房纸消耗,并同步计算剩余库存和使用记录,并与计算属性、库存下限、unshift 流水与重置操作共同形成可理解的操作流程。
厨房纸消耗当前只维护本地页面状态,计算属性、库存下限、unshift 流水与重置操作均可在一个组件内追踪,职责边界明确。
二十四、总结
厨房纸消耗使用鸿蒙 ArkTS 完成了“按卷登记厨房纸消耗,并同步计算剩余库存和使用记录”这一完整功能闭环。
页面由 rolls、used、history 提供状态基础,关键业务围绕 consume 及相关表达式展开。
算法或状态更新的核心是:remaining 访问器使用 Math.max 保证剩余卷数不为负,consume 只在库存大于零时增加用量并插入流水。
边界方面,源码明确执行库存耗尽后不再增加 used;调整初始库存时若 used 超过 rolls,会把 used 收敛到新库存,避免极端输入产生无意义结果。
状态建模 决定数据是否清楚,业务函数 决定规则是否可复算,ArkUI 组件树 决定反馈是否及时。
库存不是静态数字,而是初始卷数与累计消耗的差值。 流水采用 unshift 插入首位,让最近一次消耗始终优先显示。 重置只清除本次使用量和流水,不修改用户设置的初始库存。
相关资源:
更多推荐



所有评论(0)