haizlin / fe-interview

前端面试每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天进步一点!每天早上5点纯手工发布面试题(死磕自己,愉悦大家),6000+道前端面试题全面覆盖,HTML/CSS/JavaScript/Vue/React/Nodejs/TypeScript/ECMAScritpt/Webpack/Jquery/小程序/软技能……
http://www.h-camel.com
MIT License
25.04k stars 3.24k forks source link

[angular] 第1881天 请说说在Angular中什么是RouterOutlet? #5843

Open haizhilin2013 opened 4 weeks ago

haizhilin2013 commented 4 weeks ago

第1881天 请说说在Angular中什么是RouterOutlet?

3+1官网

我也要出题

llccing commented 6 days ago

在 Angular 中,RouterOutlet 是一个指令,它充当路由器(Router)在应用程序中动态加载和显示组件的占位符。RouterOutlet 是 Angular 路由模块的核心部分,用于定义应用程序中的导航视图。

基本概念

RouterOutlet 指令通常放置在应用程序的主模板中,用于标记路由器应该插入匹配路由组件的位置。每当路由器导航到一个新的路由时,RouterOutlet 会加载并显示与该路由关联的组件。

使用示例

假设我们有一个简单的 Angular 应用程序,其中定义了几个路由和相应的组件。

定义路由

首先,我们在 app-routing.module.ts 中定义路由:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';

const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'about', component: AboutComponent }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

使用 RouterOutlet

在主模板 app.component.html 中使用 RouterOutlet

<nav>
  <a routerLink="/">Home</a>
  <a routerLink="/about">About</a>
</nav>
<router-outlet></router-outlet>

路由组件

定义两个简单的组件 HomeComponentAboutComponent

home.component.html

<h1>Home</h1>
<p>Welcome to the home page!</p>

about.component.html

<h1>About</h1>
<p>This is the about page.</p>

工作原理

  1. 导航链接:用户点击导航链接(例如 HomeAbout)。
  2. 路由匹配:Angular 路由器根据定义的路由表匹配相应的路由。
  3. 加载组件:匹配的组件会被动态加载,并插入到 RouterOutlet 指令所在的位置。

高级用法

嵌套路由

你可以在组件模板中使用多个 RouterOutlet 来实现嵌套路由。例如,在 AboutComponent 中嵌套子路由:

about-routing.module.ts

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AboutComponent } from './about.component';
import { TeamComponent } from './team/team.component';
import { HistoryComponent } from './history/history.component';

const routes: Routes = [
  { path: 'about', component: AboutComponent, children: [
    { path: 'team', component: TeamComponent },
    { path: 'history', component: HistoryComponent }
  ]}
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class AboutRoutingModule { }

about.component.html

<h1>About</h1>
<nav>
  <a routerLink="team">Team</a>
  <a routerLink="history">History</a>
</nav>
<router-outlet></router-outlet>

路由守卫

你可以使用路由守卫(Guards)来控制路由的访问,例如 CanActivateCanDeactivateResolve 等。

auth.guard.ts

import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';

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

  canActivate(): boolean {
    const isAuthenticated = // ... check authentication logic
    if (!isAuthenticated) {
      this.router.navigate(['/login']);
      return false;
    }
    return true;
  }
}

总结

通过使用 RouterOutlet,你可以创建复杂的导航结构,提升应用的用户体验和可维护性。