HarmonyOS 鸿蒙Next中外部组件如何做页面跳转
HarmonyOS 鸿蒙Next中外部组件如何做页面跳转
项目结构:
- 父组件 Layout 是在路由栈中的page,定义了NavDestionation.
- 子组件 Mine 是写在外部文件中的,通过引入方式调用。
问题:
如何在子组件中实现页面的跳转? (this.pathInfos.pushPathByName()
并不执行。)
代码截图:
父组件 Layout/Index.ets
子组件 Mine.ets
更多关于HarmonyOS 鸿蒙Next中外部组件如何做页面跳转的实战教程也可以访问 https://www.itying.com/category-93-b0.html
方法1:可以在子组件中使用如下方法,获取父组件的NavPathStack;方法2:也可以在子组件中写一个回调,通过回调将点击事件传回父组件页面,从而实现页面跳转;方法3:使用@Provider()和@Consumer()装饰的参数监听该参数变化,根据@Monitor(‘参数名’)监听参数变化进行页面跳转
- pathStack: NavPathStack = new NavPathStack();
- aboutToAppear() {
- // this指代PageOne自定义节点,并从该节点向上查找其最近的一个类型为Navigation的父亲节点
- let navigationInfo: uiObserver.NavigationInfo | undefined = this.queryNavigationInfo();
- console.log('get navigationInfo: ’ + JSON.stringify(navigationInfo));
- if (navigationInfo !== undefined) {
- this.pathStack = navigationInfo.pathStack;
- }
- }
更多关于HarmonyOS 鸿蒙Next中外部组件如何做页面跳转的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
通过@Link
装饰器实现父子组件间路由控制器的传递:
@Component
struct Layout {
@State pathInfos: NavPathStack = new NavPathStack()
build() {
Navigation(this.pathInfos) {
// 传递路由控制器给子组件
Mine({ pathController: this.pathInfos })
}
}
}
// 子组件 Mine.ets
@Component
struct Mine {
@Link pathController: NavPathStack
build() {
Button('跳转详情页')
.onClick(() => {
// 通过接收到的控制器操作路由
this.pathController.pushPathByName('DetailPage')
})
}
}
已解决,
解决思路就是必须使用父组件定义的路由栈实例 new NavPathStack()
跳转。
方法其实有很多,我是使用@Provider @Consumer
跨组件传参的方式,把父组件路由实例传入到子组件。
为什么不能在子组件中引入路由栈对象来执行跳转呢???还非得父组件路由才行。也太麻烦了。
方法如图:
在HarmonyOS Next中,外部组件实现页面跳转需使用router
模块。步骤如下:
- 在
module.json5
中配置目标页面的路由信息:
"pages": {
"MainPage": "pages/MainPage",
"DetailPage": "pages/DetailPage"
}
- 在组件中调用路由API:
import router from '@ohos.router';
router.pushUrl({
url: 'pages/DetailPage'
});
若需参数传递,可在跳转时添加params:
router.pushUrl({
url: 'pages/DetailPage',
params: {id: 123}
});
在HarmonyOS Next中,外部组件实现页面跳转的正确方式是使用路由管理器Router。根据您的代码结构,建议在子组件Mine.ets中这样实现:
- 首先确保在子组件中导入router模块:
import router from '@ohos.router'
- 修改跳转方法为:
router.pushUrl({
url: 'pages/Setting'
})
- 在父组件Layout中,确保已正确配置路由:
// 在aboutToAppear或onPageShow中注册路由
router.addRoute({
name: 'Setting',
path: 'pages/Setting'
})
关键点说明:
- 直接使用router模块而非pathInfos
- 确保目标页面路径配置正确
- 跳转前确认路由已注册
这种实现方式更符合HarmonyOS Next的路由规范,能确保跨组件跳转的可靠性。