发布时间:2026/7/17 5:29:55
鸿蒙应用开发实战【74】— 子组件 router 导航:import 对比 getUIContext 鸿蒙应用开发实战【74】— 子组件 router 导航import 对比 getUIContext本文是「号码助手全栈开发系列」第 74 篇持续更新中…开源社区https://openharmonycrossplatform.csdn.net前言在号码助手项目中页面导航路由跳转有两种实现方式import { router } from kit.ArkUI的模块导入以及this.getUIContext().getRouter()的实例获取。HomePage 等核心页面选择了 import 方式本篇深入分析两种方式的异同、选型依据和最佳实践。本文涵盖router 模块导入方式详解、getUIContext().getRouter() 实例方式详解、两种方式的对比分析、HomePage 选型决策解析、子组件路由导航模式、callback 错误处理、getUIContext 的其他能力getWindow、getDisplay 等、路由栈管理最佳实践。一、import { router } 方式1.1 模块导入这是号码助手中最常用的方式在文件顶部通过import引入router// HomePage.ets — import 方式import{router}fromkit.ArkUI;import{promptAction}fromkit.ArkUI;EntryComponentstruct HomePage{build(){Column(){// 页面内容...}}/** * 统一页面导航方法 */privatenavigate(url:string,params?:Recordstring,Object):void{router.pushUrl({url:pages/${url},params:params??{},}).then((){hilog.info(0x0000,HomePage,navigate success: %{public}s,url);}).catch((error:Error){hilog.error(0x0000,HomePage,navigate failed: %{public}s,error.message);promptAction.showToast({message:页面跳转失败:${error.message},});});}}1.2 FAB 按钮导航示例// HomePage.ets — FAB 悬浮按钮导航build(){Stack(){// 主内容区域this.MainContent()// FAB 悬浮按钮Image($r(app.media.ic_add)).width(56).height(56).position({bottom:24,right:24}).onClick((){this.showActionSheet();})}.width(100%).height(100%)}privateshowActionSheet():void{ActionSheet.show({title:选择操作,buttons:[{title:添加卡号,action:()this.navigate(AddCardPage),},{title:批量导入,action:()this.navigate(PasteImportPage),},{title:取消,action:(){},},],});}1.3 带参数导航// HomePage.ets — 统计卡片点击跳转privateonStatCardClick(status:string):void{this.navigate(StatusListPage,{status});}// 应用列表行点击privateonAppItemClick(app:AppBinding):void{this.navigate(AppDetailPage,{appId:app.id});}二、this.getUIContext().getRouter() 方式2.1 组件实例获取在自定义组件内部通过getUIContext()获取路由实例// 子组件中通过 getUIContext 导航Componentstruct AppListItem{Propapp:AppBinding|nullnull;build(){Row(){// 应用信息展示Text(this.app?.app_name??)Text(this.app?.status??)}.onClick((){this.navigateToDetail();})}privatenavigateToDetail():void{constrouterthis.getUIContext().getRouter();router.pushUrl({url:pages/AppDetailPage,params:{appId:this.app?.id??0,},}).catch((error:Error){console.error(navigate failed:,error.message);});}}2.2 在 Builder 中使用在Builder函数中也可以使用getUIContext()Componentstruct CardManagePage{BuilderCardItem(card:CardEntity){Column(){Text(card.label).fontSize(16).fontWeight(FontWeight.Bold)Text(this.formatPhone(card.phone_number)).fontSize(13).fontColor(#68708A)}.onClick((){// 在 Builder 中需要使用 getUIContextthis.getUIContext().getRouter().pushUrl({url:pages/CardDetailPage,params:{cardId:card.id},}).catch((error:Error){promptAction.showToast({message:跳转失败});});})}}三、两种方式深度对比3.1 核心特性对比特性import { router }getUIContext().getRouter()导入方式模块静态导入实例方法获取生命周期依赖无需要组件已挂载编译时检查有静态类型检查无运行时获取树摇优化支持不支持上下文绑定全局单例组件树上下文在 Builder 中使用直接使用需this.getUIContext()在非组件中使用可以用不可以用在回调中使用闭包捕获即可可能丢失this上下文3.2 为什么 HomePage 使用 import 方式HomePage 选择import { router }的核心原因因素import 方式getUIContext 方式调用频率高频多个导航点同等可用代码简洁度一行router.pushUrlthis.getUIContext().getRouter().pushUrl回调上下文无this丢失问题需注意this指向统一封装容易封装为全局工具NavigationUtil只能在组件内使用静态分析IDE 可提供导入提示无法静态分析// 结论HomePage 使用 import 封装为统一方法classNavigationUtil{staticpush(url:string,params?:Recordstring,Object):Promisevoid{returnrouter.pushUrl({url:pages/${url},params:params??{}});}}// 所有页面统一调用NavigationUtil.push(StatusListPage,{status:待换绑});3.3 何时使用 getUIContext 方式// 场景一自定义子组件中需要导航Componentexportstruct MyCustomButton{privatetargetUrl:string;build(){Button(跳转).onClick((){// 子组件中推荐使用 getUIContextthis.getUIContext().getRouter().pushUrl({url:this.targetUrl,});})}}// 场景二Builder 中需要导航BuilderfunctionGlobalActionButton(icon:Resource,url:string){Image(icon).width(48).height(48).onClick((){// Builder 函数中 this 不可用需通过参数传递})}四、getUIContext 的其他能力4.1 获取窗口信息getUIContext()不仅能获取 Router还能获取窗口、显示等信息Componentstruct CustomComponent{build(){Column(){// ...}}privategetWindowSize():void{constwindowthis.getUIContext().getWindow();// 获取窗口属性constpropertieswindow.getWindowProperties();hilog.info(0x0000,Component,window size: %{public}d x %{public}d,properties.windowRect.width,properties.windowRect.height);}privategetDisplayInfo():void{constdisplaythis.getUIContext().getDisplay();hilog.info(0x0000,Component,display dpi: %{public}d,display.densityDPI);}}4.2 getUIContext 可用方法方法返回类型用途getRouter()Router页面路由导航getWindow()Window窗口属性与操作getDisplay()Display屏幕显示信息getFont()Font字体管理getMediaQuery()MediaQuery媒体查询getFolder()Folder文件夹操作五、路由方法详解5.1 常用路由 API方法说明参数pushUrl(options)压入新页面{ url, params }replaceUrl(options)替换当前页面{ url, params }back(options?)返回上一页{ url, params? }getParams()获取当前页面参数无getState()获取路由栈状态无clear()清空路由栈无5.2 路由栈管理// 获取路由栈状态privatecheckRouteStack():void{conststaterouter.getState();hilog.info(0x0000,Router,route stack: index%{public}d, size%{public}d,state.index,state.size);}// 返回并传参privategoBackWithResult():void{router.back({url:pages/HomePage,params:{result:success},});}// 替换页面不保留返回privatereplaceToLogin():void{router.replaceUrl({url:pages/LoginPage,});}六、错误处理与最佳实践6.1 统一错误处理// common/utils/RouteUtil.ets — 统一路由管理import{router}fromkit.ArkUI;import{promptAction}fromkit.ArkUI;import{hilog}fromkit.PerformanceAnalysisKit;constTAGRouteUtil;exportclassRouteUtil{staticpush(url:string,params?:Recordstring,Object):Promisevoid{returnrouter.pushUrl({url:pages/${url},params:params??{},}).catch((error:Error){hilog.error(0x0000,TAG,pushUrl failed: url%{public}s, error%{public}s,url,error.message);promptAction.showToast({message:页面跳转失败请重试,duration:2000,});});}staticreplace(url:string,params?:Recordstring,Object):Promisevoid{returnrouter.replaceUrl({url:pages/${url},params:params??{},}).catch((error:Error){hilog.error(0x0000,TAG,replaceUrl failed: %{public}s,error.message);});}staticback(params?:Recordstring,Object):void{router.back({params:params??{}});}}6.2 子组件导航模式// 模式一回调给父组件推荐Componentstruct AppListItem{Propapp:AppBinding|nullnull;privateonItemClick?:(app:AppBinding)void;build(){Row(){Text(this.app?.app_name??)}.onClick((){if(this.onItemClickthis.app){this.onItemClick(this.app);}})}}// 父组件处理导航EntryComponentstruct AppListPage{build(){ForEach(this.apps,(app:AppBinding){AppListItem({app:app,onItemClick:(item:AppBinding){RouteUtil.push(AppDetailPage,{appId:item.id});},})})}}// 模式二子组件直接导航简单场景Componentstruct SimpleLink{privateurl:string;privateparams?:Recordstring,Object;build(){Text(查看详情).fontColor(#4F7CFF).onClick((){this.getUIContext().getRouter().pushUrl({url:this.url,params:this.params??{},});})}}小结要点import routergetUIContext.getRouter推荐场景模块导入静态 import实例方法获取工具类组件内导航直接使用this.getUIContext()子组件Builder 中直接使用需注意 this 上下文Builder统一封装容易封装不方便封装项目全局静态分析支持不支持开发体验HomePage 选型✅ 采用可选高频导航页面如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源openHarmony 跨平台社区https://openharmonycrossplatform.csdn.netHarmonyOS UI 上下文 API 文档https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-uicontext-0000001821000749HarmonyOS 路由 API 官方文档https://developer.huawei.com/consumer/cn/doc/harmonyos-references/router-0000001820880781

相关新闻

2026/7/17 5:29:55

紫光盘古50K开发板HDMI接口FPGA开发指南

1. 紫光盘古50K开发板与HDMI接口概述紫光同创盘古系列50K开发板是一款面向中高端FPGA应用的国产开发平台,采用核心板扩展板的设计架构。开发板搭载的PGL50H芯片属于紫光同创Logos系列FPGA,逻辑单元规模达50K,内置DDR3控制器和多组高速收发器&…

2026/7/17 5:29:55

鸿蒙应用开发实战【73】— 页面参数传递:params 对比 AppStorage

鸿蒙应用开发实战【73】— 页面参数传递:params 对比 AppStorage 本文是「号码助手全栈开发系列」第 73 篇,持续更新中… 开源社区:https://openharmonycrossplatform.csdn.net 前言 在号码助手项目中,页面间参数传递有两种主流…

2026/7/17 5:24:55

基于Boost.Asio构建C++通用异步任务调度器:线程池与定时任务实践

1. 项目概述与核心价值最近在重构一个老项目的后台服务,核心痛点在于大量混杂的I/O操作和定时任务把主线程卡得死死的,响应速度慢得像在爬。排查下来,发现之前的实现是“一个线程一把梭”——网络请求、数据库查询、日志写入、定时统计全挤在…

2026/7/17 6:44:59

AI与高德MCP打造智能旅行规划系统

1. 项目概述:AI与高德MCP的旅行规划革命去年帮朋友规划云南自驾游时,我花了整整三天时间查攻略、排路线、算时间,最后做出的行程表还是漏洞百出。这种痛苦经历促使我探索用技术解决旅行规划难题,直到发现高德MCP(Model…

2026/7/17 6:44:59

基于IBM TSS库的BLS门限签名实战:从分布式密钥生成到签名验证

1. 项目概述:为什么我们需要BLS门限签名? 如果你在分布式系统、区块链或者多方计算领域摸爬滚打过一阵子,肯定对“签名”这件事又爱又恨。爱的是,它是数字世界里身份和授权的基石;恨的是,传统的单点签名&am…

2026/7/17 6:44:59

FPGA开发板PWM模块设计与Verilog实现

1. 盘古1K开发板与PWM模块设计概述盘古1K开发板作为国产FPGA学习平台,凭借其高性价比和丰富的外设接口,已成为数字电路设计入门的首选工具之一。本次练习聚焦PWM(脉冲宽度调制)模块设计,这是嵌入式系统和电机控制领域的…

2026/7/17 6:44:59

第5章,[Win32 章节] :直线练习程序1

专栏导航 上一篇:第5章,[Win32 章节] :绘制直线(三) 回到目录 下一篇:第5章,[Win32 章节] :直线练习程序2 本节前言 对于本节所讲解的知识,有可能,你会需…

2026/7/17 6:44:59

C++函数化编程实战:学生成绩管理系统设计与算法实现

1. 项目概述与核心价值最近在带几个刚学完C基础语法的学弟学妹做项目,发现他们最头疼的就是不知道如何把书本上的零散知识点(比如数组、函数、结构体)串成一个能实际运行的程序。正好,一个经典的“学生成绩管理系统”需求摆在了面…

2026/7/17 6:39:58

Ubuntu下ChatGLM2-6B环境搭建与P-Tuning微调实战

1. 项目概述最近在Ubuntu系统上搭建ChatGLM2-6B环境并进行P-Tuning微调训练时,踩了不少坑。作为一个开源的中文大语言模型,ChatGLM2-6B在中文处理方面表现优异,但在实际部署和训练过程中会遇到各种问题。本文将详细记录从环境搭建到微调训练的…

2026/7/17 5:59:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/17 1:21:45

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/15 23:18:22

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/17 0:04:23

BiSheng JDK-build性能调优:构建速度提升30%的优化策略

BiSheng JDK-build性能调优:构建速度提升30%的优化策略 【免费下载链接】bishengjdk-build BiSheng JDK build and test scripts - common across all releases/versions 项目地址: https://gitcode.com/openeuler/bishengjdk-build 前往项目官网免费下载&am…

2026/7/16 13:58:36

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…