鸿蒙 ArkTS 实战:Habit Tracker 从习惯追踪器到个人成长工具完整解析
鸿蒙 ArkTS 实战:Habit Tracker 从习惯追踪器到个人成长工具完整解析
前言
Habit Tracker 是一个基于鸿蒙 ArkTS 的个人成长类单页应用,主题围绕 习惯名称、连续天数、热力图、提醒和每日打卡 展开。它把习惯、目标、复盘、情绪或专注这类抽象事项,落成可输入、可点击、可反馈的界面。
本文直接根据项目 Index.ets 源码展开,分析它如何设计状态字段、如何绑定输入组件、如何通过按钮触发业务逻辑,以及如何用指标和文案给用户即时反馈。
个人成长工具最怕空泛。真正有用的体验通常很小:记录一次、推进一点、看到一个清晰结果。

配图可作为文章首屏示意。正式发布时可以替换为项目真机截图,突出标题、输入区、指标区和反馈区。
一、项目定位与业务价值
1.1 应用定位
用户记录一个正在坚持的习惯,打卡后增加连续天数并扩展热力图字符串,还能设置提醒。
这个项目适合做成轻量工具,因为它的核心目标不是复杂功能,而是帮助用户把一个行动持续记录下来。
1.2 价值拆解
| 价值 | 说明 | 页面体现 |
|---|---|---|
| 快速记录 | 降低输入成本 | TextInput |
| 即时反馈 | 点击后状态马上变化 | Button |
| 可视化结果 | 用数字或卡片表达进展 | Streak / Heat map |
| 持续复盘 | 形成下一步计划 | 反馈文案 |
二、源码入口与页面结构
2.1 入口组件
项目采用 ArkTS 标准组件声明。
@Entry
@Component
struct Index {
build() {
// page content
}
}
2.2 页面组成
页面通常由以下区域组成:
- 标题区:展示
Habit Tracker。 - 输入区:填写目标、习惯、情绪、计划或任务。
- 指标区:展示
Streak / Heat map。 - 按钮区:执行打卡、复盘、保存、完成等动作。
- 反馈区:告诉用户本次操作结果。
三、状态模型抽象
3.1 模型定义
从源码可以抽象出 HabitState。
type HabitState = {
title: string;
value: string | number;
note: string;
updated: boolean;
};
3.2 实际状态代码
项目真实状态如下。
@State habit: string = 'Read 20 minutes';
@State streak: number = 12;
@State heat: string = '1110111';
@State reminder: string = '21:30 reminder';
3.3 状态职责
| 状态 | 类型 | 职责 |
|---|---|---|
habit |
状态字段 | 支撑习惯追踪器的输入、指标或反馈 |
streak |
状态字段 | 支撑习惯追踪器的输入、指标或反馈 |
heat |
状态字段 | 支撑习惯追踪器的输入、指标或反馈 |
reminder |
状态字段 | 支撑习惯追踪器的输入、指标或反馈 |
status |
状态字段 | 支撑习惯追踪器的输入、指标或反馈 |
这些状态字段全部服务于页面上的真实信息,不会让代码显得松散。
四、默认数据与首屏体验
4.1 默认内容
| 默认项 | 字段 | 含义 |
|---|---|---|
| Read 20 minutes | habit | 默认习惯 |
| 1110111 | heat | 默认热力图 |
4.2 默认值意义
默认值让用户进入页面后立刻知道工具用途。个人成长工具如果首屏空白,很容易让用户无从下手。
- 默认文本给出填写样例。
- 默认指标展示当前进展。
- 默认反馈解释下一步动作。
五、核心业务函数
5.1 主函数
项目核心业务逻辑如下。
checkIn(): void {
this.streak++;
this.heat = this.heat + '1';
this.status = this.habit + ' checked in. Streak ' + this.streak + '.';
}
5.2 操作流程
- 填写习惯名称
- 设置提醒
- 点击今日打卡
- 更新连续天数和热力图
这条流程形成了输入、行动、反馈的闭环,是页面最重要的用户路径。
六、辅助动作与展示
6.1 辅助代码
项目还包含辅助动作或布局展示。
Button('Set Reminder')
.width('100%')
.backgroundColor('#0369A1')
.onClick(() => this.status = 'Reminder set: ' + this.reminder)
6.2 辅助动作价值
| 类型 | 作用 | 示例 |
|---|---|---|
| 提醒 | 帮用户坚持 | 习惯提醒 |
| 卡片 | 让目标更可见 | 目标墙、日历 |
| 复盘 | 总结当前状态 | 周复盘、月回顾 |
| 调整 | 修改分数或时长 | 情绪、专注分钟 |
七、输入组件设计
7.1 TextInput 绑定
输入框直接把用户输入同步到状态。
TextInput({ text: this.habit, placeholder: 'Input value' })
.onChange((value: string) => this.habit = value)
7.2 输入内容特点
个人成长类工具的输入多为自然语言,例如目标、问题、清单、愿望、计划。它们不一定需要复杂校验,但需要即时保存和明确反馈。
八、指标展示策略
8.1 核心指标
页面核心指标是 Streak / Heat map。
Text('Streak / Heat map ' + value)
.fontSize(24)
.fontWeight(FontWeight.Bold)
8.2 指标类型
| 类型 | 示例 | 作用 |
|---|---|---|
| 连续天数 | streak | 强化坚持 |
| 百分比 | progress、completion | 表达进度 |
| 等级 | level | 体现成长 |
| 次数 | works、sessions、done | 记录积累 |
九、反馈文案设计
9.1 文案更新
反馈文案通过状态更新。
this.status = 'Action completed.';
this.summary = 'Review generated.';
9.2 文案原则
| 原则 | 说明 |
|---|---|
| 具体 | 包含当前目标或行动 |
| 简短 | 适合移动端阅读 |
| 正向 | 强化下一步行动 |
| 可复盘 | 能在之后读懂当时发生了什么 |
十、布局与视觉层次
10.1 容器结构
部分页面使用 Scroll + Column,部分页面使用左右分栏或顶部沉浸区。
Scroll() {
Column({ space: 16 }) {
Text('Habit Tracker')
// input
// metric
// action
// feedback
}
}
10.2 视觉组织
| 层级 | 内容 | 目的 |
|---|---|---|
| 标题 | 应用名称 | 明确场景 |
| 指标 | 进度或数量 | 建立动力 |
| 输入 | 当前目标或记录 | 承接内容 |
| 按钮 | 完成动作 | 推动变化 |
| 文案 | 本次结果 | 形成记忆 |
十一、运行验证流程
11.1 手工验证
可以按下面流程验证:
- 打开页面,确认标题为
Habit Tracker。 - 检查默认内容是否存在。
- 修改第一个输入框。
- 点击主按钮。
- 观察指标或反馈文案是否变化。
// 手工验证伪代码
const before = 'default growth state';
const action = 'tap primary button';
const after = 'metric and message updated';
console.info(before + ' -> ' + action + ' -> ' + after);
11.2 验证重点
| 验证点 | 预期 |
|---|---|
| 输入同步 | 状态跟随输入 |
| 按钮触发 | 业务函数执行 |
| 指标变化 | 数字或进度更新 |
| 文案变化 | 结果明确 |
| 多次点击 | 累计逻辑合理 |
十二、边界情况处理
12.1 数值边界
涉及分值、等级、完成度、分钟时,要控制上下限。
const safeLevel = Math.min(10, Math.max(1, level));
const safeMood = Math.max(1, Math.min(10, mood));
12.2 业务边界
| 场景 | 风险 | 处理方向 |
|---|---|---|
| 情绪分数越界 | 数据不可信 | 限制 1 到 10 |
| 目标进度超过 100 | 结果异常 | 使用 Math.min |
| 专注分钟过低 | 无法形成任务 | 设置最小 5 分钟 |
| 愿望时间线过长 | 文案拥挤 | 后续转列表 |
| 热力图字符串过长 | 可视化困难 | 后续转数组模型 |
十三、扩展为完整应用
13.1 业务扩展
后续可以加入多习惯列表、日历热力图、断签修复、提醒通知和月度统计。
13.2 工程抽象
可以抽象统一成长记录对象。
interface GrowthRecord {
title: string;
metric: number;
note: string;
createdAt: number;
}
function createGrowthRecord(title: string, metric: number, note: string): GrowthRecord {
return {
title,
metric,
note,
createdAt: Date.now()
};
}
十四、维护与优化
14.1 状态集中
当前项目体量适合把状态放在页面组件内。未来增加历史记录后,可以拆成数据层。
14.2 文案复用
反馈文案最好逐步统一,便于后续做导出、分享或多语言。
function buildFeedback(action: string, target: string): string {
return action + ': ' + target;
}
14.3 数据持久化
成长类工具非常依赖历史。后续可以优先保存时间戳、标题、指标和备注。
十五、工程复盘
15.1 当前实现亮点
- 状态字段贴合个人成长场景。
- 页面动作短,反馈及时。
- 指标清晰,能形成激励。
- 代码结构适合继续扩展。
- 适合作为 ArkTS 状态管理练习。
15.2 可复用经验
Habit Tracker 的实现思路可以复用到习惯、复盘、目标、愿望、专注、技能成长等多个场景。核心都是把“抽象目标”变成“可点击的具体行动”。
总结
Habit Tracker 用鸿蒙 ArkTS 实现了一个围绕 习惯追踪器 的个人成长工具。它通过 @State 保存用户输入和进度,通过按钮触发核心动作,再用指标和反馈文案把结果展示出来。
从工程角度看,这个项目已经完成了单页工具的核心闭环。后续继续加入历史记录、提醒通知、图表统计或本地持久化,都可以在当前结构上自然扩展。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
相关资源:
更多推荐



所有评论(0)