鸿蒙 ArkTS 实战:Year Goal Wall 从年度目标墙到个人成长工具完整解析

前言

Year Goal Wall 是一个基于鸿蒙 ArkTS 的个人成长类单页应用,主题围绕 年度目标、月度里程碑、进度百分比、愿景图和复盘卡片 展开。它把习惯、目标、复盘、情绪或专注这类抽象事项,落成可输入、可点击、可反馈的界面。

本文直接根据项目 Index.ets 源码展开,分析它如何设计状态字段、如何绑定输入组件、如何通过按钮触发业务逻辑,以及如何用指标和文案给用户即时反馈。

个人成长工具最怕空泛。真正有用的体验通常很小:记录一次、推进一点、看到一个清晰结果。

在这里插入图片描述

配图可作为文章首屏示意。正式发布时可以替换为项目真机截图,突出标题、输入区、指标区和反馈区。

一、项目定位与业务价值

1.1 应用定位

用户把年度目标拆成月度里程碑,页面用网格展示目标、里程碑、愿景图和复盘信息。

这个项目适合做成轻量工具,因为它的核心目标不是复杂功能,而是帮助用户把一个行动持续记录下来。

1.2 价值拆解

价值 说明 页面体现
快速记录 降低输入成本 TextInput
即时反馈 点击后状态马上变化 Button
可视化结果 用数字或卡片表达进展 Progress percent
持续复盘 形成下一步计划 反馈文案

二、源码入口与页面结构

2.1 入口组件

项目采用 ArkTS 标准组件声明。

@Entry
@Component
struct Index {
  build() {
    // page content
  }
}

2.2 页面组成

页面通常由以下区域组成:

  • 标题区:展示 Year Goal Wall
  • 输入区:填写目标、习惯、情绪、计划或任务。
  • 指标区:展示 Progress percent
  • 按钮区:执行打卡、复盘、保存、完成等动作。
  • 反馈区:告诉用户本次操作结果。

三、状态模型抽象

3.1 模型定义

从源码可以抽象出 YearGoalState

type YearGoalState = {
  title: string;
  value: string | number;
  note: string;
  updated: boolean;
};

3.2 实际状态代码

项目真实状态如下。

@State goal: string = 'Publish 12 essays';
@State milestone: string = 'July: finish outline';
@State progress: number = 42;
@State vision: string = 'vision_board_cover.jpg';

3.3 状态职责

状态 类型 职责
goal 状态字段 支撑年度目标墙的输入、指标或反馈
milestone 状态字段 支撑年度目标墙的输入、指标或反馈
progress 状态字段 支撑年度目标墙的输入、指标或反馈
vision 状态字段 支撑年度目标墙的输入、指标或反馈
review 状态字段 支撑年度目标墙的输入、指标或反馈

这些状态字段全部服务于页面上的真实信息,不会让代码显得松散。

四、默认数据与首屏体验

4.1 默认内容

默认项 字段 含义
Publish 12 essays goal 默认年度目标
July: finish outline milestone 默认里程碑

4.2 默认值意义

默认值让用户进入页面后立刻知道工具用途。个人成长工具如果首屏空白,很容易让用户无从下手。

  1. 默认文本给出填写样例。
  2. 默认指标展示当前进展。
  3. 默认反馈解释下一步动作。

五、核心业务函数

5.1 主函数

项目核心业务逻辑如下。

advance(): void {
  this.progress = Math.min(100, this.progress + 8);
  this.review = 'Reviewed milestone: ' + this.milestone + '.';
}

5.2 操作流程

  1. 填写年度目标
  2. 填写月度里程碑
  3. 查看目标墙卡片
  4. 复盘后推进进度

这条流程形成了输入、行动、反馈的闭环,是页面最重要的用户路径。

六、辅助动作与展示

6.1 辅助代码

项目还包含辅助动作或布局展示。

Grid() {
  GridItem() { Text('Goal\n' + this.goal) }
  GridItem() { Text('Milestone\n' + this.milestone) }
  GridItem() { Text('Vision\n' + this.vision) }
  GridItem() { Text('Review\n' + this.review) }
}

6.2 辅助动作价值

类型 作用 示例
提醒 帮用户坚持 习惯提醒
卡片 让目标更可见 目标墙、日历
复盘 总结当前状态 周复盘、月回顾
调整 修改分数或时长 情绪、专注分钟

七、输入组件设计

7.1 TextInput 绑定

输入框直接把用户输入同步到状态。

TextInput({ text: this.goal, placeholder: 'Input value' })
  .onChange((value: string) => this.goal = value)

7.2 输入内容特点

个人成长类工具的输入多为自然语言,例如目标、问题、清单、愿望、计划。它们不一定需要复杂校验,但需要即时保存和明确反馈。

八、指标展示策略

8.1 核心指标

页面核心指标是 Progress percent

Text('Progress percent ' + 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('Year Goal Wall')
    // input
    // metric
    // action
    // feedback
  }
}

10.2 视觉组织

层级 内容 目的
标题 应用名称 明确场景
指标 进度或数量 建立动力
输入 当前目标或记录 承接内容
按钮 完成动作 推动变化
文案 本次结果 形成记忆

十一、运行验证流程

11.1 手工验证

可以按下面流程验证:

  1. 打开页面,确认标题为 Year Goal Wall
  2. 检查默认内容是否存在。
  3. 修改第一个输入框。
  4. 点击主按钮。
  5. 观察指标或反馈文案是否变化。
// 手工验证伪代码
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 可复用经验

Year Goal Wall 的实现思路可以复用到习惯、复盘、目标、愿望、专注、技能成长等多个场景。核心都是把“抽象目标”变成“可点击的具体行动”。

总结

Year Goal Wall 用鸿蒙 ArkTS 实现了一个围绕 年度目标墙 的个人成长工具。它通过 @State 保存用户输入和进度,通过按钮触发核心动作,再用指标和反馈文案把结果展示出来。

从工程角度看,这个项目已经完成了单页工具的核心闭环。后续继续加入历史记录、提醒通知、图表统计或本地持久化,都可以在当前结构上自然扩展。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。

补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。


相关资源:

Logo

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

更多推荐