HarmonyOS鸿蒙Next Navigation系列四:Navigation页面信息查询
HarmonyOS鸿蒙Next Navigation系列四:Navigation页面信息查询
作为一个容器组件,开发者可以在NavDestination中增加自定义组件。在自定义组件内部,如果想获取路由信息,开发者可以使用接口queryNavigationInfo与queryNavDestinationInfo查询
1、queryNavigationInfo
开发者可以在Navigation内部的自定义组件中,通过queryNavigationInfo接口查询Navigation相关的路由信息,例如,在NavDestination组件中查询其所在的Navigation信息,以及对应的路由控制器:
// QueryNavDest.ets
@Component
struct QueryNavDestination {
name: string = 'NA'
stack: NavPathStack = new NavPathStack()
aboutToAppear(): void {
// 通过查询NavigationInfo,获取当前的NavPathStack实例
this.stack = this.queryNavigationInfo()?.pathStack!
// 通过查询NavigationInfo,获取当前所在Navigation的id信息,具体为开发者设置在Navigation上的通用属性`id`
let navigationId = this.queryNavigationInfo()?.navigationId
console.log('AceNavigation', 'query navigationInfo in QueryNavDestination, navigationId: ' + navigationId)
}
build() {
NavDestination() {
...
}
.title('QueryNavDestination')
}
}
2、queryNavDestinationInfo
与queryNavigationInfo相似,开发者可以通过queryNavDestinationInfo查询当前自定义组件所在的NavDestination信息。例如,在自定义组件NaviOperations中查询当前navDestination页面的name、param与mode。
关于返回值NavDestinationInfo的更多信息,请参见:自定义组件内置方法-自定义组件-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者 (huawei.com)
// QueryNavDest.ets
@Component
struct QueryNavDestination {
name: string = 'NA'
stack: NavPathStack = new NavPathStack()
build() {
NavDestination() {
// 将内容区封装至自定义组件NaviOperations()中
NaviOperations()
}
.title('QueryNavDestination')
}
}
@Component
struct NaviOperations {
stack: NavPathStack = new NavPathStack()
aboutToAppear(): void {
// 通过查询NavDestinationInfo,获取当前所在NavDestination的name。
let name = this.queryNavDestinationInfo()?.name
console.log('AceNavigation', 'query navDestination in NaviOperations, navDestination name: ' + name)
// 通过查询NavDestinationInfo,获取当前所在NavDestination的路由参数。开发者可以通过不同的自定义参数来控制页面展示不同的内容。
let param = this.queryNavDestinationInfo()?.param
// 注意!出于安全与隐私的考虑,路由参数不要明文输出!如下仅做示例
console.log('AceNavigation', 'query navDestination in NaviOperations, navDestination param: ' + JSON.stringify(param))
// 通过查询NavDestinationInfo,获取当前所在NavDestination的模式,0为标准页面,1为dialog类型页面,也就是透明的弹窗类型页面。
let navDestinationMode = this.queryNavDestinationInfo()?.mode
console.log('AceNavigation', 'query navDestination in NaviOperations, navDestination mode: ' + navDestinationMode)
}
build() {
Column() {...}
}
从API18开始,可以通过指定入参isInner来控制查找方向:当为false时,会查找当前自定义组件外部的第一个NavDestination的信息,与上文中的接口行为一致。当为true时,会查找当前自定义组件内部的第一个NavDestination的信息。例如,在navigation外增加按钮,随时查询当前自定义组件内部的第一个navDestination的信息:
// QueryNavigation.ets
@Component
struct QueryNavigation {
stack: NavPathStack = new NavPathStack()
aboutToAppear(): void {
this.stack.pushPath({name: 'queryPageOne'})
}
build() {
Column() {
Button('向内queryNavDestinationInfo')
.width(330)
.margin(7)
.onClick(() => {
// 通过查询NavDestinationInfo,获取当前自定义组件内部的第一个NavDestination的name。
let name = this.queryNavDestinationInfo(true)?.name
console.log('AceNavigation', 'query navDestination in QueryNavigation, navDestination name: ' + name)
// 通过查询NavDestinationInfo,获取当前自定义组件内部的第一个NavDestination的路由参数。开发者可以通过不同的自定义参数来控制页面展示不同的内容。
let param = this.queryNavDestinationInfo(true)?.param
// 注意!出于安全与隐私的考虑,路由参数不要明文输出!如下仅做示例
console.log('AceNavigation', 'query navDestination in QueryNavigation, navDestination param: ' + JSON.stringify(param))
// 通过查询NavDestinationInfo,获取当前自定义组件内部的第一个NavDestination的模式,0为标准页面,1为dialog类型页面,也就是透明的弹窗类型页面。
let navDestinationMode = this.queryNavDestinationInfo(true)?.mode
console.log('AceNavigation', 'query navDestination in QueryNavigation, navDestination mode: ' + navDestinationMode)
})
Navigation(this.stack) {
}
.id('QueryNavigation')
.hideNavBar(true)
}
}
}
查询接口方便开发者在分模块开发过程中,能方便的获取当前所处页面的信息,而无需关心自己被哪个页面集成。
更多关于HarmonyOS鸿蒙Next Navigation系列四:Navigation页面信息查询的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,Navigation页面信息查询可通过Navigation组件提供的API实现。使用router.getState()
获取当前路由栈信息,包含页面路径和参数。通过router.getLength()
查询栈内页面数量。页面参数传递使用router.pushUrl()
的params
属性,目标页面通过router.getParams()
获取。页面生命周期状态可通过@Entry
组件的aboutToAppear()
和aboutToDisappear()
回调监听。
更多关于HarmonyOS鸿蒙Next Navigation系列四:Navigation页面信息查询的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,queryNavigationInfo和queryNavDestinationInfo是两个非常实用的路由信息查询接口,可以帮助开发者在自定义组件中获取导航相关信息。
- queryNavigationInfo主要用于查询Navigation容器级别的信息:
- 可以获取当前Navigation的ID(navigationId)
- 可以获取路由堆栈实例(pathStack)
- 通常在NavDestination组件中使用,适合需要操作整个导航栈的场景
- queryNavDestinationInfo则用于查询当前NavDestination的信息:
- 可以获取页面名称(name)
- 可以获取路由参数(param)
- 可以获取页面模式(mode),0为标准页面,1为对话框页面
- 从API18开始支持isInner参数,可以控制查询方向(内部/外部)
使用时需要注意:
- 路由参数包含敏感信息,不要直接输出到日志
- 合理使用isInner参数可以更精确地控制查询范围
- 这些接口特别适合模块化开发,组件无需关心被哪个页面集成就能获取所需信息
示例代码展示了典型的使用场景,开发者可以根据实际需求调整查询逻辑。