angular 路由守卫优先级

本文探讨在Angular应用中,如何处理多个异步路由守卫的优先级问题。场景包括用户登录验证和权限检查。在Angular7+中,父路由守卫优先级高于子路由,同时canActivateChild数组中的前一个守卫优先级高于后一个。这种优先级设置确保了在守卫请求完成之前,页面不会加载,从而避免了白屏现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设这样一种需要用到两个异步路由守卫场景

1.需要判定用户登录了没有,如果没有需要跳转登录页面(login)

2.如果用户登录了,判断用户有没有权限,如果没权限,则跳转到访问拒绝(deny)

 多个路由守卫的优先级(angular7+支持)

  • 父路由守卫的优先级比子的高
  • canActivateChild数组前面的路由守卫比后面的拥有更高的优先级
  • 优先级高的意思是即使UserGuard异步请求先回来,也要等LoginGuard的请求回来才决定跳转哪个页面(等待过程是白屏)
canActivateChild: [LoginGuard, UserGuard],
 LoginGuard返回trueLoginGuard返回跳转
UserGuard返回true该页面可以正常访问跳转login页面
UserGuard返回跳转跳转deny页面跳转login页面


  

LoginGuard

import { Injectable } from '@angular/core';
import { CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class LoginGuard implements CanActivateChild {
  constructor(private router: Router) { }

  canActivateChild(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Promise<boolean | UrlTree> | boolean | UrlTree {
    console.log('login路由守卫');
    return new Promise((resolve, reject) => {
      this.getLogin().then(res => {
        if (res) {
          resolve(true);
        } else {
          console.log('跳转到login');
          resolve(this.router.parseUrl('/user/login'));
        }
      });
    });
  }

  // 用settimeout模拟异步请求
  getLogin(): Promise<boolean> {
    const timeout = 2000;
    const isLogin = false;
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(isLogin);
      }, timeout);
    });
  }
}

 

UserGuard

import { Injectable } from '@angular/core';
import { CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class UserGuard implements CanActivateChild {
  constructor(private router: Router) { }

  canActivateChild(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Promise<boolean | UrlTree> | boolean | UrlTree {
    console.log('user路由守卫');
    return new Promise((resolve, reject) => {
      this.getUser().then(res => {
        if (res) {
          resolve(true);
        } else {
          console.log('跳转到deny');
          resolve(this.router.parseUrl('/user/deny'));
        }
      });
    });
  }

  // 用settimeout模拟异步请求
  getUser(): Promise<boolean> {
    const timeout = 1000;
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(false);
      }, timeout);
    });
  }

}

代码库 url

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值