HarmonyOS7 页面间传参:@Param 与路由最佳实践

发布时间:2026/7/13 1:39:09

HarmonyOS7 页面间传参:@Param 与路由最佳实践 文章目录前言方式一组件内 Param 传值推荐V2代码实现方式二Navigation 路由参数跨页面核心代码回传数据Event 或 pop 带参完整示例最佳实践清单常见误区小白必踩完整可运行示例页面间传参代码解析写在最后前言页面跳转时几乎都要带数据点列表某项进详情得把该项 id传过去编辑页改完得把新值传回来。传参看着简单但新手常踩两个坑传过去取不到、改完回不去。这篇文章我把 HarmonyOS7 里两种主流传参方式组件Param、Navigation 路由参数的最佳实践讲透。方式一组件内 Param 传值推荐V2如果是组件嵌套或 Navigation 子页面用Param最规范。父/路由把数据作为构造参数传入子用Param接。代码实现ComponentV2struct UserCard{Paramuser:{id:number,name:string}{id:0,name:}build(){Column(){Text(姓名this.user.name)}}}// 使用UserCard user{{ id: 1, name: 张三 }} /Param是单向入参父/路由改了子自动更新。适合展示型传值把数据交给子组件渲染。方式二Navigation 路由参数跨页面通过NavPathStack.pushPath的param字段传任意对象核心代码// A 页面跳转并带参this.nav.pushPath({name:Detail,param:{id:this.itemId,from:list}})// B 页面Detail接收ComponentV2struct Detail{Consumer(nav)nav:NavPathStacknewNavPathStack()Localreceived:{id:number,from:string}{id:0,from:}aboutToAppear(){constpthis.nav.getParamByName(Detail)[0]this.receivedpas{id:number,from:string}}build(){NavDestination(){Text(收到 idthis.received.id)}}}要点param能传对象比老 router 的params: { xxx }字符串拼接清晰。目标页在aboutToAppear里用getParamByName取注意它是数组同名可能多个取[0]。回传数据Event 或 pop 带参子页改完要回传父页两种方式方式 AEvent 回调组件内——前面通信篇讲过子通过事件改父状态。方式 Bpop 带回结果跨页面完整示例// Detail 页返回时带结果this.nav.pop({result:{saved:true,newName:新名字}})// 调用方在 push 时监听this.nav.pushPath({name:Detail},(popInfo){constresultpopInfo.resultas{saved:boolean,newName:string}if(result.saved){this.nameresult.newName}})pop({ result })把结果带回pushPath的第二个回调能收到。这是编辑页回传的标准做法。最佳实践清单场景推荐方式父子组件传展示数据Param跨页面跳转入参pushPath({ param })跨页面回传结果pop({ result }) push 回调多页面共享数据Provider/Consumer反模式提醒别用全局单例/全局变量传参。临时能跑但数据流向乱了调试到哭。能用参数就传参能上Provider就上Provider。常见误区小白必踩误区说明用全局变量传参临时能跑但数据流向乱了调试到哭。能用参数就传参能上Provider就上Provider。回传不用pop({ result })跨页面回传结果用pop带参 push回调收比全局变量规范。把Param当可写Param只读子要改数据走Event或回传。下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲改一改文末「动手改一改」里的参数亲眼看看效果。完整可运行示例页面间传参通过NavPathStack在跳转时带参数下一页用Param接收。代码解析// 跳转时携带参数目标页用 Param 接收EntryComponentstruct ListPage{Providenav:NavPathStacknewNavPathStack()build(){Navigation(this.nav){List(){ForEach([1,2,3],(id:number){ListItem(){Text(商品 id)}.onClick((){this.nav.pushPath({name:Goods,param:{id:id}})// 带参跳转})})}}.title(商品列表)}}Componentstruct Goods{Consumenav:NavPathStackParamid:number0// 接收参数build(){NavDestination(){Text(正在查看商品 IDthis.id).fontSize(20)}.title(商品详情)}}你会看到什么点不同商品详情页显示的 ID 跟着变——参数随路由精准传递。动手改一改把param换成复杂对象{ id, name, price }详情页分字段展示。用this.nav.pop({ param: { result: ok } })回传结果给上一页。把Param id改成Local体验「无法从路由接收」的报错。写在最后传参的本质是数据怎么流动。HarmonyOS7 给了我们清晰的工具箱Param管组件内、pushPath/pop管跨页面、Provider管全局共享。选对工具数据流一目了然bug 自然少。建议你把项目里所有靠全局变量传参的地方改成上面的正规方式——前期麻烦一点后期定位问题能省十倍时间。

相关新闻