鸿蒙动态路由实现方案

news/2025/3/27 11:09:46/

背景

随着CSDN 鸿蒙APP 业务功能的增加,以及为了与iOS、Android 端统一页面跳转路由,以及动态下发路由链接,路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。

实现方案

鸿蒙版本动态路由的实现原理,类似于 iOS与Android的实现原理,具体理论可以查看 iOS 动态路由实现 这篇博文,这边不在赘述,这边只阐述实现逻辑。

1、路由地址与页面绑定

为了让鸿蒙中的每个页面都有一个固定的URL地址,我们这边借助了三方框架 HMRouter,具体HMRouter的实现方案,可以查看文档

@HMRouter({ pageUrl: 'app://app.com/blog/detail' })
@Component
export struct BlogDetailPage {
}

2、动态路由注册与跳转

我们实现了一个Router类,该类来实现我们动态路由表存储以及跳转的所有逻辑。routers 中存放了所有已经注册的URL。

 class Router {/***  保存了所有已注册的 URL*  结构类似 {"blog": {":blogId": {"_":callback}}}*/private  routers:Map<string,CommonAllType>}

通过下面方法实现注册动态路由表routers

 /** 添加路由到路由表* */private addURL(urlStr:string):Map<string,CommonAllType>{let pathComponents = this.pathComponentsFromURL(urlStr)let subRoutes = this.routersfor (let pathComponent of pathComponents){if (!subRoutes.get(pathComponent)) {subRoutes.set(pathComponent,new Map())}subRoutes = subRoutes.get(pathComponent) as Map<string,CommonAllType>}return subRoutes}

例如注册如下路由:

 Router.registerURLPattern('https://blog.csdn.net/:us' ,(params)=> {})

注册到本地路由表routers中应该是如下所示

{"https": {"blog.csdn.net": {":us": {"_": function ( {...} )}}}
}

在这里插入图片描述
所有注册的路由,都是以这种方式存储在routers中,跳转时就会从路由表中查询匹配到的路由,来跳转。
当有路由跳转时,调用以下方法:

Router.openUrl('https://blog.csdn.net/weixin_36162680/article/details/124127748', {'isLogin':true})

跳转时,匹配到路由有,那么也会生成相应的路由参数,如下:

{"un": "weixin_36162680","id": "124127748"
}

3、动态路由重定向实现及远端路由表格式

路由重定向

对于移动端的路由重定向,实际上就是将一个路由转换为另一个路由,例如:
https://blog.csdn.net/:us
转换为:
app://app.com/blog/detail?us=xxx

远端路由表格式

一条路由规则,分为一个 Key 和对应的 Value,Key 为需要注册的路由(匹配规则),Value 中包含重定向的路由地址,或者需要拦截的参数等。
这里面的Key 必须是与鸿蒙中页面所绑定的路由地址。

{"app://app.csdn.net/blog/detail": {"needLogin": true},"https://blog.csdn.net/:un": {"redirectUrl": "csdnapp://app.csdn.net/blog/detail"}
}

跳转时重定向逻辑

Router.registerURLPattern('https://blog.csdn.net/:us' ,(params)=> {//判断是否需要登录if (!UserTool.isLogin() && params.has(Router.routerNeedLogin)) {let needLogin = params.get(Router.routerNeedLogin) as booleanif (needLogin) {Router.login()return}}//判断是否需要重定向.....})
HMRouter 路由是否注册

在使用的时候,还有情况需要判断页面是否绑定了HMRouter

/** hm_router是否注册* */static isRegisterHMRouter(urlStr: string) : boolean {let mapJsonValue = getContext().resourceManager.getRawFileContentSync('hm_router_map.json')let jsonStr: string = strUtils.uint8ArrayToStr(mapJsonValue)let jsonObj = JSON.parse(jsonStr) as objectlet routMapArray = jsonObj['routerMap'] as Array<object>if (!strUtils.isBlank(urlStr)) {try {let tempURL = Url.URL.parseURL(urlStr)let tempUrlStr = tempURL.protocol + '//' + tempURL.host + tempURL.pathnamelet found = falsefor (let value of routMapArray){let name = value['name'] as stringif (name === tempUrlStr) {found = truebreak}}return found}catch (err){}}return false}

至此,基本路由跳转方案均已经实现,另外可以通过判断路由是否注册,来提示用户。


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

相关文章

C++中.h文件中的实现方法

在 C 中&#xff0c;.h 文件和 Java 中的接口有一些相似之处&#xff0c;但它们的作用和用法还是有很大区别。具体来说&#xff0c;.h 文件通常用于声明&#xff0c;但也可以包含一些实现&#xff0c;特别是在某些特殊情况下。 1. C .h 文件的基本用途 C 的头文件&#xff08…

Postman环境变量全局变量设置

在公司中&#xff0c;一般会存在开发环境、测试环境、线上环境等&#xff0c;如果需要在不 同的环境下切换做接口测试&#xff0c;显然我们需要把所有接口的域名进行修改&#xff0c;如果接 口测试用例较多&#xff0c;那么修改会非常费力&#xff0c;postman可直接通过切换环境…

mac 安装mongodb

本文分享2种mac本地安装mongodb的方法&#xff0c;一种是通过homebrew安装&#xff0c;一种是通过tar包安装 homebrew安装 brew tap mongodb/brew brew upate brew install mongodb-community8.0tar包安装 安装mongodb 1.下载mongodb社区版的tar包 mongdb tar包下载地址 2…

VIVADO FIFO (同步和异步) IP 核详细使用配置步骤

VIVADO FIFO (同步和异步) IP 核详细使用配置步骤 目录 前言 一、同步FIFO的使用 1、配置 2、仿真 二、异步FIFO的使用 1、配置 2、仿真 前言 在系统设计中&#xff0c;利用FIFO&#xff08;first in first out&#xff09;进行数据处理是再普遍不过的应用了&#xff0c…

在线宠物用品|基于vue的在线宠物用品交易网站(源码+数据库+文档)

|在线宠物用品交易网站 目录 基于springbootvue的在线宠物用品交易网站 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&am…

【统计的思想】假设检验(一)

假设检验是统计学里的重要方法&#xff0c;同时也是一种“在理想与现实之间观察求索”的测试活动。假设检验从概率的角度去考察理想与现实之间的关系&#xff0c;籍此来缓解测试可信性问题。 我们先来看一个例子。民航旅客服务系统&#xff0c;简称PSS系统&#xff0c;有一种业…

Debian终端高亮(显示不同颜色)

起因 Debian终端与CentOS不一样&#xff0c;CentOS终端默认自带高亮显示&#xff0c;不同文件类型的文件显示颜色不一样&#xff0c;而Debian默认都显示为一样的颜色。 解决方法 为了debian终端显示有颜色有如下方法&#xff1a; 方法一&#xff1a;单次有效 ls --colorau…

“深入浅出”系列之数通篇:(2)交换机的三种连接方式:级联、堆叠和集群

因为之前实习的时候做过网络工程师&#xff0c;所以今天也来这里说一下有关交换机的内容。交换机的连接方式大家应该都知道&#xff0c;一共有三种&#xff0c;分别是&#xff1a;级联、堆叠和集群。 交换机的级联技术一般用来实现多台交换机之间的互相连接&#xff1b; 堆叠…