鸿蒙路由 HMRouter 配置及使用 三 全局拦截器使用

1、前期准备

简单封装一个用户首选项的工具类

复制代码
import { preferences } from "@kit.ArkData";

// 用户首选项方法封装
export class Preferences {
  private myPreferences: preferences.Preferences | null = null;
  // 初始化
  init(context: Context, options: preferences.Options) {
    this.myPreferences = preferences.getPreferencesSync(context, options);
  }

  // 获取参数
  getSync(key: string, defaultValue?: string) {
    if(this.myPreferences) {
      let val = this.myPreferences.getSync(key, defaultValue);
      return val;
    }else {
      return defaultValue;
    }
  }

  // 设置参数
  putSync(key: string, value: string) {
    if(this.myPreferences) {
      this.myPreferences.putSync(key, value)
    }
  }
}

const myPreferences = new Preferences();
export { myPreferences }

在程序入口文件使用工具类

复制代码
onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
    
    // 初始化用户首选项工具类
    myPreferences.init(this.context, {
      name: 'myStore'
    })
    
    windowStage.loadContent('pages/Index', (err) => {
      if (err.code) {
        hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
        return;
      }
      hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
    });
  }

2、创建全局登录拦截器

复制代码
import { HMInterceptor, HMInterceptorAction, HMInterceptorInfo, HMRouterMgr, IHMInterceptor } from '@hadss/hmrouter';
import { myPreferences } from "../utils/Preferences"

@HMInterceptor({
  priority: 9,
  interceptorName: "LoginInterceptor",
  global: true // 定义为全局拦截器
})
export class LoginInterceptor implements IHMInterceptor {
  // 路由白名单
  private WhiteList: string[] = ["LoginPage", "MainPage"]

  handle(info: HMInterceptorInfo): HMInterceptorAction {
    console.log("目标页面:" + info.targetName)
    // 如果目标地址在白名单内,则不拦截
    if(info.targetName && this.WhiteList.includes(info.targetName)) {
      console.log("白名单内,不拦截")
      return HMInterceptorAction.DO_NEXT;
    }
    // 获取用户token
    const token = myPreferences.getSync("token")
    console.log("token", token)
    const isLogin: boolean = token ? true : false;
    // 已登录 继续向下执行
    if(isLogin) {
      console.log("已登录,继续向下执行")
      return HMInterceptorAction.DO_NEXT;
    }else {
      console.log("未登录,跳转到登录页面")
      // 未登录 跳转到登录页面
      HMRouterMgr.replace({
        pageUrl: "LoginPage",
        skipAllInterceptor: true // 跳过所有拦截器
      })
      // 停止执行下一个拦截器,并且不执行路由跳转动画,不执行路由栈操作
      return HMInterceptorAction.DO_REJECT;
    }
  }
}

3、创建登录页面

复制代码
import { HMRouter, HMRouterMgr } from '@hadss/hmrouter';
import { myPreferences } from '../utils/Preferences';

@HMRouter({
  pageUrl: "LoginPage",
})
@Component
export struct LoginPage {
  build() {
    Column() {
      Text("登录页面").fontSize(30).fontWeight(FontWeight.Bold)
      // 通过用户首选项添加测试数据 并跳转到首页
      Button("跳转到 - MainPage").onClick((event: ClickEvent) => {
        // 向用户首选项添加 验证字段
        myPreferences.putSync("token", "123456")
        HMRouterMgr.push({
          pageUrl: "MainPage",
        })
      })
    }
  }
}

4、首页添加测试跳转

复制代码
// 测试登录拦截
      Button("测试登录拦截,跳转TwoPage").onClick((event: ClickEvent) => {
        HMRouterMgr.push({
          pageUrl: "TwoPage"
        })
      })

5、执行结果

相关推荐
程序猿追10 小时前
那个右下角的小数字怎么“卡”住我打字——我用 HarmonyOS 自己写了一个字数限制输入框
pytorch·华为·harmonyos
古德new10 小时前
鸿蒙PC使用electron迁移:Joplin Electron 桌面适配全记录
华为·electron·harmonyos
世人万千丶10 小时前
桌面便签小应用 - HarmonyOS ArkUI 开发实战-TextArea与Flex布局-PC版本
华为·harmonyos·鸿蒙·鸿蒙系统
慧海灵舟10 小时前
AGenUI 鸿蒙端实战踩坑录:从 Column 布局消失到异步组件宽度为 0
华为·harmonyos
yuegu77710 小时前
HarmonyOS应用<节气通>开发第33篇:状态管理实战
华为·harmonyos
YM52e11 小时前
买菜计算器小应用 - HarmonyOS ArkUI 开发实战-PC版本
学习·华为·harmonyos·鸿蒙·鸿蒙系统
阿捏利11 小时前
系列总览-鸿蒙科普系列完全指南
华为·harmonyos
小雨下雨的雨11 小时前
HarmonyOS ArkUI训练营入门-组件掌握系列-Animation 动画效果实现-PC版本
学习·华为·harmonyos·鸿蒙
yuegu77711 小时前
HarmonyOS应用<节气通>开发第32篇:ArkTS语法快速入门——从TypeScript到声明式UI的完整指南
harmonyos
2601_9620725513 小时前
李梦娇常识4600问|题库|打印版
sql·华为od·华为·c#·华为云·.net·harmonyos