此文章内容兼容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

NavDest生命周期

方法生效时机描述
aboutToAppear创建自定义组件后,build执行之前,NavDestination创建之前允许在该方法中改变状态变量,更改将在后续执行build()函数中生效
onWillAppear创建NavDestination后,挂载到组件树之前在该方法中更改状态变量会在当前帧显示生效
onAppear挂载到组件树时
onWillShowNavDestination 组件显示之前执行,此时页面不可见
onShownNavDestination组件布局显示之后执行,此时页面已完成布局
onWillHideNavDestination组件触发隐藏之前执行
onHiddenNavDestination组件触发隐藏后执行非栈顶页面push进栈,栈顶页面pop出栈或应用切换到后台
onWillDisappearNavDestination组件即将销毁之前执行,如果有转场动画,会在动画前触发栈顶页面pop出栈
onDisappearNavDestination组件从组件树上卸载销毁时执行
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获取
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐