HarmonyOS ArkUI 进阶实战:构建企业级个人中心与任务管理系统

今天我们来挑战一个更复杂的 HarmonyOS 应用架构。这个项目模拟了一个现代移动应用的核心:包含底部 Tab
导航
动态问候语任务管理数据统计图表以及个人中心的完整单页应用 (SPA)。

通过这个案例,你将学会如何利用 ArkUI 的 Tabs
组件构建多页面路由,如何通过接口(Interface)定义复杂数据类型,以及如何利用 @Builder 装饰器实现高度复用的 UI
组件。

📱 核心功能与界面概览

这个应用模拟了一个高效办公助手,包含以下四个核心模块:

  1. 首页 (Home):根据时间显示“早上好/下午好”,展示关键数据卡片、快捷入口、今日任务预览和天气卡片。

在这里插入图片描述

  1. 任务 (Tasks):一个完整的 CRUD(增删改查)界面,支持添加任务、设置优先级(高/中/低)、切换完成状态和删除任务。
    在这里插入图片描述

  2. 统计 (Stats):展示数据概览、进度条和简单的柱状图趋势。在这里插入图片描述

  3. 我的 (Profile):个人信息展示与功能菜单。
    整个应用采用了 Material Design 风格,使用了渐变色、阴影和圆角卡片,视觉层次非常丰富。在这里插入图片描述

代码架构深度解析

我们将代码拆解为三个关键部分进行讲解:数据模型定义导航架构核心交互逻辑

1. 数据建模:interface 的应用

在 ArkUI 中,当数据结构变得复杂时,我们需要使用 interface 来定义数据模型。这不仅让代码更清晰,还能在编译期避免错误。

// 定义任务数据结构
interface Task {
  id: number;
  title: string;
  completed: boolean;
  priority: string; // 优先级:高、中、低
}

// 定义统计卡片数据结构
interface StatCard {
  title: string;
  value: string;
  color: string;
  icon: string;
}

在这里插入图片描述

状态管理 (@State): 代码中使用了 @State 来管理组件的内部状态:

  • tasks: Task[]:存储任务列表数据。
  • stats: StatCard[]:存储统计卡片的配置数据(注意:这里使用了 private,因为统计卡片数据是静态的,不需要触发 UI 重绘)。
  • currentTab:记录当前选中的底部 Tab 索引。
2. 导航架构:TabsTabContent

这是本项目最核心的架构。HarmonyOS 的 Tabs 组件允许我们在一个页面内切换不同的视图。

Tabs({ barPosition: BarPosition.End, index: this.currentTab }) {
  // Tab 1: 首页
  TabContent() { this.HomeTab() }
  .tabBar(this.TabBuilder(0, '首页', '🏠'))

  // Tab 2: 任务
  TabContent() { this.TasksTab() }
  .tabBar(this.TabBuilder(1, '任务', '📝'))

  // ... 其他 Tab
}
.onChange((index: number) => {
  this.currentTab = index; // 监听 Tab 变化
})

在这里插入图片描述

自定义 TabBar (@Builder TabBuilder): 代码中使用了 @Builder 方法 TabBuilder 来复用底部导航栏的样式。它根据传入的索引 index 判断当前 Tab
是否被选中(this.currentTab === index),从而动态改变图标的颜色(选中为蓝色 #007DFF,未选中为灰色
#999999)。

3. 核心交互逻辑:任务管理系统

在“任务”Tab 中,我们实现了一个标准的数据操作流程。

添加任务 (addTask)

addTask(): void {
  if (this.newTask.trim() === '') return;
  
  // 生成新 ID
  const newId = this.tasks.length > 0 ? Math.max(...this.tasks.map(t => t.id)) + 1 : 1;
  
  // unshift 将新任务插入数组头部
  this.tasks.unshift({
    id: newId,
    title: this.newTask.trim(),
    completed: false,
    priority: this.selectedPriority
  });
  this.newTask = ''; // 清空输入框
}
  • 逻辑:获取输入框内容 -> 生成唯一 ID -> 插入数组头部 -> 清空输入框。

切换状态 (toggleTask)

toggleTask(id: number): void {
  const index = this.tasks.findIndex((task: Task) => task.id === id);
  if (index !== -1) {
    this.tasks[index].completed = !this.tasks[index].completed;
  }
}
  • 逻辑:通过 findIndex 找到对应任务 -> 反转 completed 状态。
  • UI 反馈:在 UI 中,我们使用了 Textdecoration 属性,当 task.completedtrue 时,显示删除线 (LineThrough),视觉上表示任务已完成。

删除任务 (deleteTask)

deleteTask(id: number): void {
  this.tasks = this.tasks.filter((task: Task) => task.id !== id);
}
  • 逻辑:使用 filter 方法过滤掉被删除的任务 ID,生成一个新数组。
4. 智能问候语:aboutToAppear

代码中使用了生命周期函数 aboutToAppear(),它在组件创建前执行一次。

aboutToAppear() {
  this.updateGreeting();
}

updateGreeting() {
  const hour = new Date().getHours();
  if (hour < 12) {
    this.greeting = '早上好';
  } else if (hour < 18) {
    this.greeting = '下午好';
  } else {
    this.greeting = '晚上好';
  }
}
  • 效果:应用启动时,根据系统时间自动判断并设置 this.greeting 的值,从而在首页显示不同的问候语。

💡 UI 组件亮点解析

  1. 卡片式布局 (StatCardBuilder)
    代码中抽象了 StatCardBuilder 方法来生成统计卡片。它接收 stat 对象作为参数,动态应用卡片的颜色、图标和数值。卡片使用了 linear-gradient 渐变背景和 shadow 阴影,提升了立体感。

  2. 优先级标签 (PriorityBadge)
    这是一个交互式组件。它根据传入的 isSelected 状态,动态改变背景色和文字颜色。点击时会触发 onClick,更新 selectedPriority 状态,实现单选按钮的效果。

  3. 列表渲染 (ForEach)
    在首页和任务页,都使用了 ForEach 来遍历数据数组。特别是在首页,使用了 this.stats.slice(0, 2)this.stats.slice(2, 4) 将数组切片,实现了 2x2 的网格布局。

📝 总结

这个项目展示了 HarmonyOS ArkUI 开发的工业级标准。它不仅仅是一个简单的计数器,而是涵盖了:

  • 路由管理Tabs 实现多页面切换。
  • 数据驱动@State + interface 管理复杂对象数组。
  • 逻辑分离:将数据处理逻辑(add/delete/toggle)与 UI 渲染分离。
  • UI 复用:通过 @Builder 封装通用样式。

希望这篇解析能帮助你理解如何构建一个结构清晰、功能完整的 HarmonyOS 应用。你可以在此基础上继续扩展,例如增加数据持久化(Preferences)、网络请求或更复杂的状态管理(AppStorage)。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐