鸿蒙 ArkTS 实战:Tea Tasting Book 从茶饮品鉴本到厨房生活工具完整解析
鸿蒙 ArkTS 实战:Tea Tasting Book 从茶饮品鉴本到厨房生活工具完整解析
前言
Tea Tasting Book 是一个基于鸿蒙 ArkTS 的厨房生活工具,主题围绕 茶叶档案、冲泡参数、口感记录、库存克数和低库存提醒 展开。它把家庭饮食里的一个具体场景拆成输入、计算、保存、提醒和反馈几个环节,适合做轻量级移动端原型。
本文直接依据项目 Index.ets 源码写作,重点分析状态字段如何绑定页面,按钮动作如何修改业务状态,以及结果文案如何帮助用户完成下一步操作。
厨房工具的体验重点是快:打开页面、改一两个字段、点一个按钮,就应该看到明确结果。

这张图可作为文章配图。实际发布时可以替换为应用运行截图,让读者更直观看到输入区、指标区和反馈区。
一、项目定位与业务场景
1.1 应用定位
用户记录茶叶批次、冲泡参数和口感笔记,饮用后减少库存,低于阈值时提醒补货。
这个项目的技术重点不是复杂算法,而是把一个生活场景拆成清楚的状态和动作。这样的代码非常适合学习 ArkTS 单页应用的状态管理。
1.2 使用价值
| 价值 | 说明 | 页面体现 |
|---|---|---|
| 快速记录 | 减少纸笔记录成本 | TextInput |
| 即时计算 | 自动得出关键结果 | Stock grams |
| 行为沉淀 | 保存次数、备注或状态 | @State |
| 决策辅助 | 用反馈文案提示下一步 | 状态文本 |
二、源码入口与页面结构
2.1 入口组件
项目使用标准 ArkTS 页面结构。
@Entry
@Component
struct Index {
build() {
Scroll() {
Column({ space: 16 }) {
Text('Tea Tasting Book')
}
}
}
}
2.2 页面结构
页面可以拆成以下区域:
- 标题区:展示
Tea Tasting Book。 - 输入区:填写菜谱、库存、参数、评分或备注。
- 指标区:展示
Stock grams。 - 动作区:执行保存、推荐、计算或记录。
- 反馈区:显示计划、提醒、结果或警告。
三、状态模型抽象
3.1 业务模型
从源码可以抽象出 TeaTastingState。
type TeaTastingState = {
title: string;
metric: string | number;
note: string;
status: string;
};
3.2 实际状态代码
项目中的真实状态如下。
@State tea: string = 'Longjing spring batch';
@State brewParam: string = '85C, 3g, 150ml';
@State taste: string = 'Chestnut aroma, sweet finish';
@State stock: string = '45';
3.3 状态职责
| 状态 | 类型 | 职责 |
|---|---|---|
tea |
状态字段 | 支撑 茶饮品鉴本 的输入、计算或反馈 |
brewParam |
状态字段 | 支撑 茶饮品鉴本 的输入、计算或反馈 |
taste |
状态字段 | 支撑 茶饮品鉴本 的输入、计算或反馈 |
stock |
状态字段 | 支撑 茶饮品鉴本 的输入、计算或反馈 |
reminder |
状态字段 | 支撑 茶饮品鉴本 的输入、计算或反馈 |
这些状态字段都能直接在页面上找到对应位置,说明项目没有堆叠无用状态。
四、默认数据与首屏体验
4.1 默认内容
| 默认项 | 字段 | 含义 |
|---|---|---|
| Longjing spring batch | tea | 默认茶叶 |
| 85C, 3g, 150ml | brewParam | 默认冲泡参数 |
4.2 默认内容的作用
默认内容让用户第一次打开页面就能理解用途。比如 茶饮品鉴本 不是空白表单,而是带着一个可直接编辑的示例。
- 示例文本降低理解成本。
- 默认指标让页面更完整。
- 按钮可以马上测试。
五、核心计算或保存逻辑
5.1 主函数
项目最核心的业务逻辑如下。
saveTaste(): void {
this.reminder = this.tea + ' saved with taste: ' + this.taste + '.';
}
5.2 流程说明
- 填写茶叶档案
- 记录冲泡参数
- 保存口感笔记
- 饮用后扣减库存
这条流程覆盖了用户从输入到结果的主要路径,是整篇应用逻辑的主线。
六、辅助动作设计
6.1 辅助函数
项目还提供了辅助动作,用来补充保存、复用、提醒或二次处理。
drinkTea(): void {
let left = Math.max(0, Number(this.stock) - 3);
this.stock = left.toString();
this.reminder = left < 10 ? 'Low stock reminder for ' + this.tea + '.' : 'Stock updated after tasting.';
}
6.2 为什么需要辅助动作
| 动作类型 | 作用 | 示例场景 |
|---|---|---|
| 保存 | 固化当前记录 | 菜谱、笔记、口味 |
| 复用 | 复用已有参数 | 咖啡冲煮、早餐模板 |
| 提醒 | 给出风险或计划 | 库存、外卖、剩菜 |
| 计算 | 生成费用、克重、库存 | 火锅、烘焙、茶饮 |
七、输入组件设计
7.1 TextInput 绑定
输入框使用 onChange 同步到状态字段。
TextInput({ text: this.tea, placeholder: 'Input value' })
.onChange((value: string) => this.tea = value)
7.2 数字输入
涉及克重、比例、库存、费用、人数、评分等数据时,源码会使用数字输入或 Number() 转换。
const value = Number(inputText);
if (Number.isNaN(value)) {
// keep previous state or show message
}
数字处理越稳,厨房工具越可信。
八、指标展示策略
8.1 核心指标
项目关注的核心指标是 Stock grams。
Text('Stock grams ' + value)
.fontSize(24)
.fontWeight(FontWeight.Bold)
8.2 指标分类
| 指标类型 | 示例 | 作用 |
|---|---|---|
| 数量 | 库存、照片、收藏、打卡 | 表示积累 |
| 费用 | 人均成本、总收入 | 辅助决策 |
| 时间 | 计时、准备分钟 | 管理流程 |
| 评分 | 店铺、风味、失败次数 | 形成复盘 |
九、反馈文案设计
9.1 文案职责
反馈文案让用户知道操作结果。
this.status = 'Action completed.';
this.reminder = 'Next step is ready.';
9.2 好文案标准
| 标准 | 说明 | 例子 |
|---|---|---|
| 具体 | 包含当前对象 | 保存了某个菜谱 |
| 可执行 | 指向下一步 | 加入购物清单 |
| 可复盘 | 保留问题信息 | 外卖配送问题 |
| 不打扰 | 简短明确 | 库存已更新 |
十、布局与视觉结构
10.1 Scroll + Column
页面使用 Scroll 和 Column 组织内容,适合表单型工具。
Scroll() {
Column({ space: 16 }) {
Text('Tea Tasting Book')
// inputs
// metric
// buttons
// feedback
}.padding(20).width('100%')
}
10.2 视觉层级
| 层级 | 内容 | 目的 |
|---|---|---|
| 标题 | 应用名称 | 快速识别 |
| 输入 | 用户数据 | 修改业务状态 |
| 指标 | 关键结果 | 给出判断依据 |
| 按钮 | 业务动作 | 推动流程 |
| 文案 | 反馈说明 | 指导下一步 |
十一、运行验证路径
11.1 手工验证
可以按下面流程验证页面:
- 打开页面,确认标题为
Tea Tasting Book。 - 检查默认输入值是否显示。
- 修改第一个输入框。
- 点击主按钮。
- 观察指标或反馈文案是否变化。
// 手工验证伪代码
const before = 'default kitchen state';
const action = 'tap main button';
const after = 'metric or message updated';
console.info(before + ' -> ' + action + ' -> ' + after);
11.2 验证重点
| 验证点 | 预期 |
|---|---|
| 输入同步 | 状态随输入变化 |
| 主按钮 | 执行业务函数 |
| 指标 | 根据状态重新计算 |
| 文案 | 说明操作结果 |
| 连续点击 | 不破坏页面状态 |
十二、边界情况处理
12.1 数值边界
厨房工具常见数字包括人数、克重、库存、费用、时间和评分。
const safe = Math.max(0, Number(text));
12.2 业务边界
| 场景 | 风险 | 处理方式 |
|---|---|---|
| 人数为 0 | 除法异常 | 使用 Math.max(1, value) |
| 库存不足 | 负库存 | 使用下限保护 |
| 存放过久 | 食安风险 | 给出提醒 |
| 评分太低 | 误复购 | 阻止或提醒 |
| 比例为空 | 换算异常 | 保留结果提示 |
十三、扩展为完整厨房应用
13.1 业务扩展
后续可以加入茶样分类、冲泡曲线、品鉴评分、茶仓库存和补货提醒。
13.2 工程抽象
可以抽象统一厨房记录模型。
interface KitchenRecord {
name: string;
value: number;
unit: string;
note: string;
createdAt: number;
}
function createKitchenRecord(name: string, value: number, unit: string, note: string): KitchenRecord {
return {
name,
value,
unit,
note,
createdAt: Date.now()
};
}
这个模型可以支撑历史记录、库存统计、菜谱收藏和提醒系统。
十四、维护与优化建议
14.1 状态拆分
当前项目状态数量不多,适合放在页面组件中。后续如果加入历史列表或多页面,可以再拆成数据服务。
14.2 函数命名
函数名要贴合动作,例如 saveNote、checkStock、recommend、perPerson。这样的命名能让读者快速理解逻辑。
function formatMessage(prefix: string, value: string): string {
return prefix + ': ' + value;
}
14.3 结果复用
如果某个计算结果会在多个区域展示,建议封装函数,而不是复制计算表达式。
十五、工程复盘
15.1 当前实现亮点
- 页面结构直观。
- 状态字段贴合厨房业务。
- 输入和反馈路径短。
- 计算逻辑集中,易于验证。
- 后续扩展方向清晰。
15.2 可复用经验
Tea Tasting Book 的实现方式适合迁移到各种生活工具:菜谱、库存、清单、饮品笔记、家庭记忆和消费复盘。核心方法都是把生活里的动作抽象成状态更新。
总结
Tea Tasting Book 用鸿蒙 ArkTS 构建了一个围绕 茶饮品鉴本 的厨房生活工具。它通过 @State 保存用户输入和结果,用 TextInput 收集数据,用按钮触发业务函数,再用指标和文案给出即时反馈。
从工程角度看,这个项目已经完成了单页工具最重要的闭环。后续继续接入历史记录、模板库、图片、通知或本地存储,都可以在当前结构上平滑扩展。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
相关资源:
更多推荐


所有评论(0)