【Angular教程】路由入门

简介: 【Angular教程】路由入门

前言


路由的概念在前端的框架中得到了广泛的应用,对于路由的感念不做阐述,路由的应用无外乎就是嵌套、传参,高级一些的功能如懒加载、预加载,再高级一些的如:路由守卫等。本篇我们就一起来看一看在Angular中如何使用路由。


请按照图中结构来创建我们的项目

11.jpg


创建项目&一级模块:
  1. ng new angular-router-sample
  2. ng g c pages/login
  3. ng g c pages/home
  4. ng g c pages/mine

注:通过cli创建的组件会进行自动注册。


起步


1. 在App的html模板中配置

配置路由跳转&路由出口(router-outlet

<div>
  <a [routerLink]="['/login']">登陆</a>|
  <a [routerLink]="['/home']">首页</a>|
  <a [routerLink]="['/mine']">我的</a>
</div>
<!-- 配置路由出口 -->
<router-outlet></router-outlet>


2. 在App的app-routing中配置路由器

  1. 一个最简单的组件路由必备一个path(路由的Url)属性和一个component(Url对应加载的组件)属性:
const routes: Routes = [
  {
    path: 'login',
    component: LoginComponent,
  },
  {
    path: 'home',
    component: HomeComponent,
  },
  {
    path: 'mine',
    component: MineComponent,
  },
];


  1. 当我们意外访问了一个不存在的Url的时候我们的404页面怎么配置?

path支持一个特殊的通配符来支持“**”,当在路由表中没有成功匹配的情况下会最后指向通配符对应的组件

const routes: Routes = [
  ...
  {
    path: '**',
    component: NotFountComponent,
  },
];

注意:路由器匹配策略为先到先得,故不具体的路由配置靠后配置。


3. 设置有效的默认路由

由于我们项目默认启动后无具体路由匹配这样并不友好,我们需要设置一个有效的默认路由来展示给用户。

  1. 配置的默认路由应该在通配路由之上。
const routes: Routes = [
  ...
  { path: '', redirectTo: '/home', pathMatch: 'full' },
  ...
];


配置子模块&子路由


此时我们的路由配置全部app-routing,这样对于简单的应用当然是可行的,但是随着应用的迭代、模块的增加显然配置在一起对于管理和扩展都是一项挑战,模块的拆分就成来必然。


1. 为Home组件增加带路由的模块配置

通过cli为Home组件创建带路由的模块配置: ng generate module pages/home/home --module app --flat --routing

imports: [
    BrowserModule,
    HomeRoutingModule,
    AppRoutingModule,
]

注:用cli创建的模块会自动配置到根模块,但我们手动的调整一下顺序将AppRoutingModule移动到最后,满足先到先得的策略。


2. 将Home组件的路由配置转移到home-routing

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

注:配置好后就可以把app-routing 中的Home组件配置移除了。


3. 补充Home组模块的子组件并配置子路由

  1. 执行一下命令创建子组件
  1. ng g c pages/home/children/user-list
  2. ng g c pages/home/children/user-detail
  3. ng g c pages/home/children/edit-user
  1. 为Home路由器配置增加children属性来配置子组件路由
const routes: Routes = [{
  ...
  children: [
    {
      path: 'list',
      component: UserListComponent,
    },
    {
      path: 'detail',
      component: UserDetailComponent,
    },
    {
      path: 'edit',
      component: EditUserComponent,
    },
    {
      path: '',
      redirectTo: '/home/list',
      pathMatch: 'full'
    }
  ]
}];
  1. 同根组件一样配置子模块路由出口
<div>
  <a [routerLink]="['/home/list']">列表</a>|
  <a [routerLink]="['/home/edit']">编辑</a>|
  <a [routerLink]="['/home/detail']">详情</a>
</div>
<!-- 配置路由出口 -->
<router-outlet></router-outlet>
复制代码


路由传参


1. 在路由定义时配置需要携带的参数令牌

  1. 格式: 在路由配置的path后补充格式为/:key的令牌占位
{
  path: 'detail/:id',
  component: UserDetailComponent
}

注:这种将令牌插入到路由path中进行占位的方式中id是必须携带的参数。


  1. 通过routerLink携带参数
<a [routerLink]="['/hero', hero.id]">


  1. 在Angular获取路由参数需要用到ActivatedRoute:

使用ActivatedRoute前要在目标组件进行注入


  1. 方式1: 获取参数(路由参数变化可以被监听,适用于同一组件实例多次复用的情况)
this.route.paramMap.subscribe(
  (params: ParamMap) => {
    console.log('id :>> ', params.get('id'));
  }
)


  1. 方式2: 获取参数(只获取到初始值)
const id = this.route.snapshot.paramMap.get('id')!;


ParamMap API:

成员 说明
has(name) 如果参数名位于参数列表中,就返回 true
get(name) 如果这个 map 中有参数名对应的参数值(字符串),就返回它,否则返回 null。如果参数值实际上是一个数组,就返回它的第一个元素。
getAll(name) 如果这个 map 中有参数名对应的值,就返回一个字符串数组,否则返回空数组。当一个参数名可能对应多个值的时候,请使用 getAll
keys 返回这个 map 中的所有参数名组成的字符串数组。


2. 通过Router的navigate跳转页面

当前组件注入Router对象

  1. 无参数携带跳转:
this.router.navigate(['/home/list']);


  1. 携带参数跳转:
this.router.navigate(['/home/list', { id: this.userId, name: this.userName }]);

注:矩阵URL标记法:;id=101;name=bom


懒加载


懒加载的目的是将模块的挂载延迟到我们使用的时候,避免首次打开页面就进行整体加载导致页面长时间不可用。


1. 配置无组件路由(空路由)

对路由进行分组而不增加额外的路径片段

{
    path: 'home',
    loadChildren: () =>
      import('./pages/home/home.module').then((m) => m.HomeModule),
}


2. 移除根模块中关于Home模块的导入,使得模块完整分离

微调home-routing中home组件的path配置为""

const routes: Routes = [{
  path: '',
  component: HomeComponent,
  children: [
    ...
  ]
}];


3. 与懒加载相对的预加载

angular中配置懒加载后模块的加载被延迟到来使用时,但是有一些组件是需要优先加载并在使用的时候可以及时运行。


angular中的Router模块提供来两种预加载的策略:


  1. 完全不预加载,这是默认值。惰性加载的特性区仍然会按需加载。
  2. 预加载所有惰性加载的特性区。
  3. 修改方式:RouterModule.forRoot()的参数二的对象支持设置加载模式的属性preloadingStrategy
  1. PreloadAllModules: 预加载有所模块
  2. NoPreloading: 默认,不进行预加载
  1. 这么鸡肋的属性必须要支持自定义,我们来看一下:
  1. 在需要预加载的路由配置对象中添加data对象并增加preload属性,值设置为true表示开启预加载。
  2. 通过cli来生成一个服务用来完成我们的预加载策略:ng generate service selective-preloading-strategy
  3. 将我们创建的服务实现接口PreloadingStrategy
  4. 自定义的策略和默认支持的两种策略使用方法一致。
import { Injectable } from '@angular/core';
import { PreloadingStrategy, Route } from '@angular/router';
import { Observable, of } from 'rxjs';
@Injectable({
  providedIn: 'root',
})
export class SelectivePreloadingStrategyService implements PreloadingStrategy {
  preloadedModules: string[] = [];
  preload(route: Route, fn: () => Observable<any>): Observable<any> {
    // 通过检查路由配置来决定是否做预加载
    if (route.data && route.data.preload && route.path != null) {
      // 参数1: 要加载的路由
      this.preloadedModules.push(route.path);
      // 参数2: 加载器
      return fn();
    } else {
      return of(null);
    }
  }
}


结语


以上就是最近对Angular路由的学习整理,对于路由还有一块守卫没有提到,我们抽时间再来整理一下。



相关文章
|
7月前
|
JavaScript 前端开发 应用服务中间件
angular引入包、路由权限配置、打包问题与nginx配置问题(简单部署)
angular引入包、路由权限配置、打包问题与nginx配置问题(简单部署)
169 0
|
4月前
|
Java Spring
🔥JSF 与 Spring 强强联手:打造高效、灵活的 Web 应用新标杆!💪 你还不知道吗?
【8月更文挑战第31天】JavaServer Faces(JSF)与 Spring 框架是常用的 Java Web 技术。本文介绍如何整合两者,发挥各自优势,构建高效灵活的 Web 应用。首先通过 `web.xml` 和 `ContextLoaderListener` 配置 Spring 上下文,在 `applicationContext.xml` 定义 Bean。接着使用 `@Autowired` 将 Spring 管理的 Bean 注入到 JSF 管理的 Bean 中。
71 0
|
4月前
|
iOS开发 Android开发 MacOS
从零到全能开发者:解锁Uno Platform,一键跨越多平台应用开发的神奇之旅,让你的代码飞遍Windows、iOS、Android、macOS及Web,技术小白也能秒变跨平台大神!
【8月更文挑战第31天】从零开始,踏上使用Uno Platform开发跨平台应用的旅程。只需编写一次代码,即可轻松部署到Windows、iOS、macOS、Android及Web(通过WASM)等多个平台。Uno Platform为.NET生态带来前所未有的灵活性和效率,简化跨平台开发。首先确保安装了Visual Studio或VS Code及.NET SDK,然后选择合适的项目模板创建新项目。项目结构类似传统.NET MAUI或WPF项目,包含核心NuGet包。通过简单的按钮示例,你可以快速上手并构建应用。Uno Platform让你的技术探索之旅充满无限可能。
89 0
|
4月前
|
SEO 搜索推荐 数据采集
让 JSF 应用秒变搜索引擎宠儿!揭秘 SEO 优化的神奇魔法,让你的网站脱颖而出!
【8月更文挑战第31天】随着互联网的发展,搜索引擎已成为用户获取信息的主要途径,SEO 对 Web 应用至关重要。本文介绍如何提升 JavaServer Faces(JSF)应用的 SEO 友好性,包括关键词优化、网页结构优化和外部链接建设等基础知识,并提出了使用语义化 HTML 标签、优化页面标题和描述、生成静态 HTML 页面及 URL 重写等具体策略,帮助您的网站在搜索引擎中获得更高排名。
34 0
|
4月前
|
开发者 前端开发 开发框架
JSF与移动应用,开启全新交互体验!让你的Web应用轻松征服移动设备,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,移动设备的普及使得构建移动友好的应用变得至关重要。尽管JSF(JavaServer Faces)主要用于Web应用开发,但结合Bootstrap等前端框架,也能实现优秀的移动交互体验。本文探讨如何在JSF应用中实现移动友好性,并通过示例代码展示具体实现方法。使用Bootstrap的响应式布局和组件可以确保JSF页面在移动设备上自适应,并提供友好的表单输入和提交体验。尽管JSF存在组件库较小和学习成本较高等局限性,但合理利用其特性仍能显著提升用户体验。通过不断学习和实践,开发者可以更好地掌握JSF应用的移动友好性,为Web应用开发贡献力量。
53 0
|
4月前
|
安全 开发者
精通Angular路由管理:从基础设置到高级配置,打造复杂SPA导航系统的全方位指南
【8月更文挑战第31天】在单页应用(SPA)中,路由管理至关重要。Angular通过其强大的路由模块提供灵活高效的解决方案。本文通过代码示例详细介绍如何在Angular中设置和管理路由,包括基础路由配置、懒加载、路由保护及高级配置,帮助开发者构建高效安全的导航系统,满足复杂SPA需求。随着Angular的发展,路由管理将更加完善,值得持续关注。
44 0
|
4月前
|
前端开发 UED
Angular 动画教程超赞!掌握让应用更具交互性的技巧,开启精彩的前端动画之旅!
【8月更文挑战第31天】在现代前端开发中,提升用户体验至关重要,而动画是增强应用交互性的有效手段。Angular 提供了强大的动画功能,可轻松添加各种动画效果。本文介绍了 Angular 动画的基本概念、使用动画模块、事件触发动画、动画序列与并行执行、性能优化及结合第三方动画库等最佳实践。通过遵循这些实践,可以充分发挥 Angular 动画的优势,提升用户体验。下面是一个简单的示例应用,展示了如何使用 Angular 动画实现元素的显示和隐藏效果。
67 0
|
4月前
|
JavaScript 前端开发 API
如何在 Angular 路由中使用路由解析器
如何在 Angular 路由中使用路由解析器
40 0
|
4月前
如何在 Angular 路由中使用路由守卫
如何在 Angular 路由中使用路由守卫
54 0
|
4月前
如何在 Angular 路由中使用查询参数
如何在 Angular 路由中使用查询参数
33 0