
前言在移动应用中页面路由是连接不同功能模块的纽带。HarmonyOS 提供了ohos.router模块支持页面跳转、参数传递、路由栈管理等功能。“海风日记“全项目共有28 个页面涉及大量路由跳转场景从闪屏到首页、从首页到详情、从详情到编辑、从设置页面跳转到子页面等。本文将从源码出发全面讲解 Router 路由管理的各项 API 和实战用法。一、Router 模块概述1.1 引入 Router 模块在 HarmonyOS 中所有页面路由操作通过ohos.router模块实现import router from ohos.router1.2 Router 的核心 APIAPI功能页面栈影响是否保留当前页router.pushUrl()跳转到新页面压栈保留router.replaceUrl()替换当前页面替换栈顶销毁router.back()返回上一页出栈销毁当前页router.clear()清空页面栈清空全部销毁router.getLength()获取栈中页面数无影响-router.getState()获取当前页面状态无影响-1.3 路由注册所有页面必须在main_pages.json中注册{ src: [ pages/SplashPage, pages/Index, pages/onboarding/OnboardingPage, pages/login/LoginPhonePage, pages/login/LoginNamePage, pages/diary/WriteDiaryPage, pages/diary/EditDiaryPage, pages/diary/DiaryDetailPage, pages/diary/DiaryDetail2Page, pages/calendar/CalendarYearPage, pages/search/SearchPage, pages/tag/TagDetailPage, pages/premium/PremiumPage, pages/privacy/PrivacyPasswordPage, pages/image/ImageViewerPage, pages/mine/ProfileInfoPage, pages/mine/PersonalSettingsPage, pages/mine/AccountSettingsPage, pages/mine/PhoneBindPage, pages/mine/TagManagePage, pages/mine/SpaceManagePage, pages/mine/DataManagePage, pages/mine/FaqPage, pages/mine/AboutPage, pages/mine/EmailFeedbackPage, pages/mine/DarkModePage ] }二、pushUrl页面跳转2.1 基本用法router.pushUrl()将新页面压入栈顶保留当前页面// 跳转到写日记页 Button() { SymbolGlyph($r(sys.symbol.plus)) } .onClick(() { router.pushUrl({ url: pages/diary/WriteDiaryPage }) })2.2 带参数跳转使用params字段传递参数// 跳转并传递参数 router.pushUrl({ url: pages/diary/DiaryDetailPage, params: { diaryId: item.id } })2.3 接收参数目标页面通过router.getParams()接收参数Entry Component struct DiaryDetailPage { private diary MOCK_DIARIES[0] aboutToAppear() { const params router.getParams() as Recordstring, string if (params params.diaryId) { const found MOCK_DIARIES.find(d d.id params.diaryId) if (found) this.diary found } } }2.4 参数传递的方式对比方式优点缺点适用场景router.pushUrlparams简单直接参数大小有限制普通参数传递全局状态共享跨页面共享需要额外状态管理全局用户信息持久化存储数据持久化读写开销大需要持久化的数据2.5 pushUrl 的完整参数interface RouterOptions { url: string // 目标页面路径 params?: Object // 传递的参数 modal?: boolean // 是否以模态方式打开 } // 模态跳转新页面从底部滑入 router.pushUrl({ url: pages/diary/WriteDiaryPage, modal: true })三、replaceUrl页面替换3.1 基本用法router.replaceUrl()替换当前页面当前页面会被销毁// 登录成功后替换到首页 Button(开始写日记 ) .onClick(() { router.replaceUrl({ url: pages/onboarding/OnboardingPage }) })3.2 典型应用场景在“海风日记“中replaceUrl用于以下场景场景源码说明闪屏 → 登录SplashPage.ets点击登录按钮替换闪屏闪屏 → 首页SplashPage.ets点击“直接体验“跳过登录和引导登录 → 引导LoginNamePage.ets昵称登录完成后进入引导页引导 → 首页OnboardingPage.ets引导结束进入首页退出登录 → 闪屏MineTab.ets退出登录回到闪屏3.3 pushUrl vs replaceUrl 的选择// 需要保留返回路径时使用 pushUrl router.pushUrl({ url: pages/diary/DiaryDetailPage }) // 用户可以从详情页返回到首页 // 不需要保留当前页时使用 replaceUrl router.replaceUrl({ url: pages/Index }) // 用户从闪屏进入首页后无法返回到闪屏3.4 页面栈的完整流程“海风日记“应用启动的页面栈变化步骤 1闪屏页 [SplashPage] 步骤 2点击登录replaceUrl [LoginPhonePage] 步骤 3登录成功replaceUrl [LoginNamePage] 步骤 4昵称设置replaceUrl [OnboardingPage] 步骤 5引导结束replaceUrl [Index] 步骤 6点击日记pushUrl [Index, DiaryDetailPage] 步骤 7点击编辑pushUrl [Index, DiaryDetailPage, EditDiaryPage] 步骤 8保存返回back [Index, DiaryDetailPage] 步骤 9返回首页back [Index]四、router.back返回上一页4.1 基本用法// 返回上一页 router.back() // 在导航栏关闭按钮中使用 Button() { SymbolGlyph($r(sys.symbol.xmark)) .fontSize(18).fontColor([COLOR_TEXT_MAIN]) } .backgroundColor(transparent).width(44).height(44) .onClick(() router.back())4.2 带参数返回router.back()支持传递参数给上一页// 返回并传递数据 router.back({ url: pages/diary/DiaryDetailPage, params: { updated: true } })4.3 返回指定页面如果要从深层页面返回到特定页面可以通过多次back()或使用router.clear()// 返回到指定页面需要知道页面路径 router.back({ url: pages/Index })4.4 返回前的确认在写日记页面如果用户有未保存的内容可以在返回前确认Button() { SymbolGlyph($r(sys.symbol.xmark)) } .onClick(() { if (this.diaryText.length 0) { // 弹窗确认是否放弃 AlertDialog.show({ title: 放弃编辑, message: 当前内容尚未保存, primaryButton: { value: 继续编辑, action: () {} }, secondaryButton: { value: 放弃, action: () { router.back() } } }) } else { router.back() } })五、路由参数传递详解5.1 传递复杂对象// 传递复杂对象 router.pushUrl({ url: pages/diary/DiaryDetailPage, params: { diaryId: 1, source: calendar, readOnly: true } })5.2 接收参数的类型安全推荐使用类型断言确保参数安全interface DiaryDetailParams { diaryId: string source?: string readOnly?: boolean } aboutToAppear() { const params router.getParams() as DiaryDetailParams if (params?.diaryId) { this.diaryId params.diaryId } }5.3 参数验证在实际项目中建议对参数进行验证aboutToAppear() { const params router.getParams() as Recordstring, string if (!params) { hilog.error(DOMAIN, TAG, 未收到路由参数) router.back() return } if (!params.diaryId) { hilog.error(DOMAIN, TAG, 缺少 diaryId 参数) router.back() return } // 参数有效加载数据 this.loadDiary(params.diaryId) }六、路由模式详解6.1 标准模式pushUrl// 标准跳转新页面压入栈顶 router.pushUrl({ url: pages/diary/DiaryDetailPage, params: { diaryId: 1 } })6.2 替换模式replaceUrl// 替换跳转替换当前页面 router.replaceUrl({ url: pages/Index })6.3 单例模式如果希望某个页面在栈中只有一个实例可以在跳转前检查// 检查页面是否已在栈中 const state router.getState() if (state.name ! DiaryDetailPage) { router.pushUrl({ url: pages/diary/DiaryDetailPage }) }6.4 模式对比模式API页面栈行为返回行为标准模式pushUrl新页面压栈可返回替换模式replaceUrl替换栈顶不可返回清空模式clearpushUrl清空栈再压栈不可返回返回模式back弹出栈顶到上一页七、页面间的生命周期联动7.1 路由跳转的生命周期顺序从页面 A 跳转到页面 B 时生命周期的执行顺序1. 页面 A: aboutToDisappear() 2. 页面 B: aboutToAppear() 3. 页面 B: build() 执行 4. 页面 A: onPageHide() 5. 页面 B: onPageShow()7.2 返回时的生命周期从页面 B 返回页面 A 时1. 页面 B: aboutToDisappear() 2. 页面 A: aboutToAppear() 3. 页面 A: build() 重新执行 4. 页面 B: onPageHide() 5. 页面 A: onPageShow()7.3 利用生命周期管理数据Entry Component struct DiaryDetailPage { State diary: DiaryEntry aboutToAppear() { // 每次进入页面时刷新数据 this.loadDiaryData() } onPageShow() { // 从其他页面返回时刷新 this.loadDiaryData() } loadDiaryData() { const params router.getParams() as Recordstring, string if (params?.diaryId) { this.diary MOCK_DIARIES.find(d d.id params.diaryId) } } }八、常见问题与最佳实践8.1 路由参数未收到问题目标页面router.getParams()返回undefined。原因在build()方法中调用getParams()时参数可能尚未传递完成。解决方案在aboutToAppear()中获取参数aboutToAppear() { // 此时参数已可用 const params router.getParams() as Recordstring, string }8.2 页面栈溢出问题长时间使用后页面跳转异常。原因页面栈中积累了大量页面超过了栈的最大容量默认 32 个。解决方案// 定期清理页面栈 if (router.getLength() 20) { // 清空栈后重新跳转 router.clear() router.pushUrl({ url: pages/Index }) }8.3 跨页面数据同步问题页面 A 修改了数据返回页面 B 后数据未更新。解决方案在onPageShow()中刷新数据Entry Component struct HomeTab { State diaryList: DiaryEntry[] MOCK_DIARIES onPageShow() { // 每次页面显示时刷新数据 this.diaryList [...MOCK_DIARIES] } }8.4 路由参数的大小限制router.pushUrl的params参数大小有限制通常不超过 2KB。对于大量数据建议使用全局状态或持久化存储。总结本文通过“海风日记“的完整源码详细讲解了 HarmonyOS Router 路由管理的完整体系pushUrl页面跳转支持参数传递和模态跳转replaceUrl页面替换适用于登录、引导等场景router.back返回上一页支持参数回传参数传递类型安全、参数验证、复杂对象传递路由模式标准、替换、单例模式的对比和选择生命周期联动路由跳转时的生命周期执行顺序最佳实践页面栈管理、数据同步、参数验证下一篇文章将深入讲解BarMode.Fixed 与 scrollable 属性分析 Tab 栏固定模式与滚动模式的选择策略和适配方案敬请期待。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源ohos.router API 文档HarmonyOS 页面路由开发指南页面生命周期文档海风日记项目源码[HarmonyOS 开发者官网](https://atomgit.com/openharmony/docs开源鸿蒙跨平台社区ArkUI 导航组件UIAbility 生命周期