HarmonyOS应用开发:三方库HMRouter的研究和使用

打印 上一主题 下一主题

主题 867|帖子 867|积分 2601

前言

在现代软件开发中,模块化、组件化的架构计划越来越受到重视。随着应用程序的复杂度增加,路由管理成为了应用架构中的一个关键组成部分。它不但决定了应用内部页面之间的导航逻辑,还影响到应用的性能、可维护性和用户体验。为了更好地管理和优化路由逻辑,许多开发者会选择使用第三方库来辅助实现。HMRouter作为此中的一个选择,旨在为开发者提供一种高效、灵活且易于使用的路由管明白决方案。
关于HMRouter

HMRouter作为HarmonyOS的页面跳转场景解决方案,聚焦应用内原生页面的跳转逻辑。 HMRouter底层对系统Navigation进行封装,集成了Navigation、NavDestination、NavPathStack的系统能力,提供了可复用的路由拦截、页面生命周期、自定义转场动画,并且在传参、额外的生命周期、服务型路由方面临系统能力进行了扩展。 帮助开发者更好的进行模块间解耦。
HMRouter的重要功能及使用案例

一、安装配置

库地址:[HMRouter](https://gitee.com/hadss/hmrouter)
首先,要在项目中使用HMRouter,你必要根据项目安装相应的版本。
1、选择Terminal,使用ohpm安装
  1. ohpm install @hadss/hmrouter
复制代码

 
2、插件配置,hvigor文件夹下的hvigor-config.json5下添加依靠
  1.  "dependencies": {
  2.     "@hadss/hmrouter-plugin":"^1.0.0-rc.10"
  3.   }
复制代码

3、模块目录下hvigorfile.ts

 
  1. import { hapTasks } from '@ohos/hvigor-ohos-plugin';
  2. import { hapPlugin } from '@hadss/hmrouter-plugin';
  3. export default {
  4.     system: hapTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */
  5.     plugins:[hapPlugin()]         /* Custom plugin to extend the functionality of Hvigor. */
  6. }
复制代码

4、设置扫描路径,在根目录下,创建hmrouter_config.json文件,对应目录下创建components文件夹。
  1. {
  2.   "scanDir": ["src/main/ets/components", "src/main/ets/interceptors"],
  3.   "saveGeneratedFile": false
  4. }
复制代码

ps: 开发阶段"saveGeneratedFile": ture,运行以后"saveGeneratedFile": false

5、工程配置build-profile.json5 (自动生成了)
  1.  "buildOption": {
  2.           "strictMode": {
  3.             "caseSensitiveCheck": true,
  4.             "useNormalizedOHMUrl": true
  5.           }
  6.         }
复制代码

二、代码实现

1. HMRouterMgr初始化
  1.    HMRouterMgr.init({
  2.       context:this.context
  3.     })
复制代码

2. HMNavigation组件的使用
使用HMNavigation组件设置navigationId和homePageUrl参数
  1.    HMNavigation({
  2.       navigationId:'nav1',
  3.       :'PageA'
  4.     }){
  5.       //当没有首页的时候显示界面
  6.       Text('这是默认首页')
  7.         .fontSize(30)
  8.         .fontColor(Color.Red)
  9.     }
复制代码
3. 设置options参数,设置属性
  1. ...
  2.   navModifier:NavModifier = new NavModifier()
  3. ...
  4.    HMNavigation({
  5.       navigationId:'nav1',
  6.       homePageUrl:'PageA',
  7.       :{
  8.         modifier:this.navModifier
  9.     }
  10.     })
  11. ...
  12. /*
  13.  * 修饰符对象,作用:用于对Navigation做界面上的属性设置
  14.  * */
  15. class NavModifier extends  AttributeUpdater<NavigationAttribute>{
  16.   initializeModifier(instance: NavigationAttribute): void {
  17.     instance.mode(NavigationMode.Stack);
  18.     instance.navBarWidth('100%');
  19.     instance.hideTitleBar(false);
  20.     instance.hideToolBar(true);
  21.   }
复制代码
4. 跳转(带参)
 
  1.         //1、跳转(地址,参数)
  2.         HMRouterMgr.push({pageUrl:'PageB',param:'hello'})
  3.         //2、接收参数
  4.         let ret =  HMRouterMgr.getCurrentParam()
复制代码
5. 返回(带参)
  1.     1、返回(参数)
  2.      HMRouterMgr.pop({param:'yingwu'})
  3.     2、接收参数
  4.     HMRouterMgr.push(...,{
  5.           onResult(popInfo:HMPopInfo){
  6.            let ret = popInfo.result
  7.             console.log('jinggang',JSON.stringify(ret))
  8.           }
  9.         })
复制代码
6. 完整代码
* Index.ets
  1. import { HMNavigation } from '@hadss/hmrouter';
  2. import { AttributeUpdater } from '@kit.ArkUI';
  3. @Entry
  4. @Component
  5. struct Index {
  6.   @State message: string = 'Hello World';
  7.   navModifier:NavModifier = new NavModifier()
  8.   build() {
  9.   Column(){
  10.     HMNavigation({
  11.       navigationId:'nav1',
  12.       homePageUrl:'PageA',
  13.       options:{
  14.         modifier:this.navModifier
  15.     }
  16.     }){
  17.       //当没有首页的时候显示界面
  18.       Text('这是默认首页')
  19.         .fontSize(30)
  20.         .fontColor(Color.Red)
  21.     }
  22.   }
  23.   .width('100%')
  24.   .height('100%')
  25.   }
  26. }
  27. /*
  28.  * 修饰符对象,作用:用于对Navigation做界面上的属性设置
  29.  * */
  30. class NavModifier extends  AttributeUpdater<NavigationAttribute>{
  31.   initializeModifier(instance: NavigationAttribute): void {
  32.     instance.mode(NavigationMode.Stack);
  33.     instance.navBarWidth('100%');
  34.     instance.hideTitleBar(false);
  35.     instance.hideToolBar(true);
  36.   }
  37. }
复制代码
* 创建PageA.ets添加HMRouter注解
 
  1. import { HMPopInfo, HMRouter, HMRouterMgr } from "@hadss/hmrouter";
  2. @HMRouter({pageUrl:'PageA'})//添加HMRouter注解
  3. @Component
  4. export  struct pageA{
  5.   build() {
  6.     Column(){
  7.       Text('这是PageA').fontSize(30).fontColor(Color.Red)
  8.       Button('跳转到B').onClick(()=>{
  9.         HMRouterMgr.push({pageUrl:'PageB',param:'hello'},{
  10.           onResult(popInfo:HMPopInfo){
  11.            let ret = popInfo.result
  12.             console.log('jinggang',JSON.stringify(ret))
  13.           }
  14.         })
  15.       })
  16.     }
  17.     .width('100%')
  18.     .height('100%')
  19.   }
  20. }
复制代码
* PageB.ets添加HMRouter注解
 
  1. import { HMRouter, HMRouterMgr } from '@hadss/hmrouter'
  2. @HMRouter({pageUrl:'PageB'})//添加HMRouter注解
  3. @Component
  4. export  struct PageB{
  5.   aboutToAppear(): void {
  6.    let ret =  HMRouterMgr.getCurrentParam()
  7.     if (ret != null) {
  8.       console.log('jingang',ret)
  9.     }
  10.   }
  11.   build() {
  12.    Column(){
  13.     Text('这是一个B')
  14.      Button('返回').onClick(()=>{
  15.        HMRouterMgr.pop({param:'yingwu'})
  16.      })
  17.    }
  18.   }
  19. }
复制代码
7. 运行实现

Demo
结束语

综上所述,HMRouter为现代移动应用开发提供了一套强盛而灵活的路由管理系统。通过对它的深入相识和合理运用,我们可以显着改善项目标结构清晰度、代码复用性以及整体用户体验。固然,每个项目都有其独特的需求,因此在选择是否采用HMRouter时,应当思量自身的实际环境和技术栈特点。渴望本文能为你评估和引入HMRouter提供有价值的参考信息。随着技术的发展,我们期待看到更多像HMRouter这样优秀的工具出现,不断推动着前端开发领域的进步。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表