日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

【硬核解说】一口气讲明白Angular的5种路由守卫RouteGuard是嘛玩意儿

發(fā)布時(shí)間:2023/11/27 生活经验 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【硬核解说】一口气讲明白Angular的5种路由守卫RouteGuard是嘛玩意儿 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Angular的常用路由守衛(wèi)有5種,按照?qǐng)?zhí)行順序:

①?CanLoad:進(jìn)入到當(dāng)前路由的時(shí)候觸發(fā)(若用戶沒(méi)有權(quán)限訪問(wèn),相應(yīng)的模塊并不會(huì)被加載。這里是指對(duì)應(yīng)組件的代碼)。

CanAcitivate:進(jìn)入到當(dāng)前路由的時(shí)候觸發(fā)(即使返回的是false,用戶并沒(méi)有權(quán)限訪問(wèn)該路由,但是相應(yīng)的模塊會(huì)被加載)。

③?CanActivateChild:剛剛進(jìn)入子路由觸發(fā)。

④?Resolve:進(jìn)入當(dāng)前路由之后,離開(kāi)之前觸發(fā)。

⑤?CanDeactivate:離開(kāi)當(dāng)前路由離開(kāi)的時(shí)候觸發(fā)。?

① guard/CanLoad.guard.ts

import { Injectable } from '@angular/core';
import { CanLoad, Route, Router, UrlSegment } from '@angular/router';@Injectable()
export class CanLoadGuard implements CanLoad {constructor(private router: Router) { }canLoad(route: Route,segments: UrlSegment[]) {console.log('【CanLoad守衛(wèi):進(jìn)入當(dāng)前子路由】----------------------------------------', route, segments);return true;//進(jìn)入路由// return false;//中端路由}}

② guard/CanAcitivate.guard.ts

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';@Injectable({ providedIn: 'root' })//這個(gè)在該守衛(wèi)里面必須要,其余兩種守衛(wèi)中可以不需要
/* 沒(méi)有上面這句會(huì)報(bào)錯(cuò)
ERROR Error: Uncaught (in promise): NullInjectorError: R3InjectorError(AppModule)[CanAcitivateGuard -> CanAcitivateGuard -> CanAcitivateGuard]: 
NullInjectorError: No provider for CanAcitivateGuard!
NullInjectorError: R3InjectorError(AppModule)[CanAcitivateGuard -> CanAcitivateGuard -> CanAcitivateGuard]: 
NullInjectorError: No provider for CanAcitivateGuard! */export class CanAcitivateGuard implements CanActivate {constructor(private router: Router) { }// 這就是你們想要的路由守衛(wèi)canActivate(next: ActivatedRouteSnapshot,state: RouterStateSnapshot) {console.log('【CanActivate守衛(wèi):進(jìn)入當(dāng)前路由】----------------------------------------', next, state);// 這里可以做各種路由判斷的騷操作,通常我們主要是判斷用戶登錄狀態(tài)// 判斷本地有沒(méi)有token,如果token有值,表示登錄成功,繼續(xù)跳轉(zhuǎn)if (localStorage.token) {return true;} else {//兄嘚!你都沒(méi)有登錄,乖乖去一下登錄頁(yè)面吧~this.router.navigate(['/login']);return false;}}
}

③ guard/CanActivateChild.guard.ts

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivateChild, Router, RouterStateSnapshot } from '@angular/router';@Injectable()
export class CanActivateChildGuard implements CanActivateChild {constructor(private router: Router) { }canActivateChild(route: ActivatedRouteSnapshot,state: RouterStateSnapshot) {console.log('【CanActivateChild守衛(wèi):進(jìn)入當(dāng)前子路由】----------------------------------------', route, state);return true;//進(jìn)入路由// return false;//中端路由}
}

④ guard/Resolve.guard.ts

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router';
import { AppComponent } from '../app.component';@Injectable()
export class ResolveGuard implements Resolve<AppComponent> {constructor(private router: Router) { }resolve(route: ActivatedRouteSnapshot,state: RouterStateSnapshot): any {console.log('【Resolve守衛(wèi):進(jìn)入當(dāng)前路由之后,離開(kāi)之前】----------------------------------------', route, state);}}

⑤ guard/CanDeactivate.guard.ts

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanDeactivate, Router, RouterStateSnapshot } from '@angular/router';
import { AppComponent } from '../app.component';@Injectable()
export class CanDeactivateGuard implements CanDeactivate<AppComponent> {constructor(private router: Router) { }canDeactivate(component: AppComponent,currentRoute: ActivatedRouteSnapshot,currentState: RouterStateSnapshot,nextState?: RouterStateSnapshot) {console.log('【CanDeactivate守衛(wèi):離開(kāi)當(dāng)前路由】----------------------------------------', currentRoute, currentState, nextState);return confirm('一旦離開(kāi),未保存的內(nèi)容將丟失!');}
}

?app-routing.module.ts

import { CanLoadGuard } from './guard/CanLoad.guard';
import { CanAcitivateGuard } from './guard/CanAcitivate.guard';
import { AppComponent } from './app.component';
import { ResolveGuard } from './guard/Resolve.guard';
import { CanDeactivateGuard } from './guard/CanDeactivate.guard';
import { NgModule } from '@angular/core';
import { RouterModule, Routes, Resolve, Route, UrlSegment } from '@angular/router';
import { HomeComponent } from './com/home/home.component';
import { LoginComponent } from './com/login/login.component';
import { CanActivateChildGuard } from './guard/CanActivateChild.guard';
import { ChildComponent } from './com/home/child/child.component';const routes: Routes = [{path: '',component: AppComponent,},{path: 'home',component: HomeComponent,canLoad: [CanLoadGuard],//順序1(剛進(jìn)入路由,還未加載組件)canActivate: [CanAcitivateGuard],//順序2(剛進(jìn)入路由,部分組件加載)canActivateChild: [CanActivateChildGuard],//順序3(剛剛進(jìn)入子路由)(必須加上這個(gè),否則會(huì)報(bào)錯(cuò))resolve: { data: ResolveGuard },//順序4(進(jìn)入路由后)(必須加上這個(gè),否則會(huì)報(bào)錯(cuò))canDeactivate: [CanDeactivateGuard],//順序5(離開(kāi)路由)children: [{path: 'child',component: ChildComponent,}]},{path: 'login',component: LoginComponent,},
];@NgModule({imports: [RouterModule.forRoot(routes)],exports: [RouterModule],providers: [/* 【CanActivate 和 CanLoad的區(qū)別】CanActivate:即使返回的是false,用戶并沒(méi)有權(quán)限訪問(wèn)該路由,但是相應(yīng)的模塊會(huì)被加載。CanLoad:若用戶沒(méi)有權(quán)限訪問(wèn),相應(yīng)的模塊并不會(huì)被加載。這里是指對(duì)應(yīng)組件的代碼。*/CanLoadGuard,//順序1(剛進(jìn)入路由,還未加載組件)CanAcitivateGuard,//順序2(剛進(jìn)入路由,部分組件加載)CanActivateChildGuard,//順序3(剛剛進(jìn)入子路由)(必須加上這個(gè),否則會(huì)報(bào)錯(cuò))ResolveGuard,//順序4(進(jìn)入路由后)(必須加上這個(gè),否則會(huì)報(bào)錯(cuò))CanDeactivateGuard,//順序5(離開(kāi)路由)]
})
export class AppRoutingModule { }

訪問(wèn)localhost:4200/home打開(kāi)F12查看提示:?

app.component.html

<router-outlet></router-outlet>

在home里面寫(xiě)一個(gè)按鈕點(diǎn)擊跳轉(zhuǎn)到localhost/,然后打開(kāi)F12查看

app/home/home.component.ts?

import { Router } from '@angular/router';
...
constructor(public router: Router) { }
...

app/home/home.component.html

<button (click)="router.navigate(['/home/child'])">跳轉(zhuǎn)到child,F12去看看CanActivateChild路由守衛(wèi)結(jié)果</button>
<br><br>
<button (click)="router.navigate(['/login'])">跳轉(zhuǎn)到login,F12去看看CanDeactivate路由守衛(wèi)結(jié)果</button>

總結(jié)

以上是生活随笔為你收集整理的【硬核解说】一口气讲明白Angular的5种路由守卫RouteGuard是嘛玩意儿的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一区二区精品区 | 日本极品少妇 | 男生看的污网站 | 打屁股av| 免费看女生隐私 | 免费簧片在线观看 | 日韩午夜激情电影 | 日韩无码精品一区二区三区 | 亚洲精品视频免费观看 | 中文字幕欧美在线 | 久久精品伦理 | 男裸体无遮挡网站 | 国产老妇视频 | 99re在线精品视频 | 色欲久久久天天天综合网 | 黄色网页在线免费观看 | 日本一区二区三区视频在线 | 午夜一区二区三区免费 | 亚洲成人生活片 | 91插插插影库永久免费 | 国产男人的天堂 | 激情www| 免费在线观看网址入口 | 免费91看片 | 好看的av在线 | 视频在线一区 | 欧美在线观看一区 | 国产精品亚洲专区无码牛牛 | 亚洲av熟女国产一区二区性色 | 超碰个人在线 | 午夜噜噜 | 伊人爱爱网 | 极品尤物魔鬼身材啪啪仙踪林 | 黄色片播放器 | 色哟哟免费视频 | √天堂中文官网8在线 | 一对一色视频聊天a | 亚洲色图在线播放 | 中文字幕在线观看第一页 | 伊人久久麻豆 | 免费成人av在线播放 | 日韩av资源在线观看 | 激情无遮挡 | 久久特级毛片 | 性a视频 | 丝袜美女啪啪 | 亚洲无打码 | 国产午夜精品一区二区三区欧美 | 91一区二区三区四区 | 日韩欧美三级在线 | 国产日韩欧美电影 | 高清福利视频 | 国产激情av| 天天干少妇 | 伊人免费在线 | 精品国产免费人成在线观看 | 婷婷丁香一区二区三区 | 国产69精品麻豆 | 秋霞免费av | 欧美精品久 | 精品乱码久久久久久中文字幕 | 99国产精品白浆在线观看免费 | 亚洲最大的成人网 | 久久免费片 | 嫩草视频免费观看 | 久久aⅴ国产欧美74aaa | 天天综合射| 性色AV无码久久一区二区三 | 天天干天天噜 | 欧美另类综合 | 黄色国产网站 | 天干夜夜爽爽日日日日 | 欧洲激情网 | 蜜桃又黄又粗又爽av免 | 国产1区 | 精品国产一区二区视频 | 强伦人妻一区二区三区 | 国产一区二区三区四区五区 | 久久亚洲国产成人精品性色 | 国产成人久久77777精品 | 奇米成人影视 | 日韩精品成人无码专区免费 | jlzzjlzz亚洲女人 | 成年人在线网站 | 天天躁日日摸久久久精品 | 在线观看视频 | 国产精品三级在线观看 | 国产一级黄色 | 国产精品无码久久久久 | 91久久精品国产 | 成年视频在线观看 | 国产精品久久久久久久蜜臀 | 五月天激情综合网 | 一区二区三区天堂 | 日本精品视频 | 丁香花电影高清在线阅读免费 | 二级毛片视频 | 免费20分钟超爽视频 | 成人久久网站 |