鸿蒙 ArkTS 实战:Leftover Recipe Remix 从剩菜食谱改造到厨房生活工具完整解析
鸿蒙 ArkTS 实战:Leftover Recipe Remix 从剩菜食谱改造到厨房生活工具完整解析
前言
Leftover Recipe Remix 是一个基于鸿蒙 ArkTS 的厨房生活工具,主题围绕 剩余食材、存放时长、推荐食谱、收藏数量和新鲜度提醒 展开。它把家庭饮食里的一个具体场景拆成输入、计算、保存、提醒和反馈几个环节,适合做轻量级移动端原型。
本文直接依据项目 Index.ets 源码写作,重点分析状态字段如何绑定页面,按钮动作如何修改业务状态,以及结果文案如何帮助用户完成下一步操作。
厨房工具的体验重点是快:打开页面、改一两个字段、点一个按钮,就应该看到明确结果。

这张图可作为文章配图。实际发布时可以替换为应用运行截图,让读者更直观看到输入区、指标区和反馈区。
一、项目定位与业务场景
1.1 应用定位
用户输入剩余食材和存放小时数,应用根据时长推荐安全的改造食谱,并支持保存做法。
这个项目的技术重点不是复杂算法,而是把一个生活场景拆成清楚的状态和动作。这样的代码非常适合学习 ArkTS 单页应用的状态管理。
1.2 使用价值
| 价值 | 说明 | 页面体现 |
|---|---|---|
| 快速记录 | 减少纸笔记录成本 | TextInput |
| 即时计算 | 自动得出关键结果 | Favorites |
| 行为沉淀 | 保存次数、备注或状态 | @State |
| 决策辅助 | 用反馈文案提示下一步 | 状态文本 |
二、源码入口与页面结构
2.1 入口组件
项目使用标准 ArkTS 页面结构。
@Entry
@Component
struct Index {
build() {
Scroll() {
Column({ space: 16 }) {
Text('Leftover Recipe Remix')
}
}
}
}
2.2 页面结构
页面可以拆成以下区域:
- 标题区:展示
Leftover Recipe Remix。 - 输入区:填写菜谱、库存、参数、评分或备注。
- 指标区:展示
Favorites。 - 动作区:执行保存、推荐、计算或记录。
- 反馈区:显示计划、提醒、结果或警告。
三、状态模型抽象
3.1 业务模型
从源码可以抽象出 LeftoverRemixState。
type LeftoverRemixState = {
title: string;
metric: string | number;
note: string;
status: string;
};
3.2 实际状态代码
项目中的真实状态如下。
@State leftover: string = 'Rice, egg, carrot';
@State shelfHours: string = '18';
@State favoriteCount: number = 4;
@State recipe: string = 'Fried rice with soft egg';
3.3 状态职责
| 状态 | 类型 | 职责 |
|---|---|---|
leftover |
状态字段 | 支撑 剩菜食谱改造 的输入、计算或反馈 |
shelfHours |
状态字段 | 支撑 剩菜食谱改造 的输入、计算或反馈 |
favoriteCount |
状态字段 | 支撑 剩菜食谱改造 的输入、计算或反馈 |
recipe |
状态字段 | 支撑 剩菜食谱改造 的输入、计算或反馈 |
reminder |
状态字段 | 支撑 剩菜食谱改造 的输入、计算或反馈 |
这些状态字段都能直接在页面上找到对应位置,说明项目没有堆叠无用状态。
四、默认数据与首屏体验
4.1 默认内容
| 默认项 | 字段 | 含义 |
|---|---|---|
| Rice, egg, carrot | leftover | 默认剩余食材 |
| 18 | shelfHours | 默认存放时长 |
4.2 默认内容的作用
默认内容让用户第一次打开页面就能理解用途。比如 剩菜食谱改造 不是空白表单,而是带着一个可直接编辑的示例。
- 示例文本降低理解成本。
- 默认指标让页面更完整。
- 按钮可以马上测试。
五、核心计算或保存逻辑
5.1 主函数
项目最核心的业务逻辑如下。
recommend(): void {
let hours = Number(this.shelfHours);
this.recipe = hours > 24 ? 'Use only after smell check: soup or discard risky food' : 'Quick remix: ' + this.leftover + ' stir fry';
this.reminder = hours > 24 ? 'Freshness alert: eat carefully.' : 'Recipe recommended from remaining ingredients.';
}
5.2 流程说明
- 输入剩余食材
- 输入存放时长
- 推荐改造食谱
- 保存做法并更新收藏
这条流程覆盖了用户从输入到结果的主要路径,是整篇应用逻辑的主线。
六、辅助动作设计
6.1 辅助函数
项目还提供了辅助动作,用来补充保存、复用、提醒或二次处理。
saveRecipe(): void {
this.favoriteCount++;
this.reminder = 'Saved method: ' + this.recipe + '.';
}
6.2 为什么需要辅助动作
| 动作类型 | 作用 | 示例场景 |
|---|---|---|
| 保存 | 固化当前记录 | 菜谱、笔记、口味 |
| 复用 | 复用已有参数 | 咖啡冲煮、早餐模板 |
| 提醒 | 给出风险或计划 | 库存、外卖、剩菜 |
| 计算 | 生成费用、克重、库存 | 火锅、烘焙、茶饮 |
七、输入组件设计
7.1 TextInput 绑定
输入框使用 onChange 同步到状态字段。
TextInput({ text: this.leftover, placeholder: 'Input value' })
.onChange((value: string) => this.leftover = value)
7.2 数字输入
涉及克重、比例、库存、费用、人数、评分等数据时,源码会使用数字输入或 Number() 转换。
const value = Number(inputText);
if (Number.isNaN(value)) {
// keep previous state or show message
}
数字处理越稳,厨房工具越可信。
八、指标展示策略
8.1 核心指标
项目关注的核心指标是 Favorites。
Text('Favorites ' + 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('Leftover Recipe Remix')
// inputs
// metric
// buttons
// feedback
}.padding(20).width('100%')
}
10.2 视觉层级
| 层级 | 内容 | 目的 |
|---|---|---|
| 标题 | 应用名称 | 快速识别 |
| 输入 | 用户数据 | 修改业务状态 |
| 指标 | 关键结果 | 给出判断依据 |
| 按钮 | 业务动作 | 推动流程 |
| 文案 | 反馈说明 | 指导下一步 |
十一、运行验证路径
11.1 手工验证
可以按下面流程验证页面:
- 打开页面,确认标题为
Leftover Recipe Remix。 - 检查默认输入值是否显示。
- 修改第一个输入框。
- 点击主按钮。
- 观察指标或反馈文案是否变化。
// 手工验证伪代码
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 可复用经验
Leftover Recipe Remix 的实现方式适合迁移到各种生活工具:菜谱、库存、清单、饮品笔记、家庭记忆和消费复盘。核心方法都是把生活里的动作抽象成状态更新。
总结
Leftover Recipe Remix 用鸿蒙 ArkTS 构建了一个围绕 剩菜食谱改造 的厨房生活工具。它通过 @State 保存用户输入和结果,用 TextInput 收集数据,用按钮触发业务函数,再用指标和文案给出即时反馈。
从工程角度看,这个项目已经完成了单页工具最重要的闭环。后续继续接入历史记录、模板库、图片、通知或本地存储,都可以在当前结构上平滑扩展。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
相关资源:
更多推荐




所有评论(0)