鸿蒙 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@Componentstruct Index{build(){Scroll(){Column({space:16}){Text('Leftover Recipe Remix')}}}}2.2 页面结构
页面可以拆成以下区域:
- 标题区:展示
Leftover Recipe Remix。 - 输入区:填写菜谱、库存、参数、评分或备注。
- 指标区:展示
Favorites。 - 动作区:执行保存、推荐、计算或记录。
- 反馈区:显示计划、提醒、结果或警告。
三、状态模型抽象
3.1 业务模型
从源码可以抽象出LeftoverRemixState。
typeLeftoverRemixState={title:string;metric:string|number;note:string;status:string;};3.2 实际状态代码
项目中的真实状态如下。
@Stateleftover:string='Rice, egg, carrot';@StateshelfHours:string='18';@StatefavoriteCount:number=4;@Staterecipe: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{lethours=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()转换。
constvalue=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。 - 检查默认输入值是否显示。
- 修改第一个输入框。
- 点击主按钮。
- 观察指标或反馈文案是否变化。
// 手工验证伪代码constbefore='default kitchen state';constaction='tap main button';constafter='metric or message updated';console.info(before+' -> '+action+' -> '+after);11.2 验证重点
| 验证点 | 预期 |
|---|---|
| 输入同步 | 状态随输入变化 |
| 主按钮 | 执行业务函数 |
| 指标 | 根据状态重新计算 |
| 文案 | 说明操作结果 |
| 连续点击 | 不破坏页面状态 |
十二、边界情况处理
12.1 数值边界
厨房工具常见数字包括人数、克重、库存、费用、时间和评分。
constsafe=Math.max(0,Number(text));12.2 业务边界
| 场景 | 风险 | 处理方式 |
|---|---|---|
| 人数为 0 | 除法异常 | 使用Math.max(1, value) |
| 库存不足 | 负库存 | 使用下限保护 |
| 存放过久 | 食安风险 | 给出提醒 |
| 评分太低 | 误复购 | 阻止或提醒 |
| 比例为空 | 换算异常 | 保留结果提示 |
十三、扩展为完整厨房应用
13.1 业务扩展
后续可以加入食材保质期库、风险提示、冰箱库存联动、菜谱推荐算法和收藏夹。
13.2 工程抽象
可以抽象统一厨房记录模型。
interfaceKitchenRecord{name:string;value:number;unit:string;note:string;createdAt:number;}functioncreateKitchenRecord(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。这样的命名能让读者快速理解逻辑。
functionformatMessage(prefix:string,value:string):string{returnprefix+': '+value;}14.3 结果复用
如果某个计算结果会在多个区域展示,建议封装函数,而不是复制计算表达式。
十五、工程复盘
15.1 当前实现亮点
- 页面结构直观。
- 状态字段贴合厨房业务。
- 输入和反馈路径短。
- 计算逻辑集中,易于验证。
- 后续扩展方向清晰。
15.2 可复用经验
Leftover Recipe Remix的实现方式适合迁移到各种生活工具:菜谱、库存、清单、饮品笔记、家庭记忆和消费复盘。核心方法都是把生活里的动作抽象成状态更新。
总结
Leftover Recipe Remix用鸿蒙 ArkTS 构建了一个围绕剩菜食谱改造的厨房生活工具。它通过@State保存用户输入和结果,用TextInput收集数据,用按钮触发业务函数,再用指标和文案给出即时反馈。
从工程角度看,这个项目已经完成了单页工具最重要的闭环。后续继续接入历史记录、模板库、图片、通知或本地存储,都可以在当前结构上平滑扩展。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
补充说明:当前页面把厨房场景拆成了输入、计算和反馈三段,阅读成本很低。
补充说明:指标展示能帮助用户快速判断这次操作是否值得保存或复用。
补充说明:反馈文案负责承接下一步动作,避免用户点击后没有确认感。
补充说明:后续接入持久化时,可以优先保存输入值、指标、备注和创建时间。
相关资源:
- HarmonyOS 开发者官网
- ArkTS 语言基础
- ArkUI 组件开发