Router 和 navigation

navigation有页面布局能力,路由导航能力,页面转场能力,挎包动态路由的能力.
总体选择
● 两者均可使用,取决于需求,Router只是不演进但仍可继续使用。
● Navigation与Router的对比,应根据实际开发情况选择。
易用性层面
● Navigation:天然具备标题、内容、回退按钮的功能联动,开发者可直接使用。
● Router:若要实现此功能,需要自行定义。
● Navigation:页面由组件构成,易于实现共享元素的转场。
功能层面
● Navigation:天然支持一对多,Router不支持。
● Navigation:没有路由数量限制,Router限制32个。
● Navigation:可以获取到路由栈(NavPathStack),并对路由栈进行操作。
● Navigation:可以嵌套在模态对话框中(可在模态框中定义路由),Router不支持。
● Navigation:组件全量由开发者自行控制,开发者可以自定义复杂的动效和属性的设置(背景、模糊等);Router的page对象不对外暴露,开发者无法对page进行处理。
性能层面
● Navigation:传递参数性能更优,通过引用传递。
● Router:传参是通过深拷贝完成的。
● Navigation:可以配合动态加载,实现组件动态加载。
● Router:页面使用 @Entry 进行修饰,当前模块加载时会生成全量页面。

从router迁移到navigation

  1. 改页面结构:主页面用 Navigation,子页面用 NavDestination
  2. 换跳转方式:pushPathByName 替代 pushUrl
  3. 配路由表:route_map.json 必须配置
  4. 改生命周期:使用 onAppear 等新事件

系统路由表的配置

从API version 12开始,Navigation支持使用系统路由表的方式进行动态路由。各业务模块(HSP/HAR)中需要独立配置route_map.json文件,在触发路由跳转时,应用只需要通过NavPathStack提供的路由方法,传入需要路由的页面配置名称,此时系统会自动完成路由模块的动态加载、页面组件构建,并完成路由跳转,从而实现了开发层面的模块解耦。系统路由表不支持预览器,跨平台及模拟器。其主要步骤如下:
1.在跳转目标模块的配置文件module.json5添加路由表配置:
2.添加完路由配置文件地址后,需要在工程resources/base/profile中创建route_map.json文件。添加如下配置信息:
3.在跳转目标页面中,需要配置入口Builder函数,函数名称需要和route_map.json配置文件中的buildFunction保持一致,否则在编译时会报错。
4.通过pushPathByName等路由接口进行页面跳转。(注意:此时Navigation中可以不用配置navDestination属性)。

页面栈NavPathStack

Navigation路由相关的操作都是基于页面栈NavPathStack提供的方法进行,每个Navigation都需要创建并传入一个NavPathStack对象,用于管理页面。主要涉及页面跳转、页面返回、页面替换、页面删除、参数获取、路由拦截等功能。

NavDestination的生命周期

Navigation作为路由容器,其生命周期承载在NavDestination组件上,以组件事件的形式开放。
其生命周期大致可分为三类,自定义组件生命周期、通用组件生命周期和自有生命周期。其中,aboutToAppear和aboutToDisappear是自定义组件的生命周期(NavDestination外层包含的自定义组件),OnAppear和OnDisappear是组件的通用生命周期。剩下的六个生命周期为NavDestination独有。

● aboutToAppear:在创建自定义组件后,执行其build()函数之前执行(NavDestination创建之前),允许在该方法中改变状态变量,更改将在后续执行build()函数中生效。
● onWillAppear:NavDestination创建后,挂载到组件树之前执行,在该方法中更改状态变量会在当前帧显示生效。
● onAppear:通用生命周期事件,NavDestination组件挂载到组件树时执行。
● onWillShow:NavDestination组件布局显示之前执行,此时页面不可见(应用切换到前台不会触发)。
● onShown:NavDestination组件布局显示之后执行,此时页面已完成布局。
● onWillHide:NavDestination组件触发隐藏之前执行(应用切换到后台不会触发)。
● onHidden:NavDestination组件触发隐藏后执行(非栈顶页面push进栈,栈顶页面pop出栈或应用切换到后台)。
● onWillDisappear:NavDestination组件即将销毁之前执行,如果有转场动画,会在动画前触发(栈顶页面pop出栈)。
● onDisappear:通用生命周期事件,NavDestination组件从组件树上卸载销毁时执行。
● aboutToDisappear:自定义组件析构销毁之前执行,不允许在该方法中改变状态变量。

Logo

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

更多推荐