探索HarmonyOS:一键掌握Router与NavPathStatck的传参和页面回调技巧

路由的选择

HarmonyOS提供两种路由实现的方式,分别是 RouterNavPatchStack。两者使用场景和特效各有优劣。

组件 适用场景 特点 备注
Router 模块间与模块内页面切换 通过每个页面的url实现模块间解耦
NavPathStack 模块内页面切换 通过组件级路由统一路由管理
  • 什么时候使用 NavPatchStack ?

如果是单包应用开发,不使用动态包(hsp)进行拆包,只是使用静态包(har)简单的进行模块拆分,那么我推荐使用 navPatchStack

  • 什么时候使用 Router ?

如果像开发 鸿蒙元服务,对单包体积有 2M 的限制,那么我们不得不使用动态包的方式。将相对独立的功能,二级页面等拆分出去,封装成动态包,可避开 dependencies 直接依赖得引用形式。

此时使用 router 跳转 url 的方式才可跳转到动态包内非直接引用的页面

NavPatchStatck 如何跳转(传参)及页面回调

NavPathStack 是配合 Navigation 一起使用的,
Navigation导航组件做统一的页面跳转管理,它提供了一系列属性方法来设置页面的标题栏、工具栏以及菜单栏的各种展示样式。

如何跳转(传参)及实现页面回调?

//第一步:定义一个用于传参和实现页面回调的模型
export interface RouterModel {
   
   
  params?: Object, // 要传递给跳转页面的参数
  popCallback?: (value: Object | undefined) => void // 用于页面回调
}
//第二步,需要在应用的根页面自行维护 navStack 实例,并传递给根节点 Navigation
@Provide('navPathStack') navPathStack: NavPathStack = new NavPathStack()

Navigation(this.pageInfos) {
   
   
  Column() {
   
   }
}
.title('NavIndex')
.navDestination(this.PageMap)


// 统一管理维护路由跳转
@Builder
  PageMap(name: string, params: RouterModel) {
   
   
    if (name === 'pageOne') {
   
   
      TestNavPathPage({
   
    // TestNavPathPage 就是要跳转的目标页面
        routerParams: params
      })
    } else {
   
   
      // 默认空页面
    }
}
/// 任意一个页面获取 navPathStack 调用跳转并传参
@Component
export struct RouterCallbackExample {
   
   
  @Consume('navPathStack') navPathStack: NavPathStack;
 

  // NavPatchStack 方式跳转并获取回调
  navPathStackJump() {
   
   
    const routerParams: RouterModel = {
   
   
      params: '我是入参 123', //传递到跳转页面的入参
      popCallback: (callbackValue) => {
   
   
        // 这里拿到回调结果,注意要判断 callbackValue !== undefine
        // 这里拿到下面目标页面回传的结果 ‘我是回调的结果 345’
      }
    }
   this.navPathStack.pushPathByName('pageOne', routerParams) // 'pageOne' 对应上面 'PageMap' 方法内定义的路径名称常量
  }

  build() {
   
   
    Button('跳转').onClick(() => {
   
   
        this.navPathStackJump()
    })
  }
}
/// 目标页面接收入参、并返回页面回调
@Component
export struct TestNavPathPage {
   
   
  @Consume('navPathStack') navPathStack: NavPathStack;
  routerParams?: RouterModel
  @State receiveParams: string = ''

  aboutToAppear(): vo
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小轰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值