Heim > Web-Frontend > js-Tutorial > Eine kurze Analyse von Lazy Loading, Guards und dynamischen Parametern beim Angular-Routing

Eine kurze Analyse von Lazy Loading, Guards und dynamischen Parametern beim Angular-Routing

青灯夜游
Freigeben: 2021-07-01 11:05:59
nach vorne
2626 Leute haben es durchsucht

Eine kurze Analyse von Lazy Loading, Guards und dynamischen Parametern beim Angular-Routing

Routing ist ein Mechanismus, der URL-Anfragen bestimmten Codes zuordnet. Er spielt eine wichtige Rolle in der Modulaufteilung und die Routing-Funktionen von Angular sind sehr leistungsfähig. [Empfohlene verwandte Tutorials: „Angular Tutorial“]

Route Lazy Loading

Angular kann den entsprechenden Modulcode entsprechend der Route dynamisch laden. Diese Funktion ist ein leistungsstarkes Tool zur Leistungsoptimierung.

Um die Rendergeschwindigkeit der Homepage zu beschleunigen, können wir die folgende Route entwerfen, um die Homepage so einfach und erfrischend wie möglich zu halten:

const routes: Routes = [
  {
    path: '',
    children: [
      {
        path: 'list',
        loadChildren: () => import('./components/list/list.module').then(m => m.ListModule),
      },
      {
        path: 'detail',
        loadChildren: () => import('./components/detail/detail.module').then(m => m.DetailModule),
      },
      ...
    ],
  },
];
Nach dem Login kopieren

Die Homepage enthält nur einige einfache statische Elemente, während andere Seiten, wie z. B. Listen , Details, Konfiguration und andere Module verwenden < code>loadChildrenDynamisches Laden.

loadChildren动态加载。

效果如下:

Eine kurze Analyse von Lazy Loading, Guards und dynamischen Parametern beim Angular-Routing

其中的components-list-list-module-ngfactory.js文件,只有当访问/list路由时才会加载。

路由守卫

当我们访问或切换路由时,会加载相应的模块和组件,路由守卫可以理解为在路由加载前后的钩子,最常见的是进入路由的守卫和离开路由的守卫:

  • canActivate 进入守卫
  • canDeactivate 离开守卫

比如我们想在用户进入详情页之前,判断他是否有权限,就可以使用canActivate守卫。

增加路由守卫

{
  path: &#39;detail&#39;,
  loadChildren: () => import(&#39;./components/detail/detail.module&#39;).then(m => m.DetailModule),

  // 路由守卫
  canActivate: [AuthGuard],
},
Nach dem Login kopieren

编写守卫逻辑

使用CLI命令创建路由守卫模块:

ng g guard auth
Nach dem Login kopieren

auth.guard.ts

import { Injectable } from &#39;@angular/core&#39;;
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from &#39;@angular/router&#39;;
import { Observable } from &#39;rxjs&#39;;
import { DetailService } from &#39;./detail.service&#39;;

@Injectable({
  providedIn: &#39;root&#39;
})
export class AuthGuard implements CanActivate {
  constructor(
    private detailService: DetailService,
  ) {}

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    return new Observable(observer => {
      // 鉴权数据从后台接口异步获取
      this.detailService.getDetailAuth().subscribe((hasPermission: boolean) => {
        observer.next(hasPermission);
        observer.complete();
      });
    });
  }
}
Nach dem Login kopieren

获取权限service

获取权限的service:

ng g s detail
Nach dem Login kopieren

detail.service.ts

import {Injectable} from &#39;@angular/core&#39;;
import { HttpClient } from &#39;@angular/common/http&#39;;

@Injectable({ providedIn: &#39;root&#39; })
export class DetailService {
  constructor(
    private http: HttpClient,
  ) { }

  getDetailAuth(): any {
    return this.http.get(&#39;/detail/auth&#39;);
  }
}
Nach dem Login kopieren

效果如下:

Eine kurze Analyse von Lazy Loading, Guards und dynamischen Parametern beim Angular-Routing

由于我们对/detail路由增加了守卫,不管是从别的路由切换到/detail路由,还是直接访问/detail路由,都无法进入该页面。

动态路由参数

在路由中带参数有很多中方法:

  • 在path中带参数
  • 在queryString中带参数
  • 不通过链接带参数

在path中带参

{
  path: &#39;user/:id&#39;,
  loadChildren: () => import(&#39;./components/user/user.module&#39;).then(m => m.UserModule),
},
Nach dem Login kopieren

在queryString中带参数

html传参

<a [routerLink]="[&#39;/list&#39;]" [queryParams]="{id: &#39;1&#39;}">...</a>
Nach dem Login kopieren

ts传参

this.router.navigate([&#39;/list&#39;],{ queryParams: { id: &#39;1&#39; });
Nach dem Login kopieren

通过data传递静态参数

注意:通过data传递的路由参数只能是静态的

{
  path: &#39;detail&#39;,
  loadChildren: () => import(&#39;./components/detail/detail.module&#39;).then(m => m.DetailModule),
  
  // 静态参数
  data: {
    title: &#39;详情&#39;
  }
},
Nach dem Login kopieren

通过resolve传递动态参数

data只能传递静态参数,那我想通过路由传递从后台接口获取到的动态参数,该怎么办呢?

答案是通过resolveDer Effekt ist wie folgt:

1 -1. gif

Die Datei components-list-list-module-ngfactory.js wird nur geladen, wenn auf die Route /list zugegriffen wird.

Route Guard

Wenn wir auf Routen zugreifen oder diese wechseln, werden die entsprechenden Module und Komponenten als Hooks vor und nach dem Laden der Route verstanden besteht darin, Routenwächter zu betreten und Routenwächter zu verlassen:

  • kann den Eingangsschutz aktivieren
  • kann den Ausgangsschutz deaktivieren

Zum Beispiel möchten wir den Benutzer vor ihm beurteilen ruft die Detailseite auf. Wenn Sie über die Berechtigung verfügen, können Sie den Guard canActivate verwenden.

Routenschutz hinzufügen

{
  path: &#39;detail&#39;,
  loadChildren: () => import(&#39;./components/detail/detail.module&#39;).then(m => m.DetailModule),
  
  // 动态路由参数
  resolve: {
    detail: DetailResolver
  },
},
Nach dem Login kopieren

Schutzlogik schreiben

Verwenden Sie den CLI-Befehl, um ein Routenschutzmodul zu erstellen:

import { Injectable } from &#39;@angular/core&#39;;
import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from &#39;@angular/router&#39;;
import { DetailService } from &#39;./detail.service&#39;;

@Injectable({ providedIn: &#39;root&#39; })
export class DetailResolver implements Resolve<any> {

  constructor(private detailService: DetailService) { }

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): any {
    return this.detailService.getDetail();
  }
}
Nach dem Login kopieren

auth.guard.ts

import {Injectable} from &#39;@angular/core&#39;;
import { HttpClient } from &#39;@angular/common/http&#39;;

@Injectable({ providedIn: &#39;root&#39; })
export class DetailService {
  constructor(
    private http: HttpClient,
  ) { }

  getDetailAuth(): any {
    return this.http.get(&#39;/detail/auth&#39;);
  }

  // 增加的
  getDetail(): any {
    return this.http.get(&#39;/detail&#39;);
  }
}
Nach dem Login kopieren

Berechtigungsdienst abrufen

Berechtigungsdienst abrufen:

ng g c detial
Nach dem Login kopieren
detail.service.ts
import { Component, OnInit } from &#39;@angular/core&#39;;
import { ActivatedRoute } from &#39;@angular/router&#39;;

@Component({
  selector: &#39;app-detail&#39;,
  templateUrl: &#39;./detail.component.html&#39;,
  styleUrls: [&#39;./detail.component.scss&#39;]
})
export class DetailComponent implements OnInit {

  constructor(
    private route: ActivatedRoute,
  ) { }

  ngOnInit(): void {
    // 和获取静态参数的方式是一样的
    const detail = this.route.snapshot.data.detail;
    console.log(&#39;detail:&#39;, detail);
  }

}
Nach dem Login kopieren

Der Effekt ist wie folgt : 🎜🎜 Eine kurze Analyse von Lazy Loading, Guards und dynamischen Parametern beim Angular-Routing 🎜🎜Aufgrund von Wir haben Wachen zur Route /detail hinzugefügt, unabhängig davon, ob Sie von anderen Routen zur Route /detail wechseln oder direkt auf die Route /detailzugreifen > Route, Zugriff auf diese Seite nicht möglich. 🎜

Dynamische Routing-Parameter🎜🎜Es gibt viele Möglichkeiten, Parameter in das Routing einzubringen: 🎜
  • Parameter in den Pfad bringen
  • In queryString Mit Parametern
  • Ohne Parameter über Link

Mit Parametern im Pfad

rrreee

Parameter in queryString übergeben

🎜html-Parameter übergeben🎜rrreee🎜ts-Parameter🎜rrreee

Statische Parameter durch Daten übergeben

🎜Hinweis: Routing-Parameter Durchgegebene Daten können nur statisch sein. 🎜
rrreee

Dynamische Parameter, die durch Auflösung übergeben werden

🎜Daten können nur statische Parameter übergeben. Dann möchte ich die dynamischen Parameter übergeben von der Hintergrundschnittstelle durch Routing erhalten, was soll ich tun? 🎜🎜Die Antwort liegt in der resolve-Konfiguration. 🎜rrreee🎜Create Resolver🎜🎜detail.resolver.ts🎜rrreee🎜Fügen Sie eine Methode hinzu, um detaillierte Daten im Dienst zu erhalten🎜🎜detail.service.ts🎜rrreee🎜Dynamische Parameter abrufen🎜🎜Create.component🎜rrreee🎜detail.component .ts 🎜rrreee🎜Weitere Programmierkenntnisse finden Sie unter: 🎜Programmiervideo🎜! ! 🎜

Das obige ist der detaillierte Inhalt vonEine kurze Analyse von Lazy Loading, Guards und dynamischen Parametern beim Angular-Routing. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage