此文章内容兼容API12,使用harmony next应用开发
官方推荐使用 Navigation 替换Router,实现模块内外路由跳转
简述
简单模板使用
Navigation + NavPathStack + NavDestination + route_map.json
模块内
1,编写 NavigationPage 和 NavigationSonPage 页
@Entry
@Component
struct NavigationPage {
build() {
Navigation(NavTools.getInstance().getPageInfos()) {
Button('Jump')
.onClick(() => {
NavTools.getInstance().getPageInfos().pushPathByName("PageNext", 3)
})
}
.width('100%')
.height('100%')
.mode(NavigationMode.Stack)
}
}
------------------------------------------------------------------------------
@Builder
export function NavigationSonPageBuilder(name: string, p: Object) {
NavigationSonPage({params:p})
}
@Component
struct NavigationSonPage {
@State params: object | undefined = undefined
build() {
NavDestination() {
Column(){
Text("HAHA && " + this.params)
Button('BACK').margin(16).onClick(() => {
NavTools.getInstance().getPageInfos().pop()
})
}
}
}
}
2,页面管理类
export default class NavTools {
private static instance: NavTools;
private pageInfos: NavPathStack = new NavPathStack()
private constructor() {
}
public static getInstance(): NavTools {
if (!NavTools.instance) {
NavTools.instance = new NavTools();
}
return NavTools.instance;
}
getPageInfos() : NavPathStack{
return this.pageInfos
}
}
3,在resources/base/profile中创建route_map.json文件并添加如下配置信息
{
"routerMap": [
{
"name": "PageNext",
"pageSourceFile": "src/main/ets/pages/NavigationSonPage.ets",
"buildFunction": "NavigationSonPageBuilder",
"data": {
"description" : "this is NavigationSonPage"
}
}
]
}
4,在模块下的module.json5配置文件,module标签中定义
"routerMap": "$profile:route_map",
跨模块
和模块内一致,注意NavPathStack一定是同一个。 页面管理类 最好放在 support 下
详解
Navigation
Navigation 一般作为 @Entry 的根容器,便于控制页面路由切换 和 页面适配
1,模式
- NavigationMode.Auto : 自适应模式,默认,页面宽度大于等于一定阈值时,Navigation组件采用分栏模式,反之采用单栏模式
- NavigationMode.Stack:单栏模式
- NavigationMode.Split :分栏模式
NavPathStack
每个 Navigation 都对应一个 NavPathStack, 使用 NavPathStack 提供的方法,进行路由管理,包括:页面跳转、页面返回、页面替换、页面删除、参数获取、路由拦截等功能
1,页面跳转:
普通跳转、
this.pageStack.pushPathByName("PageOne", "With Param")
带返回回调跳转,当页面出栈时返回信息
this.pageStack.pushPathByName('PageOne', "With Param", (popInfo) => {
console.log('Pop page name is: ' + popInfo.info.name + ', result: ' + JSON.stringify(popInfo.result))
});
带错误码的跳转
this.pageStack.pushDestinationByName('PageOne', "PageOne Param")
.catch((error: BusinessError) => {}).then(() => {});
2,页面返回
// 返回到上一页
this.pageStack.pop()
// 返回到上一个PageOne页面
this.pageStack.popToName("PageOne")
// 返回到索引为1的页面
this.pageStack.popToIndex(1)
// 返回到根首页(清除栈中所有页面)
this.pageStack.clear()
3,页面替换
// 将栈顶页面替换为PageOne
this.pageStack.replacePath({ name: "PageOne", param: "PageOne Param" })
this.pageStack.replacePathByName("PageOne", "PageOne Param")
4,页面删除
// 删除栈中name为PageOne的所有页面
this.pageStack.removeByName("PageOne")
// 删除指定索引的页面
this.pageStack.removeByIndexes([1,3,5])
5,其他方法
// 获取栈中所有页面name集合
this.pageStack.getAllPathName()
// 获取索引为1的页面参数
this.pageStack.getParamByIndex(1)
// 获取PageOne页面的参数
this.pageStack.getParamByName("PageOne")
// 获取PageOne页面的索引集合
this.pageStack.getIndexByName("PageOne")
6,路由拦截
可使用 setInterception 方法,设置 Navigation 页面跳转的拦截回调,实现路由重定向
方法 | 生效时机 | 描述 |
---|---|---|
willshow | 页面跳转前回调 | 允许操作栈,在当前跳转生效。 |
didShow | 页面跳转后回调 | 在该回调中操作栈会在下一次跳转生效。 |
modeChange | 页面跳转前回调 | Navigation单双栏显示状态发生变更时触发该回调 |
NavDestination
NavDestination 是 Navigation 子页面的根容器。 可以设置独立的标题栏、菜单栏。
1,类型
- NavDestinationMode.STANDARD:默认类型
- NavDestinationMode.DIALOG:弹窗类型
2,生命周期
自定义组件生命周期: aboutToAppear和aboutToDisappear
通用生命周期:OnAppear和OnDisappear
NavDestination特有生命周期:onWillAppear onWillShow onShown onWillHide onHidden onWillDisappear
方法 | 生效时机 | 描述 |
---|---|---|
aboutToAppear | 创建自定义组件后,build执行之前,NavDestination创建之前 | 允许在该方法中改变状态变量,更改将在后续执行build()函数中生效 |
onWillAppear | 创建NavDestination后,挂载到组件树之前 | 在该方法中更改状态变量会在当前帧显示生效 |
onAppear | 挂载到组件树时 | -- |
onWillShow | NavDestination 组件显示之前执行,此时页面不可见 | -- |
onShown | NavDestination组件布局显示之后执行,此时页面已完成布局 | -- |
onWillHide | NavDestination组件触发隐藏之前执行 | -- |
onHidden | NavDestination组件触发隐藏后执行 | 非栈顶页面push进栈,栈顶页面pop出栈或应用切换到后台 |
onWillDisappear | NavDestination组件即将销毁之前执行,如果有转场动画,会在动画前触发 | 栈顶页面pop出栈 |
onDisappear | NavDestination组件从组件树上卸载销毁时执行 | -- |
aboutToDisappear | 自定义组件析构销毁之前执行 | 不允许在该方法中改变状态变量 |
动态路由
1,静态路由:通过import方式,进行页面跳转
动态路由:解决多个模块间复用业务逻辑
2,系统路由表
各模块(HSP/HAR)中独立配置route_map.json文件,只需要通过NavPathStack提供的路由方法,传入需要路由的页面配置名称,此时系统会自动完成路由跳转
3,route_map.json
配置信息:
{
"routerMap": [
{
"name": "PageNext",
"pageSourceFile": "src/main/ets/pages/NavigationSonPage.ets",
"buildFunction": "NavigationSonPageBuilder",
"data": {
"description" : "this is NavigationSonPage"
}
}
]
}
配置项 | 说明 |
---|---|
name | 跳转页面名称 |
pageSourceFile | 跳转目标页在包内的路径,相对src目录的相对路径。 |
buildFunction | 跳转目标页的入口函数名称,必须以@Builder修饰。 |
data | 应用自定义字段。可以通过配置项读取接口getConfigInRouteMap获取 |