嵌套路由指的是在一个路由中嵌套另一个路由,从而组建起路由之间的多级嵌套关系。
Children 是专门配置子路由的属性:
项目截图:
app-routing.module.ts
import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; // 导入组件 import { PageListComponent } from './page-list/page-list.component'; import { PageOneComponent } from './page-list/page-one/page-one.component'; import { PageTwoComponent } from './page-list/page-two/page-two.component'; const routes: Routes = [ { path: 'page', component: PageListComponent, // 配置子路由 children:[ // path: '' 空路径: 当访问 http://localhost:4200/page 时,重定向到 page-one 页面 { path: '', redirectTo: 'one', pathMatch: 'full'}, { path: 'one', component: PageOneComponent, }, { path: 'two', component: PageTwoComponent, } ] } ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }
例子中,我们直接在根路由基础上配置了子路由,但如果想在 PageListComponent 组件中控制 PageOneComponent 和 PageTwoComponent 组件的显示,还必须在 PageListComponent 组件的模板上添加附属的
<router-outlet>
标签,作为子路由( children 属性中 )组件的出口。
page-list.component.html
<section> <router-outlet></router-outlet> </section>
我们知道,Angular 应用通常是由一个根模块和任意多个特性模块组成的,如果在初次加载时就将所有特性模块加载进来,必定会增加加载时间。因此,通过路由对特性模块进行惰性加载,使其在需要时才加载进来,才是最佳实践。
项目截图:
首先,需要对根路由进行修改,使用 loadChildren 属性指定需要惰性加载的特性模块:
例子:
app-routing.module.ts
import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: '', redirectTo: 'page', pathMatch: 'full' }, // loadChildren:指定需要惰性加载的特性模块 { path: 'page', loadChildren: () => import('./page-list/page-list.module').then(m => m.PageListModule) } ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }
然后,创建特性模块的附属路由,并对其进行配置:
page-list.routing.ts
import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; // 导入组件 import { PageListComponent } from './page-list.component'; import { PageOneComponent } from './page-one/page-one.component'; import { PageTwoComponent } from './page-two/page-two.component'; // 在附属路由中配置嵌套路由,这与在根路由配置形式基本一致 const routes: Routes = [ { path: '', component: PageListComponent, children:[ { path: '', redirectTo: 'one', pathMatch: 'full'}, { path: 'one', component: PageOneComponent, }, { path: 'two', component: PageTwoComponent, } ] } ]; @NgModule({ // 这里需要注意: 使用 RouterModule.forChild() 创建附属路由 imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class PageListRoutingModule { }
最后,同样的,需要在 PageListComponent 组件的模板上添加附属的 标签,作为子路由( children 属性中 )组件的出口。
page-list.component.html
<section> <router-outlet></router-outlet> </section>
*不管是配置根路由,还是配置附属路由,如果没有子路由( children 属性 ),则不需要附属 <router-outlet>
。
end