This article will give you an in-depth understanding of routing in Angular, look at how to get started quickly, and introduce matching rules, routing parameters, routing nesting, routing guards, etc. I hope it will be useful to everyone. Helped!
In Angular
, routing is based on modules, and each module can have its own route. [Related tutorial recommendations: "angular tutorial"]
Create page components, Layout
components andNavigation
Component, used for routing
CreateHomepagePage componentng g c pages/home
CreateAbout usPage componentsng g c pages/about
LayoutComponentng g c pages/layout
NavigationComponentng g c pages/navigation
// app.module.ts import { Routes } from "@angular/router" const routes: Routes = [ { path: "home", component: HomeComponent }, { path: "about", component: AboutComponent } ]
// app.module.ts import { RouterModule, Routes } from "@angular/router" @NgModule({ imports: [RouterModule.forRoot(routes, { useHash: true })], }) export class AppModule {}
<!-- 路由插座即占位组件 匹配到的路由组件将会显示在这个地方 --> <router-outlet></router-outlet>
<a routerLink="/home">首页</a> <a routerLink="/about">关于我们</a>
1, Redirect
const routes: Routes = [ { path: "home", component: HomeComponent }, { path: "about", component: AboutComponent }, { path: "", // 重定向 redirectTo: "home", // 完全匹配 pathMatch: "full" } ]
2,404<span style="font-size: 16px;"></span>
Page
const routes: Routes = [ { path: "home", component: HomeComponent }, { path: "**", component: NotFoundComponent } ]
<a routerLink="/about" [queryParams]="{ name: 'kitty' }">关于我们</a>
import { ActivatedRoute } from "@angular/router" export class AboutComponent implements OnInit { constructor(private route: ActivatedRoute) {} ngOnInit(): void { this.route.queryParamMap.subscribe(query => { query.get("name") }) } }
2. Dynamic parameters
const routes: Routes = [ { path: "home", component: HomeComponent }, { path: "about/:name", component: AboutComponent } ]
<a [routerLink]="['/about', 'zhangsan']">关于我们</a>
import { ActivatedRoute } from "@angular/router" export class AboutComponent implements OnInit { constructor(private route: ActivatedRoute) {} ngOnInit(): void { this.route.paramMap.subscribe(params => { params.get("name") }) } }
const routes: Routes = [ { path: "about", component: AboutComponent, children: [ { path: "introduce", component: IntroduceComponent }, { path: "history", component: HistoryComponent } ] } ]
<!-- about.component.html --> <app-layout> <p>about works!</p> <a routerLink="/about/introduce">公司简介</a> <a routerLink="/about/history">发展历史</a> <div> <router-outlet></router-outlet> </div> </app-layout>
{ path: "about", component: AboutComponent, children: [ { path: "introduce", component: IntroduceComponent, outlet: "left" }, { path: "history", component: HistoryComponent, outlet: "right" } ] }
<!-- about.component.html --> <app-layout> <p>about works!</p> <router-outlet name="left"></router-outlet> <router-outlet name="right"></router-outlet> </app-layout>
<a [routerLink]="[ '/about', { outlets: { left: ['introduce'], right: ['history'] } } ]" >关于我们</a>
<!-- app.component.html --> <button (click)="jump()">跳转到发展历史</button>
// app.component.ts import { Router } from "@angular/router" export class HomeComponent { constructor(private router: Router) {} jump() { this.router.navigate(["/about/history"], { queryParams: { name: "Kitty" } }) } }
import { NgModule } from "@angular/core" import { HomeComponent } from "./pages/home/home.component" import { NotFoundComponent } from "./pages/not-found/not-found.component" const routes: Routes = [ { path: "", component: HomeComponent }, { path: "**", component: NotFoundComponent } ] @NgModule({ declarations: [], imports: [RouterModule.forRoot(routes, { useHash: true })], // 导出 Angular 路由功能模块,因为在根模块的根组件中使用了 RouterModule 模块中提供的路由插座组件 exports: [RouterModule] }) export class AppRoutingModule {}
import { BrowserModule } from "@angular/platform-browser" import { NgModule } from "@angular/core" import { AppComponent } from "./app.component" import { AppRoutingModule } from "./app-routing.module" @NgModule({ declarations: [AppComponent], imports: [BrowserModule, AppRoutingModule], providers: [], bootstrap: [AppComponent] }) export class AppModule {}
ng g m user --routing=true and create the routing module of this module
ng g c user/pages/login
ng g c user/pages/register
import { NgModule } from "@angular/core" import { Routes, RouterModule } from "@angular/router" import { LoginComponent } from "./pages/login/login.component" import { RegisterComponent } from "./pages/register/register.component" const routes: Routes = [ { path: "login", component: LoginComponent }, { path: "register", component: RegisterComponent } ] @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class UserRoutingModule {}
// app-routing.module.ts const routes: Routes = [ { path: "user", loadChildren: () => import("./user/user.module").then(m => m.UserModule) } ]
<a routerLink="/user/login">登录</a> <a routerLink="/user/register">注册</a>
boolean or
Observable \ or
Promise \, they At some point in the future resolves to a Boolean value
1, CanActivate<span style="font-size: 16px;"></span>
CanActivate is an interface, and the route guard class must implement this interface. This interface stipulates that the class needs to have a
canActivate method, which determines whether to allow access to the target route.
ng guard guards/auth
import { Injectable } from "@angular/core" import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from "@angular/router" import { Observable } from "rxjs" @Injectable({ providedIn: "root" }) export class AuthGuard implements CanActivate { constructor(private router: Router) {} canActivate(): boolean | UrlTree { // 用于实现跳转 return this.router.createUrlTree(["/user/login"]) // 禁止访问目标路由 return false // 允许访问目标路由 return true } }
{ path: "about", component: AboutComponent, canActivate: [AuthGuard] }
2、CanActivateChild<span style="font-size: 16px;"> </span>
ng g guard guards/admin
Note: To selectCanActivateChild
, you need to move the arrow to this option and Hit space to confirm selection
import { Injectable } from "@angular/core" import { CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from "@angular/router" import { Observable } from "rxjs" @Injectable({ providedIn: "root" }) export class AdminGuard implements CanActivateChild { canActivateChild(): boolean | UrlTree { return true } }Copy after login{ path: "about", component: AboutComponent, canActivateChild: [AdminGuard], children: [ { path: "introduce", component: IntroduceComponent } ] }Copy after login
3,CanDeactivate<span style="font-size: 16px;"></span>
import { Injectable } from "@angular/core" import { CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from "@angular/router" import { Observable } from "rxjs" export interface CanComponentLeave { canLeave: () => boolean } @Injectable({ providedIn: "root" }) export class UnsaveGuard implements CanDeactivate<CanComponentLeave> { canDeactivate(component: CanComponentLeave): boolean { if (component.canLeave()) { return true } return false } }
{ path: "", component: HomeComponent, canDeactivate: [UnsaveGuard] }
import { CanComponentLeave } from "src/app/guards/unsave.guard" export class HomeComponent implements CanComponentLeave { myForm: FormGroup = new FormGroup({ username: new FormControl() }) canLeave(): boolean { if (this.myForm.dirty) { if (window.confirm("有数据未保存, 确定要离开吗")) { return true } else { return false } } return true }
4, Resolve <span style="font-size: 16px;"></span>
$ ng g resolver <name>
import { Injectable } from "@angular/core" import { Resolve } from "@angular/router" type returnType = Promise<{ name: string }> @Injectable({ providedIn: "root" }) export class ResolveGuard implements Resolve<returnType> { resolve(): returnType { return new Promise(function (resolve) { setTimeout(() => { resolve({ name: "张三" }) }, 2000) }) } }
{ path: "", component: HomeComponent, resolve: { user: ResolveGuard } }
export class HomeComponent { constructor(private route: ActivatedRoute) {} ngOnInit(): void { console.log(this.route.snapshot.data.user) } }
programmingvideo! !
The above is the detailed content of Learn more about routing in Angular and how to get started quickly?. For more information, please follow other related articles on the PHP Chinese website!