为了账号安全,请及时绑定邮箱和手机立即绑定

路由之嵌套路由与惰性加载

嵌套路由

嵌套路由指的是在一个路由中嵌套另一个路由,从而组建起路由之间的多级嵌套关系。
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 组件的模板上添加附属的 <router-outlet> 标签,作为子路由( children 属性中 )组件的出口。

page-list.component.html

<section>
  <router-outlet></router-outlet>
</section>

*不管是配置根路由,还是配置附属路由,如果没有子路由( children 属性 ),则不需要附属 <router-outlet>


end

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
1.4万
获赞与收藏
860

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消