【HarmonyOS】HMRouter使用详解(四)路由拦截

news2024/11/29 12:32:48

路由拦截器


可以对指定或全局路由跳转时添加拦截器,作用是可以实现在页面切换前做判断是否有进入当前页面的权限。这篇文章将实现登录的全局路由拦截样式。

新建拦截器类


通过继承IHMInterceptor接口实现生命周期接口的方法重写。 通过添加@HMInterceptor装饰器,来定义拦截器类的名称,然后在页面中使用

IHMInterceptor接口

包含一个handle方法,接口拦截时,会执行当前方法。

export interface IHMInterceptor {
    handle(info: HMInterceptorInfo): HMInterceptorAction;
}

HMInterceptorInfo参数

拦截器获取到的数据对象。

export interface HMInterceptorInfo {
    srcName: string;
    targetName: string;
    isSrc?: boolean;
    type: HMActionType;
    routerPathInfo: HMRouterPathInfo;
    routerPathCallback?: HMRouterPathCallback;
    context: UIContext;
}

  • srcName:发起页面名称。
  • targetName:目标页面名称。
  • isSrc:是否是发起页面。
  • type:路由跳转类型,push,replace,pop。
  • routerPathInfo:路由跳转信息,HMRouterPathInfo。
  • routerPathCallback:路由跳转回调,HMRouterPathCallback。
  • context:UIContext,可以用来对UI界面进行操作。

HMInterceptorAction枚举值

方法的返回值,表示下一个拦截器的动作

  • DO_NEXT:继续执行下一个拦截器。
  • DO_REJECT:停止执行下一个拦截器,并且不执行路由跳转动画,不执行路由栈操作。
  • DO_TRANSITION:跳过后续拦截器,直接执行路由转场动画,执行路由栈操作。

@HMInterceptor装饰器

需要标记在继承了IHMInterceptor接口的对象上,声明此对象为一个拦截器。
在路由栈发生变化前,转场动画发生前进行回调。

  • interceptorName:拦截器名称,必填。
  • priority:拦截器优先级,数字越大优先级越高,非必填,默认为9。按照优先级顺序执行,不区分自定义或者全局拦截器,优先级相同时先执行@HMRouter中定义的自定义拦截器。当优先级一致时,先执行srcPage>targetPage>global。
  • global: 是否为全局拦截器,当配置为true时,所有跳转均过此拦截器;默认为false,当为false时需要配置在@HMRouter的interceptors中才生效。

登录界面实现全局页面跳转拦截器


LoginModel

登录用的类,这里也当作是用户类来使用了。

@Observed
export class LoginModel {
  Name: string = "";
  Password: string = "";

  constructor(name: string, password: string) {
    this.Name = name;
    this.Password = password;
  }
}

User

定义一个全局类用来实现用户的登录操作,这里没有封装后续获取用户信息的方法。

import { LoginModel } from "../Models/LoginModel";

export class User {
  private static LoginUser?: LoginModel

  /**
   * 登录
   * @param username
   * @param password
   * @returns
   */
  public static Login(username: string, password: string): string {
    if (username == undefined || username == "" || password == undefined || password == "") {
      return "登录失败";
    }
    User.LoginUser = new LoginModel(username, password);
    return "登录成功";
  }

  /**
   *登出
   */
  public static Logout() {
    User.LoginUser = undefined;
  }

  /**
   * 是否登录
   * @returns
   */
  public static IsLogin(): boolean {
    return User.LoginUser != undefined;
  }
}

LoginPage

登录界面,实现页面跳转和携带参数跳转的操作。

import { HMInterceptorInfo, HMRouter, HMRouterMgr } from "@hadss/hmrouter";
import { User } from "../../Common/User";

@HMRouter({ pageUrl: "LoginPage" })
@Component
export struct LoginPage {
  @State UserName: string = "";
  @State Password: string = "";
  TargetPath?: string;
  PathParam: ESObject;

  aboutToAppear(): void {
    let paramResult: HMInterceptorInfo = HMRouterMgr.getCurrentParam() as HMInterceptorInfo;
    if (paramResult == undefined) {
      return;
    }
    this.TargetPath = paramResult.targetName;
    this.PathParam = paramResult.routerPathInfo.param;
  }

  build() {
    Column() {
      Row() {
        Text("账户:")
          .fontSize(16)
          .margin({ left: 10, right: 10 })
        TextInput({ text: this.UserName, placeholder: "请输入账户" })
          .layoutWeight(1)
          .margin({ right: 10 })
          .onChange((value) => {
            this.UserName = value
          })
      }
      .width("100%")

      Row() {
        Text("密码:")
          .fontSize(16)
          .margin({ left: 10, right: 10 })
        TextInput({ text: this.Password, placeholder: "请输入密码" })
          .layoutWeight(1)
          .margin({ right: 10 })
          .type(InputType.Password)
          .onChange((value) => {
            this.Password = value
          })
      }
      .width("100%")
      .margin({ top: 20 })

      Grid() {
        GridItem() {
          Button("注册")
            .width("100%")
            .backgroundColor("#f1f2f3")
            .fontColor("#007dfe")
            .onClick(() => {

            })

        }
        .width("50%")
        .padding({ right: 10, left: 10 })

        GridItem() {
          Button("登录")
            .width("100%")
            .onClick(() => {
              let loginResult: string = User.Login(this.UserName, this.Password);
              if (loginResult === "登录成功") {
                HMRouterMgr.replace({
                  pageUrl: this.TargetPath,
                  param: this.PathParam
                })
              }
              console.info("登录结果:" + loginResult);
            })
        }
        .width("50%")
        .padding({ right: 10, left: 10 })
      }
      .rowsTemplate("1tf 1tf")
      .margin({ top: 10 })
      .width("100%")
      .height(60)
    }
    .width("100%")
    .height("100%")
  }
}

LoginInterceptor

登录拦截器

import { HMInterceptor, HMInterceptorAction, HMInterceptorInfo, HMRouterMgr, IHMInterceptor } from "@hadss/hmrouter";
import { User } from "../Common/User";

@HMInterceptor({
  priority: 9,
  interceptorName: "LoginInterceptor",
  global: true
})
export class LoginInterceptor implements IHMInterceptor {
  handle(info: HMInterceptorInfo): HMInterceptorAction {
    if (User.IsLogin()) {
      // 跳转下一个拦截器处理
      return HMInterceptorAction.DO_NEXT;
    } else {
      HMRouterMgr.push({
        pageUrl: 'LoginPage',
        skipAllInterceptor: true
      })
      // 拦截结束,不再执行下一个拦截器,不再执行相关转场和路由栈操作
      return HMInterceptorAction.DO_REJECT;
    }
  }
}

实现效果如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Docker部署nextjs应用

最近使用nextjs网站开发,希望使用docker进行生产环境的部署,减少环境的依赖可重复部署操作。我采用的是Dockerfile编写应用镜像方式 docker-compose实现容器部署的功能。 Docker Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器…

大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

CMake学习笔记(四)cmake --build使用踩坑记录

根据 深入理解 CMake 的 cmake --build 命令_cmake build-CSDN博客等消息来源的说法&#xff0c; cmake --build <dir> 将在目录<dir>中产生结果文件。但是实测发现&#xff0c;这里有坑&#xff1a;如果目录<dir>中没有CMakeCache.txt等文件的话&#xff…

门店收银系统源码-php+flutter+uniapp

1. 系统开发语言 核心开发语言: PHP、HTML5、Dart 后台接口: PHP7.3 后台管理网站: HTML5vue2.0element-uicssjs 线下收银台&#xff08;安卓/PC收银、安卓自助收银&#xff09;: Dart3 框架&#xff1a;Flutter 3.19.6 移动店务助手: uniapp 线上商城: uniapp 2.线下收…

每天花2分钟学数字化转型,第二讲:数字化

每天花2分钟学习数字化转型&#xff0c;第二讲&#xff1a;什么是数字化转型&#xff1f; 数字化转型的定义 Gartner对数字化(digitalization)的定义&#xff1a;数字化就是利用数字技术来改变商业模式并提供新的收入和价值创造机会&#xff1b;是转向数字业务的过程。 从这个…

叉车安全防撞装置的作用

‌叉车安全防撞装置的核心作用在于提升叉车运行时的安全性&#xff0c;特别是在倒车或经过岔路口等驾驶员视线可能受阻的情境下&#xff0c;通过探测叉车周围的障碍物距离&#xff0c;实时为驾驶员提供必要的辅助信息&#xff0c;有效预防碰撞事故的发生。‌ 这些装置通过多种技…

【多模态】ViT模型技术学习

前言 最近多模态模型特别火&#xff0c;模型也越来越小&#xff0c;性能优异的MiniCPM-2.6只有8B大小&#xff0c;它采用的图片编码器是SigLipViT模型&#xff0c;一起从头学习ViT和Transformer&#xff01;本文记录一下学习过程&#xff0c;所以是自上而下的写&#xff0c;从…

windows上svn设置忽略

目的 就是在windows环境下设置svn的需要忽略的文件&#xff0c;这还是挺实用的一个功能&#xff0c;不然&#xff0c;很多编译的中间文件都上传到svn上了&#xff0c;这样就不好了&#xff1b;ignore设置&#xff0c;也需要注意一下。 过程 svn服务端式忽略&#xff0c;这是…

【前端】制作一个简单的网页(2)

单标签组成的元素 这类标签不需要内容产生效果&#xff0c;通常表示对网页的某种行为&#xff0c;它们不用标记任何内容&#xff0c;开始即是结束。 比如&#xff0c;<hr>标签的作用是在网页中添加一条分割线&#xff0c;它仅包含开始标签&#xff0c;是一个单标签元素。…

【Linux】解读信号的本质&相关函数及指令的介绍

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

k8s的部署和安装

k8s的部署和安装 一、Kubernets简介及部署方法 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个阶段&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参…

【去哪儿-注册安全分析报告-缺少轨迹的滑动条】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

查看SQL执行计划 explain

查看SQL执行计划 explain explain使用方式 alter session set current_schematest; explain plan for sql语句; --并不会实际执行&#xff0c;因此生成的执行计划也是预估的 select * from table(dbms_xplan.display); explain使用场景 1.内存中没有谓词信息了&#xff0…

网站仿制的五大要素

网站仿制的五大要素 在数字化快速发展的今天&#xff0c;仿制一个网站不仅是技术上的挑战&#xff0c;更是对创意与灵感的考验。无论是为了学习设计理念&#xff0c;还是为企业进行市场竞争&#xff0c;以下五大要素是网站仿制时必不可少的。 **1. 目标分析** 在仿制网站之前…

1. ESP32简介

ESP32是什么&#xff1a;它是乐鑫科技研发和设计的一种无线系统级芯片优点&#xff1a; 强大的处理能力无线通信功能广泛的外设接口低功耗特性 为什么选择ESP-IDF开发&#xff1a; 基于C/C开发官方主推实际项目需求 常见的ESP32型号&#xff1a;

Docker 环境下 GPU 监控实战:使用 Prometheus 实现 DCGM Exporter 部署与 GPU 性能监控

Docker 环境下 GPU 监控实战&#xff1a;使用 Prometheus 实现 DCGM Exporter 部署与 GPU 性能监控 文章目录 Docker 环境下 GPU 监控实战&#xff1a;使用 Prometheus 实现 DCGM Exporter 部署与 GPU 性能监控一 查看当前 GPU 信息二 dcgm-exporter 部署1&#xff09;Docker r…

电脑端微信图片文件视频的缓存目录

C:\Users\aaa30\Documents\WeChat Files\wxid_n6b8j77iqho412\FileStorage\Video\2024-10

冠层体散射反射对称性协方差矩阵的模型,在多种分解中都适用

把这个矩阵对应到观测协方差矩阵中&#xff0c;看占比多少&#xff0c;然年后得到体散射功率&#xff0c;时前面的系数乘对角线的和

51单片机快速入门之左移右移流水灯 2024年10/15

51单片机快速入门之左移右移流水灯 左移操作: <<1 每次往左移动一位假设一个八位数为0000 1111 当这个数左移一次之后 0 0001 1110当这个数左移两次之后 00 0011 1100 注意观察 橙色 数字 Python代码如下: 0b表示这是一个二进制 注意这里前置0被省略了 …

数据结构——树和森林

目录 树的存储结构 1、双亲表示法 2、孩子链表 3、孩子兄弟表示法 树与二叉树的转换 将树转换为二叉树 将二叉树转换为树 森林与二叉树的转化 森林转换成二叉树 二叉树转换为森林 树和森林的遍历 1、 树的遍历&#xff08;三种方式&#xff09; 2、森林的遍历 树的存…