鸿蒙 ArkTS 实战:Project Milestone Timeline 从状态建模到办公交互完整解析

前言

项目里程碑时间线 是一个面向 团队协作与项目管理 的鸿蒙 ArkTS 应用。记录项目里程碑、平均进度和推进动作,适合项目节点管理。 本文基于 entry/src/main/ets/pages/Index.ets 的真实代码结构展开,重点分析 interface 数据模型@State 状态业务方法Builder 组件 和页面布局,形成一篇可直接发布的技术解析。

在这里插入图片描述

图示说明:页面以办公场景为核心,通过卡片、输入框、筛选按钮、统计信息和状态动作完成闭环。

一、应用定位与业务闭环

1.1 场景定位

Project Milestone Timeline 的目标不是复杂后台系统,而是把高频办公动作压缩到一个单页工具中。用户打开页面后,可以查看当前状态、录入新记录、切换筛选条件,并通过按钮推进状态。

业务环节 页面表现 技术实现
记录数据 列表卡片 ForEach 渲染
新增内容 输入框与按钮 TextInput + onClick
状态管理 标签、开关、文案 @State 驱动
统计反馈 数量、进度、提醒 private 方法派生
视觉组织 卡片化结构 @Builder 复用

1.2 代码阅读路径

  1. 先看接口,确认业务对象包含哪些字段。
  2. 再看状态,确认哪些数据会触发页面刷新。
  3. 接着看方法,确认新增、筛选、推进、导出等逻辑。
  4. 最后看 Builder,确认重复 UI 如何复用。

核心判断:轻量办公工具的工程质量,取决于状态链路是否清晰,而不是页面控件数量。

二、工程结构与入口文件

2.1 核心目录

项目为鸿蒙 ArkTS 工程,核心页面位于 entry/src/main/ets/pages/Index.ets。

Project Milestone Timeline
├── AppScope
├── entry
│   └── src
│       └── main
│           ├── ets
│           │   └── pages
│           │       └── Index.ets
│           └── module.json5
├── hvigor
├── build-profile.json5
└── oh-package.json5

2.2 页面入口

ArkTS 使用 @Entry 和 @Component 定义页面入口。

@Entry
@Component
struct Index {
  build() {
    Scroll() {
      Column() {
        // 页面主体
      }
    }
  }
}

2.3 技术要素

技术点 作用 本项目价值
ArkTS 类型、状态、方法 组织业务逻辑
ArkUI 声明式 UI 构建页面结构
@State 响应式状态 驱动刷新
@Builder UI 片段复用 降低重复代码
Hvigor 构建系统 生成应用包

三、数据模型设计

3.1 接口清单

源码中的接口包括:$iface。这些接口是列表渲染、状态推进和统计计算的基础。

interface Milestone {
  id: number;
  title?: string;
  name?: string;
  status?: string;
  done?: boolean;
}

实际源码会根据业务场景使用更明确字段,例如议程、记录、设备、印章、用品、里程碑、成员、链接、账号或竞品等。

3.2 字段角色

字段类型 常见字段 作用
标识字段 id 列表 key 与操作目标
标题字段 itle、
ame 卡片主信息
分类字段 ype、 ag、status 筛选与颜色映射
数值字段 count、progress、seconds 统计与进度
状态字段 done、confirmed、ctive 控制按钮和文案

3.3 建模收益

使用接口可以把页面数据结构固定下来,避免 UI 渲染时字段来源不明确。对于后续接入本地存储或接口数据,也更容易做序列化转换。

四、@State 状态拆解

4.1 状态清单

项目中的状态包括:$state。

@State records: Milestone[] = [];
@State draftText: string = '';
@State filter: string = '全部';
@State message: string = '';

不同项目的命名不同,但模式一致:列表保存业务对象,草稿字段接收输入,筛选字段控制视图,消息字段反馈操作结果。

4.2 状态分类

状态类别 示例 说明
列表状态 $primaryState 保存主业务数据
输入状态 draft、draftTopic、draftTitle 录入新数据
筛选状态 ilter、 ag、selectedType 控制可见列表
反馈状态 message、exportText、
eminderText 输出操作结果
运行状态
emainingSeconds、presentationMode 控制当前运行表现

4.3 状态更新策略

列表更新建议使用新数组替换,保证响应式刷新稳定。

private updateRecord(id: number): void {
  this.records = this.records.map((item: Milestone) => {
    if (item.id !== id) {
      return item;
    }
    return {
      ...item,
      done: !item.done
    };
  });
}

五、核心方法解析

5.1 方法清单

源码中的核心方法包括:$method。

方法类型 典型方法 作用
查询方法 isible、 iltered 根据筛选状态返回列表
新增方法 ddItem、ddRecord 创建新记录
推进方法 dvance、 oggle、confirm 改变业务状态
统计方法 vg、count、 otal 顶部指标展示
反馈方法 export、
otify、saveShare 输出操作结果

5.2 新增逻辑

新增方法通常从输入状态读取文本,做空值判断,然后追加到列表。

private addRecord(): void {
  const title = this.draftText.trim();
  if (title.length === 0) {
    return;
  }
  const record: Milestone = {
    id: Date.now(),
    title: title,
    done: false
  };
  this.records = [record, ...this.records];
  this.draftText = '';
}

5.3 筛选逻辑

筛选方法把分类状态和列表数据组合起来。

private visibleRecords(): Milestone[] {
  return this.records.filter((item: Milestone) => {
    return this.filter === '全部' || item.status === this.filter;
  });
}

5.4 状态推进

状态推进不要直接修改数组中的旧对象,使用 map 生成新对象更稳。

private next(id: number): void {
  this.records = this.records.map((item: Milestone) => {
    return item.id === id ? { ...item, status: '已处理' } : item;
  });
}

六、Builder 组件复用

6.1 Builder 清单

源码中的 Builder 组件包括:$builder。

@Builder
private card(item: Milestone) {
  Column() {
    Text(item.title ?? item.name ?? '未命名')
      .fontSize(16)
      .fontWeight(FontWeight.Bold)
  }
  .padding(14)
  .backgroundColor('#FFFFFF')
  .borderRadius(8)
}

6.2 复用范围

组件片段 复用原因
card 列表项结构稳定
abs 筛选按钮状态一致
gendaCard 议程卡片重复渲染
qrMark 小状态标记可复用
columnView 看板列结构一致

6.3 分工边界

Builder 负责界面片段,不承担复杂业务计算。复杂逻辑放到 private 方法中,页面更容易维护。

七、页面布局结构

7.1 纵向布局

办公类应用通常使用 Scroll + Column,能容纳统计、表单、筛选和列表。

Scroll() {
  Column() {
    // 概览区
    // 操作区
    // 列表区
  }
  .padding(16)
}
.height('100%')
.width('100%')

7.2 信息分区

区域 内容 价值
顶部概览 标题、说明、指标 快速理解当前状态
输入区域 新增记录 降低录入成本
筛选区域 类型、标签、状态 控制信息范围
列表区域 卡片和操作按钮 处理具体事项
反馈区域 导出、提醒、消息 确认操作结果

7.3 ForEach 渲染

ForEach(this.records, (item: Milestone) => {
  this.card(item)
}, (item: Milestone) => item.id.toString())

稳定 key 有助于列表刷新时保持条目对应关系。

八、交互链路

8.1 输入链路

TextInput({ text: this.draftText })
  .onChange((value: string) => {
    this.draftText = value;
  })

输入框只负责写入草稿状态,不直接操作列表。

8.2 按钮链路

Button('添加')
  .onClick(() => {
    this.addRecord();
  })

按钮调用方法,方法更新状态,页面自动刷新。

8.3 反馈链路

private setMessage(text: string): void {
  this.message = text;
}

反馈状态适合展示导出成功、提醒已设置、记录已更新等结果。

实践要点:不要让 UI 组件直接散落业务规则。组件触发方法,方法更新状态,是更稳定的链路。

九、业务状态与颜色语义

9.1 状态分类

状态 推荐颜色 说明
正常 绿色 已完成、已确认、已归还
处理中 蓝色 当前任务、当前议程、主操作
待处理 橙色 需要关注但未异常
风险 红色 超时、低库存、未确认
辅助 灰色 次要说明

9.2 文案表达

办公工具的文案要直接表达动作和状态,例如“添加”“确认”“导出”“推进”“已借出”“待审批”。

9.3 卡片信息密度

每张卡片应包含三类信息:

  • 主标题:用户首先识别的对象。
  • 状态标签:当前处理阶段。
  • 操作按钮:下一步能做什么。

十、运行与调试

10.1 DevEco Studio 运行

# 使用 DevEco Studio 打开项目
# 同步依赖
# 选择 entry 模块
# 运行到模拟器或真机

10.2 Hvigor 构建

hvigorw clean
hvigorw assembleHap

10.3 调试关注点

项目 检查内容
输入框 onChange 是否写入状态
新增按钮 空输入是否被拦截
列表刷新 数组是否被新数组替换
筛选按钮 当前标签是否高亮
统计指标 是否从当前列表派生

十一、可维护性分析

11.1 文件规模

当前 Index.ets 约 70 行,适合作为单页示例。超过这个规模后,可以拆分卡片组件、表单组件和统计组件。

11.2 状态数量控制

能从列表计算出来的值,不必额外保存为 @State。这样可以减少状态不一致。

private activeCount(): number {
  return this.records.filter((item: Milestone) => !item.done).length;
}

11.3 命名一致性

源码中的 $primaryMethod 体现了业务动作命名。方法名保持动词开头,可以降低维护成本。

十二、扩展方向

12.1 本地存储

可以把主列表持久化到本地,重新打开页面时恢复。

interface StoredItem {
  id: number;
  payload: string;
  updatedAt: number;
}

12.2 搜索能力

当记录数量增加后,可以引入关键词搜索,并和现有筛选状态组合。

12.3 导出能力

办公场景常需要导出文本、表格或截图。当前方法层已经有消息状态或导出动作,可以继续扩展。

十三、同类模板抽象

13.1 数据模板

interface OfficeItem {
  id: number;
  title: string;
  status: string;
}

13.2 状态模板

@State items: OfficeItem[] = [];
@State draftTitle: string = '';
@State filter: string = '全部';

13.3 UI 模板

@Builder
private itemCard(item: OfficeItem) {
  Row() {
    Text(item.title).layoutWeight(1)
    Text(item.status)
  }
  .padding(12)
  .backgroundColor('#FFFFFF')
}

十四、实现亮点

14.1 模型明确

Project Milestone Timeline 使用 $iface 描述业务对象,列表渲染和操作方法都有明确类型依据。

14.2 状态集中

$state 覆盖了页面交互所需的核心状态,调试时可以直接定位状态入口。

14.3 组件复用

$builder 把重复 UI 抽出来,页面结构更清楚。

十五、总结

Project Milestone Timeline 是一个典型的鸿蒙 ArkTS 办公小工具。它通过 $iface 建模业务数据,通过 $state 保存页面状态,通过 $method 完成新增、筛选、推进和反馈,再通过 $builder 构建统一的卡片与操作区域。

这类应用的实现重点是数据链路:输入进入状态,方法更新列表,列表驱动 UI,统计从源数据派生。掌握这套结构后,可以快速扩展出更多办公看板、登记表、提醒器和轻量管理工具。

如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是我持续创作的动力!


相关资源:

Logo

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

更多推荐