首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

HarmonyOS开发实战(5.0)Navigation路由拦截案例实践详解

  • 25-03-03 06:41
  • 4127
  • 9969
blog.csdn.net

鸿蒙HarmonyOS开发实战往期必看文章:

HarmonyOS NEXT应用开发性能实践总结

一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!

最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)


介绍

本示例介绍在Navigation中如何完成路由拦截:首次登录时记录登录状态,再次登录时可以直接访问主页无需重复登录,当退出登录时,下次需重新登录。

目前,已有三方库HMRouter封装了完整的路由拦截功能,添加了生命周期回调、内置转场动画等功能,如有需要,可直接使用。

效果图预览

使用说明

  1. 点击Navigation路由拦截案例。
  2. 在弹出的半模态页面中勾选"阅读并同意协议",点击按钮"手机号码一键登录"。
  3. 进入主页,点击返回上级页面按钮,重新点击Navigation路由拦截案例,即可直接进入主页,不需要重复登录。
  4. 点击主页的"退出登录"按钮,退出案例,此时点击Navigation路由拦截案例需重新登录。

实现思路

1、在路由模块增加路由拦截器interceptor.ets,定义拦截容器、注册方法和公共拦截逻辑,interceptor.ets

  1. /**
  2. * 定义拦截实现接口
  3. *
  4. * @param routerInfo 需要拦截的路由名
  5. * @param param 路由参数
  6. */
  7. export interface InterceptorExecute {
  8. executeFunction(router: RouterInfo, param?: string): boolean;
  9. }
  10. /**
  11. * 定义拦截器方法
  12. */
  13. export class Interceptor {
  14. // 定义拦截器容器
  15. private static list: Array<InterceptorExecute> = [];
  16. /**
  17. * 注册拦截页面
  18. *
  19. * @param interceptorFnc 子模块传过来的自定义拦截函数
  20. */
  21. public static registerInterceptorPage(interceptorFnc: InterceptorExecute): void {
  22. Interceptor.list.push(interceptorFnc);
  23. }
  24. /**
  25. * 公共拦截器逻辑
  26. *
  27. * @param routerInfo 接收传过来的路由名
  28. * @param param 路由参数
  29. */
  30. public static interceptor(routerInfo: RouterInfo, param?: string): boolean {
  31. // 循环拦截器容器中所有的子模块自定义的拦截函数
  32. for (let i = 0; i < Interceptor.list.length; i++) {
  33. if (Interceptor.list[i].executeFunction(routerInfo, param))
  34. return true; // 如果子模块拦截函数返回true,即需要拦截
  35. }
  36. // 否则就放行
  37. return false;
  38. }
  39. }

2、当点击本案例时,触发在路由模块的动态路由.pushUri()中的interceptor的公共拦截方法(此处需动态路由完成加载后执行否则首次路由拦截失败),DynamcicsRouter.ets

  1. // 通过获取页面栈跳转到指定页面
  2. public static pushUri(name: string, param?: ESObject) {
  3. // 如果是第一次跳转,则需要动态引入模块
  4. if (!DynamicsRouter.builderMap.has(name)) {
  5. // 动态引用模块,如“@ohos/addressexchange”,和entry/oh-package.json中配置的模块名相同
  6. import(`${DynamicsRouter.config.libPrefix}/${routerInfo.pageModule}`)
  7. .then((module: ESObject) => {
  8. // 通过路由注册方法注册路由
  9. module[routerInfo.registerFunction!](routerInfo);
  10. // TODO:知识点:在路由模块的动态路由.pushUri()中调用拦截方法,此处必须等待动态路由加载完成后再进行拦截,否则页面加载不成功,导致无法注册拦截的函数,出现首次拦截失效。
  11. if (Interceptor.interceptor(name, param)) {
  12. return;
  13. }
  14. })
  15. } else {
  16. // TODO:知识点:除首次跳转后,之后的每次跳转都需进行路由拦截。
  17. if (Interceptor.interceptor(name, param)) {
  18. return;
  19. }
  20. }
  21. }

3、子模块中定义业务具体拦截逻辑,做具体的拦截实现:通过routerInfo判断目的地为"我的页面"时判断登录状态是"未登录",此时执行跳转到登录页并返回true给拦截容器list(告知需拦截),已登录返回false,放行。并且注册到拦截器容器list中,interceptorPage.ets。

  1. // 子模块实现拦截接口,做具体的拦截实现
  2. export class MyPageInterceptorExecute implements InterceptorExecute {
  3. executeFunction(routerInfo: RouterInfo, param?: string): boolean {
  4. // 通过routerInfo判断目的地为"我的页面"时判断登录状态是"未登录",此时执行跳转到登录页并返回true给拦截容器list(告知需拦截),已登录返回false,放行。
  5. if (routerInfo !== undefined && routerInfo.pageName === RouterInfo.NAVIGATION_INTERCEPTOR.pageName) {
  6. // 如果未登录
  7. if (!AppStorage.get("login")) {
  8. // 跳转登录页
  9. DynamicsRouter.push(RouterInfo.MULTI_MODAL_TRANSITION, param);
  10. return true; // true:路由拦截
  11. } else {
  12. return false; // false:否则放行
  13. }
  14. }
  15. // 通过routerInfo判断目的地为"登录页面"时放行。
  16. if (routerInfo !== undefined && routerInfo.pageName === RouterInfo.MULTI_MODAL_TRANSITION.pageName) {
  17. return false;
  18. }
  19. return false; // false,路由放行
  20. }
  21. }
  22. // 拦截器注册拦截函数
  23. Interceptor.registerInterceptorPage(new MyPageInterceptorExecute());

4、拦截器获取拦截容器list中所有注册过的子模块的拦截函数,如果子模块拦截函数返回true,即需要拦截,否则放行。

  1. /**
  2. * 公共拦截器逻辑
  3. *
  4. * @param routerInfo 接收传过来的路由名
  5. * @param param 路由参数
  6. */
  7. public static interceptor(routerInfo: RouterInfo, param?: string): boolean {
  8. // 循环拦截器容器中所有的子模块自定义的拦截函数
  9. for (let i = 0; i < Interceptor.list.length; i++) {
  10. if (Interceptor.list[i].executeFunction(routerInfo, param))
  11. return true; // 如果子模块拦截函数返回true,即需要拦截
  12. }
  13. // 否则就放行
  14. return false;
  15. }

5、通过循环拦截容器list得到返回true时通知动态路由不再继续跳转, 否则返回false,通知动态路由继续执行跳转,跳转到我的页面,DynamcicsRouter.ets。

  1. // 通过获取页面栈跳转到指定页面
  2. public static async push(routerInfo: RouterInfo, param?: string): Promise<void> {
  3. if (isImportSucceed) {
  4. // 当返回true时执行拦截,通知动态路由不再继续跳转
  5. if (Interceptor.interceptor(routerInfo, param)) {
  6. return;
  7. }
  8. ... // 当返回false,通知动态路由继续执行跳转,跳转到我的页面
  9. }

6、在登录页点击:本机号码一键登录后,登陆成功,登陆状态置为true,且跳转到主页,HalfModalWindow

  1. Button($r('app.string.multimodaltransion_phone_start_login'))
  2. .onClick(() => {
  3. if (this.isConfirmed) {
  4. AppStorage.set("login", true); // 登录状态置为已登录
  5. DynamicsRouter.pop();
  6. DynamicsRouter.push(RouterInfo.NAVIGATION_INTERCEPTOR); // 路由跳转
  7. })

7、详情页中点击:注销登录,登录状态置为false,退出登录,interceptorPage.ets

  1. @StorageLink('login') hasLogin: boolean = true;
  2. Button($r('app.string.naviagtion_interceptor_loginout'))
  3. .onClick(() => {
  4. this.hasLogin = false; // 注销登录
  5. DynamicsRouter.pop(); // 退出登录
  6. })
  7. .width("100%")

高性能知识点

不涉及

工程结构&模块类型

  1. navigationinterceptor // har类型
  2. |---src/main/ets/view
  3. | |---interceptorPage.ets // 视图层-主页
  4. |---src/main/ets/model
  5. | |---DataModel.ets // 模型层-数据模块
  6. routermodule // har类型
  7. |---src/main/ets/interceptpr
  8. | |---interceptor.ets // 模型层-拦截器方法类
  9. |---src/main/ets/router
  10. | |---DynamticRouter.ets // 模型层-动态路由方法类

模块依赖

har包-common库中UX标准
@ohos/routermodule(动态路由)

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线图、学习视频、文档用来跟着学习是非常有必要的。 

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员

鸿蒙 NEXT 全栈开发学习笔记  希望这一份鸿蒙学习文档能够给大家带来帮助~

这份鸿蒙(HarmonyOS NEXT)包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。


鸿蒙(HarmonyOS NEXT)最新学习路线

​

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频学习教程+学习PDF文档

HarmonyOS Next 最新全套视频教程

  纯血版鸿蒙全套学习文档(面试、文档、全套视频等)       

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

鸿蒙NEXT全套学习资料
微信名片
注:本文转载自blog.csdn.net的让开,我要吃人了的文章"https://blog.csdn.net/weixin_55362248/article/details/142362637"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top