news 2026/4/23 12:55:09

HarmonyOS 页面路由与导航开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS 页面路由与导航开发

网罗开发(小红书、快手、视频号同名)

大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 前言
    • 路由与页面栈
      • 配置路由表 main_pages.json
      • 跳转:pushUrl 与 replaceUrl
      • 目标页接收参数
      • 返回与传参
    • 生命周期与路由
    • 导航类组件:Tabs 与 NavRouter
      • Tabs 简单用法
      • NavRouter 与 NavDestination
    • 常见问题
    • 总结

前言

HarmonyOS 应用通常由多个页面组成,页面之间的跳转、传参以及返回栈管理,都依赖路由与导航能力。ArkTS 提供了基于「路由」的页面模型,理解其用法和生命周期,能避免「跳转失败」「参数丢失」「返回键行为异常」等问题。

本文只讲路由与导航的核心 API 和典型用法,不贴完整工程,方便快速接入和排查问题。

路由与页面栈

在 HarmonyOS 中,每个「可被路由到的页面」对应一个用@Entry装饰的组件,路由地址在模块的main_pages.json中配置。跳转时通过router的 API 压栈或替换页面,返回时弹栈。

配置路由表 main_pages.json

src/main/resources/base/profile/main_pages.json中声明页面路径与组件名:

{"src":["pages/Index","pages/Detail","pages/UserCenter"]}
  • pages/Index表示ets/pages/Index.ets中导出的@Entry页面,路由 path 一般为pages/Index
  • 未在此声明的页面无法通过路由跳转

跳转:pushUrl 与 replaceUrl

router.pushUrl()会在当前栈顶再压入一个新页面;router.replaceUrl()会替换当前栈顶页面(当前页被销毁,无法再返回回来)。

无参跳转:

importrouterfrom'@ohos.router'// 跳转到详情页,可返回router.pushUrl({url:'pages/Detail'})// 替换当前页为登录页,当前页无法返回router.replaceUrl({url:'pages/Login'})

带参跳转:

router.pushUrl({url:'pages/Detail',params:{id:100,from:'list'}})

params会随路由传递,在目标页通过router.getParams()读取。

目标页接收参数

在详情页(例如Detail.ets)的onPageShow()aboutToAppear()中获取参数:

importrouterfrom'@ohos.router'@Entry@Componentstruct Detail{@Stateid:string=''@Statefrom:string=''aboutToAppear(){constparams=router.getParams()asRecord<string,Object>if(params){this.id=String(params['id']??'')this.from=String(params['from']??'')}}build(){Column(){Text(`id:${this.id}, from:${this.from}`)}}}

注意:getParams()返回类型为Object,实际使用建议做类型断言或安全取值,避免运行时异常。

返回与传参

返回上一页用router.back();需要把结果带回上一页时,可传params

router.back({url:'pages/Index',params:{result:'ok',selectedId:200}})

上一页在再次显示时(例如onPageShow())通过router.getParams()可拿到这次返回携带的params。注意:返回时的params只在「返回目标页」重新显示时有效,若目标页已不在栈顶,需要自己设计数据回传方式(如全局状态、回调接口等)。

生命周期与路由

页面生命周期和路由紧密相关,常用回调有:

  • aboutToAppear():页面即将显示前调用一次,适合做数据初始化、读router.getParams()
  • onPageShow():每次页面显示时调用(首次进入、从子页返回都会触发),适合刷新列表、重新读返回参数
  • aboutToDisappear():页面即将销毁前调用,适合释放资源、取消订阅

典型用法:

@Entry@Componentstruct Detail{aboutToAppear(){constparams=router.getParams()// 根据 params 请求详情接口、设置标题等}onPageShow(){// 从子页返回时可能带回 params,在这里处理constparams=router.getParams()if(params&&params['refresh']){// 重新拉取数据}}aboutToDisappear(){// 取消网络请求、解绑监听等}}

这样能保证「进页拿参数、返回来刷新、离开时收尾」。

导航类组件:Tabs 与 NavRouter

除了整页跳转,ArkUI 还提供 Tab 切换、NavRouter 等「容器内导航」组件,用于同一页面内多内容区切换。

Tabs 简单用法

@Entry@Componentstruct TabDemo{@StatecurrentIndex:number=0@BuilderTabBuilder(title:string,index:number){Text(title).fontSize(18).fontColor(this.currentIndex===index?'#007AFF':'#666666').onClick(()=>{this.currentIndex=index})}build(){Tabs({barPosition:BarPosition.Start,index:this.currentIndex}){TabContent(){Text('首页内容')}.tabBar(this.TabBuilder('首页',0))TabContent(){Text('我的内容')}.tabBar(this.TabBuilder('我的',1))}.onChange((index:number)=>{this.currentIndex=index})}}

通过indexonChange把「当前选中的 Tab」与@State currentIndex同步,即可实现点击 Tab 栏和滑动内容联动。

NavRouter 与 NavDestination

NavRouter 配合 NavDestination 可做「侧边/底部导航 + 多子页」结构:点击导航项切换对应的 NavDestination,适合设置、个人中心等多级入口。使用方式为在 NavRouter 下放多个 NavDestination,通过navDestination属性绑定,用isSelected或路由状态控制当前展示的 Destination,具体 API 以当前版本文档为准。

常见问题

现象可能原因处理思路
pushUrl 报错找不到页面未在 main_pages.json 中配置检查 path 与 json 中 src 一致、编译后资源是否包含该页
目标页拿不到 params在 aboutToAppear 之前就用了 getParams、或未用 params 传在 aboutToAppear/onPageShow 里取参,pushUrl 时带上 params
返回后上一页数据不更新未在 onPageShow 里处理返回 params在 onPageShow 中 getParams 并刷新列表/表单
替换页后仍能返回用了 pushUrl 而非 replaceUrl登录后跳首页等「不可回退」场景用 replaceUrl

总结

HarmonyOS 页面路由依赖main_pages.jsonrouterpushUrl/replaceUrl负责跳转与传参,getParams()在目标页取参,back()可带参返回。结合aboutToAppearonPageShowaboutToDisappear处理生命周期,即可完成「进页初始化、返回来刷新、离开收尾」。Tabs、NavRouter 等组件用于单页内的多内容区导航,与整页路由配合使用即可覆盖大部分导航场景。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:11:23

Java中的代码块

在Java中&#xff0c;代码块是用一对花括号{}包裹起来的一段代码&#xff0c;根据其位置和用途不同&#xff0c;Java中主要有以下4中类型的代码块1.普通代码块1.定义&#xff1a;写在方法内部{ }的代码&#xff0c;用于限定变量作用域或逻辑分组2.特点&#xff1a;只能在方法、…

作者头像 李华
网站建设 2026/4/23 10:11:12

一番赏盲盒小程序前端功能:层级乐趣与便捷服务的双向赋能

一番赏盲盒小程序以层级化奖项体系为核心特色&#xff0c;凭借细腻的前端功能设计&#xff0c;精准还原线下抽赏的递进式惊喜&#xff0c;同时嫁接线上操作的高效便捷。在弱化营销属性的基础上&#xff0c;串联起赏系浏览、抽赏互动、权益兑现及收藏管理的全流程&#xff0c;以…

作者头像 李华
网站建设 2026/4/23 10:11:28

LINE收不到验证码?可能原因和解决方法

在LINE的使用过程中&#xff0c;有时在验证环节会碰到接收不到手机验证码的情况。可以参考本文排查原因、解决验证问题。一、LINE收不到验证码的可能原因1.虚拟号码如果使用的是非实名的、安全性不高的低质虚拟号码&#xff0c;可能会被平台阻止。2.号码被封如果之前在账号使用…

作者头像 李华
网站建设 2026/4/23 11:03:47

吃透分布式与微服务:3分钟分清区别,再也不怕面试被问!

在后端架构演进过程中&#xff0c;“分布式”和“微服务”是两个高频出现且极易混淆的概念。很多开发者入门时会有疑问&#xff1a;两者是不是一回事&#xff1f;微服务就是分布式吗&#xff1f;分布式一定是微服务吗&#xff1f;其实答案很明确&#xff1a;微服务是分布式架构…

作者头像 李华
网站建设 2026/4/23 11:31:08

NodeJs从入门到上天:什么是Node.js

一&#xff1a;概念 1&#xff1a;概念 node.js是一个JavaScript运行时环境&#xff0c;使用者可以搭建服务器端的JavaScript程序。 2&#xff1a;作用 作用: 1&#xff1a;使用Node.js编写服务器端程序。编写数据接口&#xff0c;提供网页资源浏览功能等等 2&#xff1a;前端…

作者头像 李华
网站建设 2026/4/23 11:35:22

56页精品PPT | 企业智能工厂建设整体解决方案

制药企业面临多重挑战。监管要求日趋严格&#xff0c;GMP合规压力大。传统车间设备孤立运行&#xff0c;数据无法互通。生产记录依靠人工&#xff0c;质量追溯困难。仓储作业效率低&#xff0c;库存状态不透明。供应链协同不足&#xff0c;采购与生产计划脱节。这些问题制约企业…

作者头像 李华