鸿蒙 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 默认内容的作用

默认内容让用户第一次打开页面就能理解用途。比如 茶饮品鉴本 不是空白表单,而是带着一个可直接编辑的示例。

  1. 示例文本降低理解成本。
  2. 默认指标让页面更完整。
  3. 按钮可以马上测试。

五、核心计算或保存逻辑

5.1 主函数

项目最核心的业务逻辑如下。

saveTaste(): void {
  this.reminder = this.tea + ' saved with taste: ' + this.taste + '.';
}

5.2 流程说明

  1. 填写茶叶档案
  2. 记录冲泡参数
  3. 保存口感笔记
  4. 饮用后扣减库存

这条流程覆盖了用户从输入到结果的主要路径,是整篇应用逻辑的主线。

六、辅助动作设计

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

页面使用 ScrollColumn 组织内容,适合表单型工具。

Scroll() {
  Column({ space: 16 }) {
    Text('Tea Tasting Book')
    // inputs
    // metric
    // buttons
    // feedback
  }.padding(20).width('100%')
}

10.2 视觉层级

层级 内容 目的
标题 应用名称 快速识别
输入 用户数据 修改业务状态
指标 关键结果 给出判断依据
按钮 业务动作 推动流程
文案 反馈说明 指导下一步

十一、运行验证路径

11.1 手工验证

可以按下面流程验证页面:

  1. 打开页面,确认标题为 Tea Tasting Book
  2. 检查默认输入值是否显示。
  3. 修改第一个输入框。
  4. 点击主按钮。
  5. 观察指标或反馈文案是否变化。
// 手工验证伪代码
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 函数命名

函数名要贴合动作,例如 saveNotecheckStockrecommendperPerson。这样的命名能让读者快速理解逻辑。

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 收集数据,用按钮触发业务函数,再用指标和文案给出即时反馈。

从工程角度看,这个项目已经完成了单页工具最重要的闭环。后续继续接入历史记录、模板库、图片、通知或本地存储,都可以在当前结构上平滑扩展。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。

补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。


相关资源:

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐