angualr2之路由与导航(一)
1. 唯一根模块式组件导航
在唯一根模块式组件导航中,全局只有一个模块,即根模块。
1.1 根模块
在根模块中,需要导入所有组件及其对应的服务,并将组件加入声明,将其对应的服务加入提供商。
// app.module.ts
// 导入组件
import { AppComponent } from './app.component';
import { LoginComponent } from './login/login.component';
import { MenuComponent } from './menu/menu.component';
import { M0201Component } from './m0201/m0201.component';
import { M0202Component } from './m0202/m0202.component';
import { M0301Component } from './m0301/m0301.component';
import { M0302Component } from './m0302/m0302.component';
// 导入服务
import { UserLogin } from './service/userlogin';
import { MenuService } from './service/menu.service';
import { M0201Service } from './service/m0201.service';
import { M0202Service } from './service/m0202.service';
import { M0301Service } from './service/m0301.service';
import { M0302Service } from './service/m0302.service';
@NgModule({
declarations: [
AppComponent,
LoginComponent,
MenuComponent,
M0201Component,
M0202Component,
M0301Component,
M0302Component,
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
...
],
providers: [
UserLogin,
MenuService,
M0201Service,
M0202Service,
M0301Service,
M0302Service,
],
bootstrap: [AppComponent]
})
1.2 根路由
在根路由中,需要导入所有组件,并配置其路由路径
// app.routing.ts
// 导入组件
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { LoginComponent } from './login/login.component';
import { MenuComponent } from './menu/menu.component';
import { M0201Component } from './m201/m0103.component';
import { M0202Component } from './m0104/m0104.component';
import { M0301Component } from './m0301/m0301.component';
import { M0302Component } from './m0302/m0302.component';
// 定义路由
const routes: Routes = [
{ path: '', redirectTo: '/login', pathMatch: 'full' },
{ path: 'menu/0104/0201', redirectTo: '/menu/0201', pathMatch: 'full' },
{ path: 'menu/0104/0202', redirectTo: '/menu/0202', pathMatch: 'full' },
{ path: 'menu/0104/0301', redirectTo: '/menu/0301', pathMatch: 'full' },
{ path: 'menu/0104/0302', redirectTo: '/menu/0302', pathMatch: 'full' },
{ path: 'login', component: LoginComponent },
{ path: 'menu', component: MenuComponent,
children: [
{ path: '0201', component: M0201Component },
{ path: '0202', component: M0202Component },
{ path: '0301', component: M0301Component },
{ path: '0302', component: M0302Component },
]
}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
当首次加载页面时,指向 /login ,默认加载路径为空,则加载组件 LoginComponent ,当页面指向发生更改,指向 /menu/0302 时,则重新寻找其对应的路径,即 menu/0104/0302,此时,加载组件被设置为 M0302Component ,那么,页面导航便在这些组件当中往复跳转。
1.3 英雄组件实例
// app.module.ts
import { AppComponent } from './app.component';
import { DashboardComponent } from './dashboard-component/dashboard.component';
import { HeroesComponent } from './heroes-component/heroes.component';
import { HeroService } from './hero-service/hero.service';
@NgModule({
imports: [
BrowserModule,
FormsModule,
...
],
declarations: [
AppComponent,
DashboardComponent,
HeroDetailComponent,
],
providers: [
HeroService
],
bootstrap: [ AppComponent ]
})
// app.routing.module.ts
import { HeroesComponent } from './heroes-component/heroes.component';
import { DashboardComponent } from './dashboard-component/dashboard.component';
const routes: Routes = [
{ path: '', redirectTo: 'dashboard', pathMatch: 'full' },
{ path: 'dashboard', component: DashboardComponent },
{ path: 'heroes', component: HeroesComponent }
];
@NgModule({
imports: [ RouterModule.forRoot(routes) ],
exports: [ RouterModule ]
})
2. 父子模块式路由导航
在父子模块式路由导航中,全局包含一个根模块,一个根路由,以及多个子模块,子模块中含有一个或多个组件。在根模块中,将导入所有子模块,在根路由中,将导入所有子模块中的组件,这样,就无需在根模块中导入这些组件的服务。
// app.module.ts
import { AppComponent } from './app.component';
import {IndexModule} from './index/index.module';
import {CreatMemberModule} from './creat-member/creat-member.module';
@NgModule({
declarations: [
AppComponent
],
imports: [
IndexModule,
CreatMemberModule,
],
providers: [],
bootstrap: [AppComponent]
})
// app.routing.module.ts
import {IndexComponent} from './index/index.component';
import {CreatMemberComponent} from './creat-member/creat-member.component';
const routes: Routes = [
{ path: '', redirectTo: '/index', pathMatch: 'full' },
{ path: 'index', component: IndexComponent },
{ path: 'creat-member', component: CreatMemberComponent },
];
@NgModule({
imports: [ RouterModule.forRoot(routes) ],
exports: [ RouterModule ]
})
// index.module.ts
import { IndexComponent } from './index.component';
import { indexService } from './index.service';
import { CommonModule } from '@angular/common';
@NgModule({
imports: [
CommonModule,
],
providers: [indexService],
declarations: [IndexComponent]
})
3. 惰性加载式一级路由导航
与父子模块式路由导航大同小异,在惰性加载式路由导航中,将为每个子模块添加路由,即设置子路由,然后将子路由导入到子模块,再将子模块引入到根路由中以惰性加载形式呈现,这样就不需要在根路由中导入组件本身。
// app.module.ts
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpModule,
...
],
providers: [],
bootstrap: [AppComponent]
})
// app.routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{ path: '', redirectTo: 'index', pathMatch: 'full' },
{ path: 'index', loadChildren: 'app/index/index.module#IndexModule' },
{ path: 'creat-member', loadChildren: 'app/creat-member/creat-member.module#CreatMemberModule' },
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
// index.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { IndexRoutingModule } from './index-routing.module';
import { IndexComponent } from './index.component';
import { indexService } from './index.service';
@NgModule({
imports: [
CommonModule,
IndexRoutingModule,
],
providers: [indexService],
declarations: [IndexComponent]
})
// index-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { IndexComponent } from './index.component';
@NgModule({
imports: [RouterModule.forChild([
{ path: '', component: IndexComponent }
])],
exports: [RouterModule]
})
4. 惰性加载式二级路由导航
惰性加载二级路由时,基本设置与3中保持不变。区别在于在惰性加载一级相应路由模块之后,在某一模块内,还存在内部路由,导航指向该模块时,指明其内部路由路径时,即可惰性加载该模块。
// app.routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const appRoutes: Routes = [
{ path: '', redirectTo: 'index', pathMatch: 'full' },
{ path: 'index', loadChildren: 'app/index/index.module#IndexModule' },
{ path: 'router-nav', loadChildren: 'app/router-nav/router-nav.module#RouterNavModule' },
];
@NgModule({
imports: [RouterModule.forRoot(appRoutes)],
exports: [RouterModule]
})
// router-nav.module.ts
/import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterNavComponent } from './router-nav.component';
import { RouterNavRoutingModule} from './router-nav-routing.module';
@NgModule({
imports: [
CommonModule,
RouterNavRoutingModule,
],
declarations: [RouterNavComponent]
})
// router-nav-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { RouterNavComponent } from './router-nav.component';
const appChildRoutes: Routes = [
{
path: '', component: RouterNavComponent,
children: [
{ path: '', redirectTo: 'creat-member', pathMatch: 'full' },
{ path: 'creat-member', loadChildren: 'app/creat-member/creat-member.module#CreatMemberModule' },
{ path: 'task-info', loadChildren: 'app/task-info/task-info.module#TaskInfoModule' }
]
}
];
@NgModule({
imports: [RouterModule.forChild(appChildRoutes)],
exports: [RouterModule]
})
5. 预加载惰性模块
在开发中,大量使用惰性加载,会造成页面加载迟缓,此处,我们将对惰性加载模块进行预加载,并且改惰性加载二级子模块为直接加载组件,减少中间交互层。
// app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes, PreloadAllModules } from '@angular/router';
const appRoutes: Routes = [
{ path: '', redirectTo: 'index', pathMatch: 'full' },
{ path: 'index', loadChildren: 'app/index/index.module#IndexModule' },
{ path: 'router-nav', loadChildren: 'app/router-nav/router-nav.module#RouterNavModule' },
];
@NgModule({
imports: [RouterModule.forRoot(appRoutes, { preloadingStrategy: PreloadAllModules })], //预加载
exports: [RouterModule]
})
// router-nav.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterNavComponent } from './router-nav.component';
import { RouterNavRoutingModule } from './router-nav-routing.module';
import { CreatMemberComponent } from './creat-member/creat-member.component';
import { CreatMemberService } from './creat-member/creat-member.service';
@NgModule({
imports: [
CommonModule,
RouterNavRoutingModule,
...
],
declarations: [
RouterNavComponent,
CreatMemberComponent,
],
providers: [
CreatMemberService,
]
})
// router-nav-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { RouterNavComponent } from './router-nav.component';
import { CreatMemberComponent } from './creat-member/creat-member.component';
const appChildRoutes: Routes = [
{
path: '', component: RouterNavComponent,
children: [
{ path: '', redirectTo: 'creat-member', pathMatch: 'full' },
{ path: 'creat-member', component: CreatMemberComponent },
{ path: 'project-center', component: ProjectCenterComponent },
]
}
];
@NgModule({
imports: [RouterModule.forChild(appChildRoutes)],
exports: [RouterModule]
})
angualr2之路由与导航(一)的更多相关文章
- 纯小白入手 vue3.0 CLI - 3.3 - 路由的导航守卫
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...
- Blazor 路由及导航开发指南
翻译自 Waqas Anwar 2021年4月2日的文章 <A Developer's Guide To Blazor Routing and Navigation> [1] 检查传入的请 ...
- 5分钟学会vue中的路由守卫(导航守卫)
在项目开发中每一次路由的切换或者页面的刷新都需要判断用户是否已经登录,前端可以判断,后端也会进行判断的,我们前端最好也进行判断. vue-router提供了导航钩子:全局前置导航钩子 beforeEa ...
- 【Flutter学习】页面跳转之路由及导航
一,概述 移动应用通常通过成为‘屏幕’或者‘页面’的全屏元素显示其内容,在Flutter中,这些元素统称为路由,它们由导航器Navigator组件管理.导航器管理一组路由Route对象,并提供了管理堆 ...
- vue学习指南:第十四篇(详细) - Vue的 路由 第四篇 ( 路由的导航守卫 )
导航守卫 一.全局导航守卫 1. 全局导航守卫,把方法给 router,只要路由发生改变跳转都会触发这个函数 2. 每个路由 都有一个 meta 3. 全局导航守卫分两种: 1. 全局前置导航守卫:路 ...
- 通俗理解vue路由的导航钩子中关于next()
1 背景:你乘坐汽车从A景区想赶往B景区(模拟路由A跳转到路由B) 1.next() 你乘坐汽车要从A景区到B景区,路过关卡时,守门人拦下你,你量出了next(),守门人一看没问题,赶紧放行,于是你顺 ...
- 「Vue」起步 - vue-router路由与页面间导航
vue-router 我们知道路由定义了一系列访问的地址规则,路由引擎根据这些规则匹配找到对应的处理页面,然后将请求转发给页进行处理.可以说所有的后端开发都是这样做的,而前端路由是不存在"请 ...
- Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子]
前言 说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子(created,mounted),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比 ...
- vue使用JS的形式进行路由导航
// 注意: 一定要区分 this.$route 和 this.$router 这两个对象, // 其中: this.$route 是路由[参数对象],所有路由中的参数, params, query ...
随机推荐
- 13.multi_match实现dis_max+tie_breaker
主要知识点: 基于multi_match语法实现dis_max+tie_breaker 1.best_fields+tie_breaker GET /forum/article/_search ...
- 在docker上构建tomcat容器
1.查看docker上的镜像 [root@holly ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.6 73829d7b ...
- Vue2构建项目实战
转载整理自http://blog.csdn.net/fungleo/article/details/77575077 vue构建单页应用原理 SPA 不是指水疗.是 single page web a ...
- 清北学堂模拟赛d1t5 拍照(photo)
题目描述 假设这是一个二次元.LYK召集了n个小伙伴一起来拍照.他们分别有自己的身高Hi和宽度Wi.为了放下这个照片并且每个小伙伴都完整的露出来,必须需要一个宽度为ΣWi,长度为max{Hi}的相框. ...
- 并行输入\输出控制器之我见(PIO)
中断信号FIQ及IRQ0到IRQn一般通过PIO控制器复用.但是,由于PIO控制器对于输入无效且中断线(FIQ或IRQ)仅作为输入,因此不必为中断分配I/0线. 电源管理控制器控制P ...
- 洛谷——P1031 均分纸牌
https://www.luogu.org/problem/show?pid=1031#sub 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以 ...
- 记一次ruby的安装
1,下载rubyinstall 安装包及devkit包 登陆网站 :http://rubyinstaller.org/downloads/ 安装rubyinstall包时添加到环境变量 2,安装完in ...
- jquery-radio 事件监听以及取值
$("input:radio[name='ssx']").change(function (){ alert( $(this).val()); alert($("inpu ...
- FOJ 10月赛题 FOJ2198~2204
A题. 发现是递推可以解决这道题,a[n]=6*a[n-1]-a[n-2].因为是求和,可以通过一个三维矩阵加速整个计算过程,主要是预处理出2^k时的矩阵,可以通过这道题 #include <i ...
- ustc 1117
无根树同构 有两种方法,一种是确定其中一棵树,另一棵树枚举根节点. 一种是,利用拓扑排序,先确定其中一棵树.另一棵树,若拓扑后剩两个节点,则枚举这两个节点为根结点,否则,只需做一次.注意,无根树节点入 ...