HarmonyOS实战开发之HMRouter实现跳转

news/2024/12/27 6:41:48/

程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java相关开发、鸿蒙开发、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴!君志所向,一往无前!


0.前言

不知道大家在日常进行Harmony OS 的App开发的时候,对于页面跳转使用的都咋样,官方是提供了2种方式,分别是组件导航(Navigation)和页面路由(@ohos.router)

两者都是支持应用内的页面跳转,但组件导航支持在组件内部进行跳转,使用更灵活。组件导航具备更强的一次开发多端部署能力,可以进行更加灵活的页面栈操作,同时支持更丰富的动效和生命周期。

因此,推荐使用组件导航(Navigation)来实现页面跳转以及组件内的跳转,以获得更佳的使用体验。

但是我发现在使用组件导航的时候,的确有点麻烦,特别对于普通的项目而言,的确不是很好用,所以又找到了:HMRouter

1.HMRouter是什么呢

HMRouter是HarmonyOS上页面跳转的场景解决方案,主要解决应用内原生页面间相互跳转的问题。

HMRouter路由框架的功能特性,如下所示:

  1. 使用自定义注解实现路由跳转

  2. 支持HAR/HSP

  3. 支持路由拦截、路由生命周期

  4. 简化自定义动画配置:配置全局动画,单独指定某个页面的切换动画

  5. 支持不同的页面类型:单例页面、Dialog页面

当然了HMRouter主要可以实现以下功能:

1.实现页面跳转,主要包括:页面跳转与返回、多次页面跳转,返回指定页面、应用未登录,点击跳转登录页的校验、实现单例页面的跳转等效果。

2.弹窗提示,主要包括:实现弹窗类型的页面、返回时弹窗,提示用户是否确认返回、返回时弹窗,提示用户是否确认返回等功能的实现。

3.转场动效,主要包括:全局自定义转场动效、特定页面设置自定义转场、根据条件呈现不同转场动效、交互式转场等。

4.数据加载,主要是以下几点:数据请求预加载,与页面跳转并行化、页面重开数据恢复等。

5.维测场景,主要包括:页面埋点开发的实现。

2.HMRouter使用步骤

2.1 下载依赖

打开终端,执行下面的命令,进行下载:

ohpm install @hadss/hmrouter

2.2 配置路由编译插件

在项目的 hvigor/hvigor-config.json 文件中添加依赖 @hadss/hmrouter-plugin 内容如下所示:

 "dependencies": {"@hadss/hmrouter-plugin": "^1.0.0-rc.10"},

ps:版本号请看上一步显示的版本号哈,一致哟!

2.3 在模块中引入路由编译插件

修改hvigorfile.ts

内容如下所示:

import { hapTasks } from '@ohos/hvigor-ohos-plugin';
import { hapPlugin } from '@hadss/hmrouter-plugin'; //引入HMRouter的插件
export default {system: hapTasks, plugins:[hapPlugin()]   //配置插件
}

ps:注意如果项目使用的hap就用 hapPlugin,那么如果使用的 har就需要使用 harPlugin插件,你记住了吗?

2.4 HMRouter实现跳转

接下来就可以开开心心的使用HMRouter进行页面的跳转啦。那么详细的步骤如下所示:

0.准备2个页面,分别是Test1和Test2

1.在EntryAbility中实现初始化

一般都是在onCreate中实现初始化

具体代码如下所示:

import { HMRouterMgr } from '@hadss/hmrouter'; //导入export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);//HMRouter的初始化HMRouterMgr.init({context: this.context})hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');}……}

2.在首页中定义入口 首页是Index页面,实现如下的配置,主要是四步:

第一步:导入

第二步:自定义导航属性

第三步:实现HMNavigation容器配置

第四步:实现页面跳转

完整代码如下所示:

//1.导入
import { HMDefaultGlobalAnimator,HMNavigation,HMRouterMgr  } from '@hadss/hmrouter';
import { AttributeUpdater } from '@kit.ArkUI'
import { hilog } from '@kit.PerformanceAnalysisKit';@Entry
@Component
struct Index {@State message: string = '程序员Feri,首页';//导航modifier: NavModifier = new NavModifier();build() {Column(){// 3.实现HMNavigation容器配置HMNavigation({navigationId: 'main', options: {standardAnimator: HMDefaultGlobalAnimator.STANDARD_ANIMATOR,dialogAnimator: HMDefaultGlobalAnimator.DIALOG_ANIMATOR,modifier: this.modifier}}){Column() {Text(this.message).fontSize(30).fontWeight(FontWeight.Bold).margin(20)//4.页面跳转Button("跳转测试页面").onClick(()=>{hilog.info(1000,"rmr","点击跳转了")HMRouterMgr.push({navigationId:"main",pageUrl:"test1"})})}}}}
}/* 2.实现自定义导航属性*/
class NavModifier extends AttributeUpdater<NavigationAttribute> {initializeModifier(instance: NavigationAttribute): void {instance.mode(NavigationMode.Stack);instance.navBarWidth('100%');instance.hideTitleBar(true);instance.hideToolBar(true);}
}

3.页面中导入

在Index和Test1和Test2页面中分别导入

import { HMRouter,HMRouterMgr } from '@hadss/hmrouter'; //导入

4.页面中声明路径

为需要跳转的页面添加@HMRouter注解,并配置其中的pageUrl参数 在Test1和Test2都需要完成声明

@HMRouter({ pageUrl: 'test1' }) //定义本页路径

5.实现跳转

 Button("跳转第二个页面").onClick(()=>{HMRouterMgr.push({pageUrl: "test2"})}).margin(20)

6.效果展示

首页:

第一个页面:


第二个页面:

点击跳转,可以看到第二个页面:

第一个页面的完整代码如下所示:

import { HMRouter,HMRouterMgr  } from '@hadss/hmrouter'; //导入@HMRouter({ pageUrl: 'test1' }) //定义本页路径
@Entry
@Component
export struct Test1{build() {Column(){Text("程序员Feri,第一个页面").margin(10)Button("回到上一页").onClick(()=>{//回到上一页HMRouterMgr.pop({navigationId:"main"})}).margin(10)Button("跳转第二个页面").onClick(()=>{HMRouterMgr.push({pageUrl: "test2"})}).margin(20)}}
}

第二个页面的完整代码如下所示:

import { HMRouter,HMRouterMgr  } from '@hadss/hmrouter'; //导入@HMRouter({ pageUrl: 'test2' }) //定义本页路径
@Entry
@Component
export struct Test2{build() {Column(){Text("程序员Feri,第二个页面").margin(10)Button("跳转到第一个页面").onClick(()=>{//跳转HMRouterMgr.push({pageUrl: "test1"})//回到上一页// HMRouterMgr.pop({navigationId:"main"})}).margin(20)}}
}

2.5 HMRouter页面跳转的方式

HMRouter实现页面跳转有3种方式,分别如下所示:

push :目标页面不会替换当前页,而是插入页面栈。可以使用pop实现页面的返回操作

replace:目标页面会替换当前页,并销毁当前页。这样可以释放当前页的资源,并且无法返回到当前页

pop:返回页面栈的上一个页面,skipedLayerNumber页面返回的层级数量,默认为0,表示返回上一级,1表示跳过一级页面返回

好了,本篇就到这里啦,希望能对你有所帮助,关注我,带你起飞鸿蒙开发!


http://www.ppmy.cn/news/1558459.html

相关文章

C# 读取多种CAN报文文件转换成统一格式数据,工具类:CanMsgRead

因为经常有读取CAN报文trace文件的需求&#xff0c;而且因为CAN卡不同、记录软件不同会导致CAN报文trace文件的格式都有差异。为了方便自己后续开发&#xff0c;我写了一个CanMsgRead工具类&#xff0c;只要提供CAN报文路径和CAN报文格式的选项即可将文件迅速读取转换为统一的C…

获取XML 属性值

<controlActProcess classCode"CACT" moodCode"EVN"><queryByParameter><statusCode code"new"/><queryByParameterPayload><statusCode code"new"/><actId><value><!--申请单编号-->…

使用GeoPandas进行地理空间数据处理:入门指南

使用GeoPandas进行地理空间数据处理&#xff1a;入门指南 什么是GeoPandas&#xff1f; GeoPandas 是一个基于 Pandas 和 Shapely 的 Python 库&#xff0c;专为地理空间数据处理设计。它扩展了 Pandas 的功能&#xff0c;使用户可以轻松处理地理数据&#xff0c;如矢量数据&…

动态顺序表详解+代码示例

系列文章目录 &#x1f388; &#x1f388; 我的CSDN主页:OTWOL的主页&#xff0c;欢迎&#xff01;&#xff01;&#xff01;&#x1f44b;&#x1f3fc;&#x1f44b;&#x1f3fc; &#x1f389;&#x1f389;我的C语言初阶合集&#xff1a;C语言初阶合集&#xff0c;希望能…

3.基于 Temporal 的 Couchbase 动态 SQL 执行场景

在使用 Temporal 和 Go 语言 调用 Couchbase 执行 SQL 脚本时&#xff0c;可以通过动态参数传递到 SQL 脚本中&#xff0c;以下是完整实现的指南&#xff1a; 1. Temporal Workflow 的参数传递 Temporal 的 Workflow 支持接收动态参数&#xff0c;将这些参数传递给执行 SQL 的…

路径规划之启发式算法之二十四:爬山算法(Hill Climbing Algorithm,HCA)

爬山算法(Hill Climbing Algorithm)是一种启发式的基于局部最优解的搜索算法,用于在给定的搜索空间中寻找全局最优解或足够好的解。它属于局部搜索算法,通常用于解决优化问题,包括连续和离散问题。 一、定义与原理 爬山算法模拟了爬山的过程,从某个随机起始点开始,不断向…

Linux 下的 GPT 和 MBR 分区表详解

在Linux系统中&#xff0c;分区表是描述存储设备上分区布局和属性的一种结构化数据。常见的分区表格式有MBR&#xff08;Master Boot Record&#xff09;和GPT&#xff08;GUID Partition Table&#xff09;。以下是这两种分区表的详解&#xff1a; MBR&#xff08;Master Boot…

SpringBoot3-第四篇(基础特性)

系列文章目录 SpringBoot3-第一篇&#xff08;快速入门&#xff09; SpringBoot3-第二篇&#xff08;Web开发&#xff09; SpringBoot3-第三篇&#xff08;数据访问&#xff09; SpringBoot3-第四篇&#xff08;基础特性&#xff09; 文章目录 系列文章目录1. SpringApplicati…