一、前言
页面路由是App页面流转的骨架,几乎所有项目都离不开页面跳转、参数传递、页面返回逻辑。鸿蒙ArkUI提供官方router路由模块,是原生页面跳转标准方案。
很多开发者开发中频繁踩坑路由相关问题:
本篇全方位拆解鸿蒙原生Router路由,覆盖跳转方式、深浅传参、栈操作、路由守卫封装、业务落地源码,吃透后可直接搭建项目标准路由框架。
二、Router三大跳转方式对比
跳转API | 栈行为 | 适用场景 |
|---|
router.pushUrl | 新页面入栈,原页面保留在栈 | 常规详情、子页面跳转 |
router.replaceUrl | 替换当前页面,原页面出栈销毁 | 登录成功替换首页、引导页跳转 |
router.back | 出栈,销毁当前页面,回到上一页 | 系统返回、自定义返回按钮 |
三、项目前置配置
使用路由必须在 src/main/resources/base/profile/main_pages.json 注册页面路径,未注册跳转直接报错。
{ "src": [ "pages/index/index", "pages/detail/detail", "pages/login/login" ]}
四、五种页面传参实战
4.1 query拼接传参(基础字符串)
适合数字、字符串简单参数,拼接在url后,目标页通过router.getParams()读取。
import router from '@ohos.router';// 跳转携带参数router.pushUrl({ url: "pages/detail/detail?id=1001&name=鸿蒙开发"})// 目标detail页面取值let params = router.getParams();let id = params.id;let name = params.name;
4.2 params对象传参(普通对象)
原生params字段,支持基础类型与简单对象,推荐日常开发首选。
// 发送页router.pushUrl({ url:"pages/detail/detail", params:{ userId:2001, title:"商品详情" }})// 接收页const args = router.getParams();
4.3 返回页面回传参数
back入参携带数据,上一页面在页面aboutToAppear重新获取参数。
// 详情页返回首页并传值router.back({ url:"pages/index/index", params:{from:"详情页",status:1}})
4.4 全局存储跨页传参(超大复杂对象)
超大实体、数组无法通过params传递,借助AppStorage全局中转,页面取值后及时清空避免脏数据。
五、路由栈管理常用API
import router from '@ohos.router';// 获取当前路由栈信息let stackInfo = router.getStackInfo();// 返回到指定页面,中间页面全部出栈销毁router.back({url:"pages/index/index"});// 清空整个路由栈,跳转首页router.replaceUrl({url:"pages/index/index"});
栈堆积优化方案:多级页面跳转至首页时使用replaceUrl,销毁中间所有页面,避免多次点击返回层层回退。
六、封装全局路由拦截(路由守卫)
统一拦截需要登录的页面,未登录自动跳转登录页,项目全局只需要一处配置。
// utils/RouterUtil.etsimport router from '@ohos.router';import { AppStorage } from '@ohos.arkui.state';// 需要登录的页面白名单const needLoginPages:string[] = [ "pages/user/user", "pages/pay/pay"]export function goPage(url:string,params:Object={}){ // 获取全局登录状态 let isLogin = AppStorage.get("isLogin") ?? false; // 判断是否是需要登录页面 if(needLoginPages.includes(url) && !isLogin){ //未登录跳转登录 router.replaceUrl({url:"pages/login/login",params:{jumpUrl:url}}) return; } router.pushUrl({url,params})}
业务页面直接调用goPage完成带权限校验跳转,不用每个页面重复判断登录。
七、登录后回跳原页面
未登录访问受限页→跳转登录,登录成功自动回到之前目标页面。
//登录页面@Entry@Componentstruct Login{ @State jumpUrl:string = "" aboutToAppear(){ let args = router.getParams(); this.jumpUrl = args.jumpUrl ?? "pages/index/index"; } loginSuccess(){ //登录成功替换页面回跳 router.replaceUrl({url:this.jumpUrl}) }}
八、高频避坑清单
1.页面路径未在main_pages.json注册:路由直接失败,开发新增页面优先配置注册;
2.params无法传递带方法的复杂类:函数、DOM对象不能路由传参,改用全局缓存;
3.连续push造成栈爆炸:频繁详情跳转优先按需使用replace替换页面;
4.getParams重复取值旧数据:接收参数及时提取,复杂对象不要长期依赖路由缓存;
5.返回找不到指定页面:back指定页面必须在当前路由栈内,否则无效。
九、项目落地优化方案
统一封装路由工具类,全项目禁用原生router直接跳转,全部走封装方法统一拦截;
拆分页面常量路径,统一维护页面地址,避免硬编码字符串写错路径;
退出关键页面优先replace,控制路由栈长度,减少内存占用;
大型项目可基于原生router二次封装简易路由框架,统一埋点、日志、权限。
十、总结
Router是ArkUI原生标准路由,无第三方依赖、性能轻量化、适配所有鸿蒙设备版本,是项目页面跳转的唯一最优官方方案。路由开发看似简单,实则关乎项目的页面栈稳定性、内存优化、权限管控、用户体验,是商用项目开发的核心基础能力。
本文全覆盖讲解了鸿蒙路由核心能力,包含三大跳转方式、五种传参方案、路由栈管理、全局路由守卫、登录回跳逻辑,同时梳理高频坑点与项目落地优化方案。从基础语法到工程化封装,全方位解决页面跳转错乱、传参丢失、权限失控、栈堆积内存溢出等常见问题。
在实际项目开发中,务必摒弃原生API零散调用的写法,统一封装全局路由工具,规范跳转逻辑、权限校验、页面栈管控,让项目路由层级清晰、维护便捷、稳定性更强。吃透本篇内容,即可搭建一套适配中大型鸿蒙项目的标准化路由架构。