【鸿蒙开发】使用HMRouter路由的使用

HMrouter

HMRouter作为应用内页面跳转场景解决方案,为开发者提供了功能完备、高效易用的路由框架。

HMRouter底层对系统Navigation进行封装,集成了NavigationNavDestinationNavPathStack的系统能力,提供了可复用的路由拦截、页面生命周期、自定义转场动画,并且在跳转传参、额外的生命周期、服务型路由方面对系统能力进行了扩展,同时开发者可以高效的将历史代码中的Navigation组件接入到HMRouter框架中。

目的是让开发者在开发过程中减少模板代码,降低拦截器、自定义转场动画、组件感知页面生命周期等高频开发场景的实现复杂度,帮助开发者更好的实现路由与业务模块间的解耦。

GitCode地址

安装

DevEco Studio终端中使用命令(ohpm命令集成在终端,如果想要在全局都使用,得去DevEco Studio安装目录寻找ohpm的地址并配置path)。

bash 复制代码
ohpm install @hadss/hmrouter

在根目录下的hvigor/hvigor-config.json文件中添加, 注意这里@hadss/hmrouter-plugin的版本需要和@hadss/hmrouter的版本一致

json 复制代码
"dependencies": {
  "@hadss/hmrouter-plugin": "^1.1.0-beta.0" 
},

找到entry/hvigorfile.ts 文件,添加

ts 复制代码
import { hapTasks } from '@ohos/hvigor-ohos-plugin';
import { hapPlugin } from '@hadss/hmrouter-plugin';

export default {
  system: hapTasks,
  plugins: [hapPlugin()] 
}

onCreate事件中初始化

kotlin 复制代码
HMRouterMgr.openLog('INFO');
HMRouterMgr.init({
  context: this.context,
});

使用HMNavigation定义入口(类似于vuerouter-view

scala 复制代码
// page/Index.ets

import { HMDefaultGlobalAnimator, HMNavigation, HMRouterMgr } from '@hadss/hmrouter';
import { AttributeUpdater } from '@kit.ArkUI';

@Entry
@Component
struct Index {
  modifier: NavModifier = new NavModifier();

  build() {
    Row() {
      HMNavigation({
        navigationId: 'Index',
        homePageUrl: 'Main',
        options: {
          standardAnimator: HMDefaultGlobalAnimator.STANDARD_ANIMATOR,
          dialogAnimator: HMDefaultGlobalAnimator.DIALOG_ANIMATOR,
          modifier: this.modifier,
        },
      })
    }
    .width('100%')
    .height('100%');
  }
}

class NavModifier extends AttributeUpdater<NavigationAttribute> {
  initializeModifier(instance: NavigationAttribute): void {
    instance.hideNavBar(true);
  }
}

使用@HMRouter定义页面

typescript 复制代码
import { HMRouter, HMRouterMgr } from '@hadss/hmrouter';

@HMRouter({
  pageUrl: 'RemoveList',
})
@Component
export struct RemoveList {
  build() {
    Column() {
      Text('RemoveList');
    };
  }
}

以上就HMRouter的基本全套流程就完成了

我在项目中的调整

目前以PC项目为例

布局调整

Index.ets中调整HMNavigation的位置

php 复制代码
Row() {
  Column() {
  }
  .width(200)
  .height('100%')
  .backgroundColor('#eee');

  HMNavigation({
    navigationId: 'Index',
    homePageUrl: 'Main',
    options: {
      standardAnimator: HMDefaultGlobalAnimator.STANDARD_ANIMATOR,
      dialogAnimator: HMDefaultGlobalAnimator.DIALOG_ANIMATOR,
      modifier: this.modifier,
    },
  })
    .layoutWeight(1);

}
.width('100%')
.height('100%');

这样在Column中便利自己的nav列表,添加点击跳转事件

scss 复制代码
routers: RouterConfig[] = [{
  router: 'Main',
  name: '今日',
}, {
  router: 'RemoveList',
  name: '删除列表',
}];


ForEach(this.routers, (item: RouterConfig) => {
  Text(item.name)
    .lineHeight(30)
    .onClick(() => {
      const list = HMRouterMgr.getPathStack('Index');
      console.log(list?.size().toString());
      HMRouterMgr.push({
        pageUrl: item.router,
      });
    });
});

完成后的简易效果

相关推荐
千百元38 分钟前
jenkins打包问题jar问题
前端
喝拿铁写前端39 分钟前
前端批量校验还能这么写?函数式校验器组合太香了!
前端·javascript·架构
巴巴_羊43 分钟前
6-16阿里前端面试记录
前端·面试·职场和发展
我是若尘1 小时前
前端遇到接口批量异常导致 Toast 弹窗轰炸该如何处理?
前端
该用户已不存在1 小时前
8个Docker的最佳替代方案,重塑你的开发工作流
前端·后端·docker
然我1 小时前
面试官最爱的 “考试思维”:用闭包秒杀递归难题 🚀
前端·javascript·面试
明月与玄武1 小时前
HTML知识全解析:从入门到精通的前端指南(上)
前端·html
teeeeeeemo2 小时前
CSS place-items: center; 详解与用法
前端·css·笔记
未来之窗软件服务2 小时前
html读取身份证【成都鱼住未来身份证】:CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
前端·html·身份证读取
木木jio2 小时前
🧹 前端日志查询组件的重构实践:从 1600 行巨型组件到模块化 hooks
前端·react.js