HarmonyOS 教学实战(五):路由、页面生命周期与多页面架构

到目前为止,我们已经完成了:

  • 状态管理(V2)

  • 网络与缓存

  • 列表分页与性能

  • 登录系统与全局状态

但还有一个问题没有系统解决:

当页面多了以后,应用怎么"跑"起来?

答案是三个关键词:

路由 · 生命周期 · 页面架构


一、为什么一定要理解路由和生命周期?

很多新手的项目,前期还能维护,一到中后期就开始出现:

  • 页面跳转混乱

  • 返回逻辑不一致

  • 登录态失效后页面不刷新

  • 页面销毁/重建时状态丢失

  • 返回键行为不可控

这些问题的本质是:

你在写页面,但没有在"设计页面体系"。


二、先画一张应用的"页面地图"

我们以当前 App 为例,页面结构如下:

复制代码
AppRoot
 ├─ LoginPage
 └─ MainPage
     ├─ HomePage(任务列表)
     ├─ DetailPage(任务详情)
     └─ ProfilePage(个人中心)

📌 这是一个典型商业应用结构

  • Root 决定走向

  • Main 负责多页面

  • 子页面专注业务


三、HarmonyOS 的路由体系(核心 API)

HarmonyOS ArkUI 提供的路由模块:

复制代码
import router from '@ohos.router'

最常用的 4 个方法

方法 作用
router.pushUrl 跳转新页面
router.replaceUrl 替换当前页面
router.back 返回
router.clear 清空路由栈

四、页面跳转实战(从列表到详情)

1️⃣ 在列表页跳转详情页

复制代码
Button("查看详情")
  .onClick(() => {
    router.pushUrl({
      url: 'pages/Detail',
      params: {
        taskId: this.task.id
      }
    })
  })

📌 页面参数通过 params 传递

📌 不建议使用全局变量


2️⃣ 在详情页接收参数

复制代码
@Entry
@ComponentV2
struct Detail {
  @Local taskId: number = 0

  onPageShow() {
    const params = router.getParams()
    this.taskId = params.taskId
  }

  build() {
    Text(`任务 ID:${this.taskId}`)
  }
}

五、页面生命周期(非常重要)

每个页面都有一套完整生命周期。

常用生命周期方法

方法 何时调用
onPageShow 页面可见
onPageHide 页面不可见
onBackPress 返回键
onPageDestroy 页面销毁

示例:页面显示时刷新数据

复制代码
onPageShow() {
  this.store.refresh()
}

📌 比 @Once 更适合"回到页面就刷新"


示例:拦截返回键

复制代码
onBackPress() {
  if (this.hasEdit) {
    showDialog('确认退出?')
    return true // 阻止默认返回
  }
  return false
}

六、登录态失效时如何"强制回登录页"?

错误做法 ❌

  • 在每个页面判断 isLogin

  • 到处写 router.replace

正确做法 ✔

👉 统一在 AppRoot 中处理

复制代码
if (!this.appStore.auth.isLogin) {
  router.clear()
  router.replaceUrl({ url: 'pages/Login' })
}

📌 页面永远不关心登录态逻辑

📌 这是架构级决策


七、多页面架构设计(教学重点)

推荐三层页面结构

层级 职责
Root 登录判断、初始化
Shell Tab / Navigation
Page 业务页面

示例:MainPage(壳页面)

复制代码
@ComponentV2
struct MainPage {
  @Local tabIndex = 0

  build() {
    Column() {
      if (this.tabIndex === 0) {
        HomePage()
      } else {
        ProfilePage()
      }

      BottomNavigation({
        current: this.tabIndex,
        onChange: i => this.tabIndex = i
      })
    }
  }
}

📌 Tab 页不是路由

📌 Tab 是状态切换


八、什么时候用"页面",什么时候用"组件"?

这是一个分界点问题

用页面(router):

  • 页面级业务

  • 可返回

  • 需要参数传递

  • 生命周期敏感

用组件(Component):

  • UI 复用

  • 局部状态

  • 无路由栈

📌 页面 ≠ 组件


九、常见路由 & 生命周期坑

❌ 在 build() 中跳转页面

可能无限重建

✔ 在事件 / 生命周期中跳转


❌ 页面销毁时忘记清理 Worker / Timer

内存泄漏

✔ 在 onPageDestroy 中清理


❌ 多页面共用一个 @Local 状态

状态错乱

✔ 用 Store / Provider


十、到这一篇,你的应用已经是什么水平?

你已经具备:

✔ 完整页面路由体系

✔ 生命周期理解

✔ 多页面架构设计能力

✔ 登录态统一管理

✔ 页面职责划分意识

这已经是:

能支撑中大型 HarmonyOS 应用的架构基础


结语

路由和生命周期不是 API,而是"应用运行的骨架"。

当你真正理解它们,

你写的不再是"页面",而是一个完整的应用系统

相关推荐
Kyle01232 小时前
计算机体系结构中的中断处理机制:硬件响应与软件识别的协同架构
架构·操作系统·计组
自由生长20243 小时前
C++团队的流式系统之路:从学习成本到实战策略
架构
云和数据.ChenGuang3 小时前
鸿蒙电视的核心技术
华为·harmonyos·数据库运维工程师·运维教程
AirDroid_cn4 小时前
鸿蒙NEXT:升级系统时提示 “存储空间不足” 如何解决?
华为·harmonyos
玩转数据库管理工具FOR DBLENS5 小时前
企业数据架构选型指南:关系型与非关系型数据库的实战抉择
数据库·测试工具·mysql·oracle·架构·nosql
盐焗西兰花5 小时前
鸿蒙学习实战之路-数据持久化键值型数据库KV-Store全攻略
数据库·学习·harmonyos
fuzamei8885 小时前
Chain33 Orderbook:去中心化订单簿的创新架构与实现
架构·去中心化·区块链
一水鉴天6 小时前
整体设计 定稿 之7 共享给定表格文档的分析(豆包助手)
人工智能·架构
Codebee6 小时前
A2UI vs OOD全栈方案:AI驱动UI的两种技术路径深度解析
前端·架构