鸿蒙5.0开发常见问题【如何在Navigation跳转页面时返回传参?】

参数类不支持传递如map等JS对象。

interface paramType {
  param: string
}


let paramA: paramType = {
  param: 'test1'
}


@Entry
@Component
struct Index {
  @Provide('pathInfos') pathInfos: NavPathStack = new NavPathStack();


  @Builder
  myRouter(name: string) {
    if (name === 'MyFirstNavDestination') {
      MyFirstNavDestination()
    } else if (name === 'MySecondNavDestination') {
      MySecondNavDestination()
    }
  }


  build() {
    Navigation(this.pathInfos) {
      Row() {
        Column() {
          Text('hello world')
        }
        .height('100%')
      }
      .onClick(() => {
        this.pathInfos.pushPathByName('MyFirstNavDestination', paramA);
      })
    }
    .navDestination(this.myRouter)
  }
}


@Component
export struct MyFirstNavDestination {
  @Consume('pathInfos') pathInfos: NavPathStack;


  getParamsPrint() {
    console.info('xuerui', 'param is ' + JSON.stringify(this.pathInfos.getParamByName('MyFirstNavDestination')));
  }


  build() {
    NavDestination() {
      Row() {
        Column() {
          Text('MyFirstNavDestination')
        }
        .width('100%')
      }
      .height('100%')
      .onClick(() => {
        this.pathInfos.pushPathByName('MySecondNavDestination', null);
      })
    }.onShown(() => {
      this.getParamsPrint();
    })
  }
}


@Component
export struct MySecondNavDestination {
  @Consume('pathInfos') pathInfos: NavPathStack;
  private routerParams: paramType = { param: 'test 2' };


  build() {
    NavDestination() {
      Row() {
        Text('MySecondNavDestination')
      }
      .height('100%')
    }.onBackPressed(() => {
      // Pop B page
      this.pathInfos.pop();


      //Get the name of the current stack top page (page A)
      let allPathName: Array<string> = this.pathInfos.getAllPathName();
      let pathNameA: string = allPathName[allPathName.length - 1];


      // Pop A page
      this.pathInfos.pop();


      // PUSH A page again
      this.pathInfos.pushPath(new NavPathInfo(pathNameA, this.routerParams))
      return true;
    })
  }
}
<think>好的,我现在要解决用户在鸿蒙系统中使用Navigation进行路由跳转如何获取传递参数的问题。首先,我需要回忆一下鸿蒙系统的相关文档和之前看过的资料。用户提到了两种跳转方法,一种是使用router_map.json文件,另一种是使用@Builder函数管理页面。我需要分别分析这两种方法下参数的传递和获取方式。 首先,对于第一种方法,即通过router_map.json配置路由的情况。根据引用[1]中的描述,pushDestination方法用于跳转。假设在跳转,可以通过params参数传递数据,例如在调用pushDestination添加params对象。接下来,目标页面如何接收这些参数呢?可能需要通过页面初始化的生命周期方法,比如aboutToAppear,或者通过路由模块提供的接口来获取参数。这里需要确认具体的API,比如是否有一个全局的路由管理器或页面上下文可以获取传递的参数。 然后是第二种方法,使用@Builder函数管理页面,引用[2]中的例子展示了如何根据名称加载不同页面。在这种情况下,参数可能需要在跳转作为参数传递给目标页面的构造函数或初始化方法。例如,在调用pushDestination,不仅传递页面名称,还需要传递参数对象,然后在@Builder函数中根据名称创建页面实例,将参数传递给对应的页面组件。目标页面需要在其构造函数或初始化方法中接收这些参数,并保存到组件的状态中,以便后续使用。 接下来,我需要验证这些思路是否正确。查阅鸿蒙的官方文档,看看Navigation组件的参数传递方式。假设在第一种方法中,传递参数是通过在跳转添加params,而目标页面通过router模块的getParams方法获取。例如,在目标页面的aboutToAppear生命周期中,使用router.getParams()来获取传递的参数对象。这类似于其他框架中的路由参数获取方式。 对于第二种方法,由于@Builder函数直接创建页面实例,可能需要显式地将参数传递给页面组件。例如,在跳转,参数作为对象传递,然后在@Builder函数中,根据页面名称将参数传递给对应的页面。比如,pushDestination({ name: 'pageMap_ViewOne', params: { id: 123 } }),然后在@Builder函数中,当name是'pageMap_ViewOne',调用pageMap_ViewOne并传入params。这样,目标页面需要在构造函数或初始化接收这些参数,并存储在组件的状态变量中。 另外,需要注意参数的类型和校验,确保传递的参数能够被正确解析。可能还需要处理参数不存在的情况,避免应用崩溃。例如,在目标页面中使用可选链操作符或默认值来处理可能的undefined值。 总结来说,两种方法的参数传递和获取方式有所不同,但核心都是通过跳转传递params对象,然后在目标页面中通过相应的方法或构造函数参数来获取。需要根据具体的路由配置方式选择合适的获取方式,并确保参数的正确传递和接收。</think>在鸿蒙系统中,使用Navigation进行路由跳转获取参数的实现方式根据路由配置方法有所不同,具体分为以下两种情况: --- ### 一、基于router_map.json配置路由 1. **参数传递** 使用`pushDestination`跳转通过`params`字段传递参数: ```typescript router.pushUrl({ url: 'pages/DetailPage', params: { itemId: 123 } //传递参数 }) ``` 2. **参数获取** 在目标页面通过`router.getParams`方法获取参数: ```typescript import router from '@ohos.router'; @Component struct DetailPage { private itemId: number = 0; aboutToAppear() { const params = router.getParams(); //获取参数 if (params && params['itemId']) { this.itemId = params['itemId']; } } } ``` --- ### 二、基于@Builder动态路由 1. **参数传递** 跳转通过`params`属性传递参数: ```typescript navPathStack.pushPath( { name: 'pageMap_ViewOne', params: { userId: 'abc' } }, //传递参数 NavigationMode.Stack ) ``` 2. **参数获取** 在@Builder函数中显式传递参数给子组件: ```typescript @Builder pageMap(name: string, params?: object) { if (name === 'pageMap_ViewOne') { pageMap_ViewOne(params) //将参数传递给子组件 } } // 子组件通过构造函数接收参数 @Component struct pageMap_ViewOne { private userId: string = ''; constructor(params?: object) { if (params && params['userId']) { this.userId = params['userId']; } } } ``` --- ### 关键区别对比 | 方法 | 参数传递位置 | 参数获取方式 | 适用场景 | |--------------------|---------------------|------------------------------|----------------| | router_map.json | 路由跳转API的params字段 | 通过router.getParams()获取 | 静态路由配置 | | @Builder动态路由 | pushPath参数对象 | 通过构造函数或@Prop接收 | 动态路由管理 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值