ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] 本指南介绍了如何使用Ionic和Angular构建路由和应用程序。 Angular Router是Angular应用程序中最重要的库之一。没有它,应用程序将是单视图/单个上下文应用程序,或者无法在浏览器重新加载时维护其导航状态。使用Angular Router,我们可以创建可链接且具有丰富动画的丰富应用程序(当然与Ionic配对时)。让我们看一下Angular路由器的基础知识以及我们如何为Ionic应用程序配置它。 ## 一条简单的路线 对于大多数应用程序,通常需要使用某种路径。最基本的配置看起来有点像这样: ~~~ import { RouterModule } from '@angular/router'; @NgModule({ imports: [ ... RouterModule.forRoot([ { path: imports: [ ... RouterModule.forRoot([ { path: '', component: LoginComponent }, { path: { path: 'detail', component: DetailComponent }, ]) ], }) ]) ], }) ~~~ 我们这里最简单的细分是路径/组件查找。当我们的应用程序加载时,路由器会通过读取用户尝试加载的URL来启动。在我们的示例中,我们的路线寻找`''`,这基本上是我们的索引路线。所以为此,我们加载了`LoginComponent`。非常坦率的。对于路由器配置中的每个条目,这种与组件匹配的路径模式都会继续。但是如果我们想在初始加载时加载不同的路径呢? ## 处理重定向 为此,我们可以使用路由器重定向。重定向的工作方式与典型路由对象的工作方式相同,但只包含一些不同的密钥。 ~~~ [ { path: { path: '', redirectTo: 'login', pathMatch: 'full' }, { path: { path: 'login', component: LoginComponent }, { path: { path: 'detail', component: DetailComponent } ]; ]; ~~~ 在我们的重定向中,我们寻找应用程序的索引路径。然后,如果我们加载它,我们重定向到`login`路线。最后一个密钥`pathMatch`需要告诉路由器它应该如何查找路径。 自从我们使用以来`full`,我们告诉路由器我们应该比较完整路径,即使最终是类似的`/route1/route2/route3`。意思是如果我们有: ~~~ { path: '/route1/route2/route3', redirectTo: 'login', pathMatch: 'full' }, { path: { path: 'login', component: LoginComponent }, ~~~ 并加载`/route1/route2/route3`我们将重定向。但是如果我们加载了`/route1/route2/route4`,我们就不会重定向,因为路径不完全匹配。 或者,如果我们使用: ~~~ { path: '/route1/route2', redirectTo: 'login', pathMatch: 'prefix' }, { path: { path: 'login', component: LoginComponent }, ~~~ 然后同时加载`/route1/route2/route3`和`/route1/route2/route4`,我们会被重定向的两条路线。这是因为`pathMatch: 'prefix'`只匹配部分路径。 ## 导航到不同的路线 谈论路线是好的,但是如何实际导航到所述路线?为此,我们可以使用该`routerLink`指令。让我们回过头来看看我们之前简单的路由器设置: ~~~ RouterModule.forRoot([ { path: { path: '', component: LoginComponent }, { path: { path: 'detail', component: DetailComponent } ]); ]); ~~~ 现在`LoginComponent`,我们可以使用以下HTML导航到详细路径。 ~~~ <ion-header> <ion-toolbar> <ion-title>Login</ion-title> </ion-toolbar> </ion-header> <ion-content padding> <ion-button [routerLink]="['/detail']">Go to detail</ion-button> </ion-content> ~~~ 这里的重要部分是`ion-button`和`routerLink`指令。RouterLink的工作原理与典型`href`的类似,但不是将URL构建为字符串,而是可以构建为数组,这可以提供更复杂的路径。 我们还可以使用路由器API以编程方式在我们的应用程序中导航。 ~~~ import { Component } from '@angular/core'; import { Router } from '@angular/router'; @Component({ ... }) ... }) export class LoginComponent { constructor(private router: Router){} navigate(){ navigate(){ this.router.navigate(['/detail']) } } } } ~~~ 两个选项都提供相同的导航机制,只适合不同的用例。 > 关于使用相对URL进行导航的说明:目前,为了支持多个导航堆栈,不支持相对URL ## 懒加载路线 现在我们的路由设置的当前方式使得它们被包含在与根app.module相同的块中,这是不理想的。相反,路由器有一个设置,允许组件隔离到自己的块。 ~~~ import { RouterModule } from '@angular/router'; @NgModule({ imports: [ ... RouterModule.forRoot([ { path: imports: [ ... RouterModule.forRoot([ { path: '', redirectTo: 'login', pathMatch: 'full' }, { path: { path: 'login', loadChildren: './login/login.module#LoginModule' }, { path: { path: 'detail', loadChildren: './detail/detail.module#DetailModule' } ]) ], }) ]) ], }) ~~~ 虽然类似,但`loadChildren`属性是一种通过字符串而不是直接引用模块来引用模块的方法。为了做到这一点,我们需要为每个组件创建一个模块。 ~~~ ... import { RouterModule } from '@angular/router'; import { LoginComponent } from './login.component'; @NgModule({ imports: [ ... RouterModule.forChild([ { path: imports: [ ... RouterModule.forChild([ { path: '', component: LoginComponent }, ]) ], }) ]) ], }) ~~~ > 我们排除了一些额外的内容,仅包括必要的部分。 在这里,我们有一个典型的角度模块设置,以及一个RouterModule导入,但我们现在正在使用`forChild`和声明该设置中的组件。通过这种设置,当我们运行构建时,我们将为app组件,登录组件和detail组件生成单独的块。 ## 使用标签 使用Tabs,Angular Router提供Ionic机制来了解应该加载哪些组件,但繁重的工作实际上是由tabs组件完成的。我们来看一个简单的例子。 ~~~ const routes: Routes = [ { path: { path: 'tabs', component: TabsPage, children: [ { path: component: TabsPage, children: [ { path: 'tab1', children: [ { path: children: [ { path: '', loadChildren: loadChildren: '../tab1/tab1.module#Tab1PageModule' } ] }, { path: } ] }, { path: '', redirectTo: redirectTo: '/tabs/tab1', pathMatch: pathMatch: 'full' } ] }, { path: } ] }, { path: '', redirectTo: redirectTo: '/tabs/tab1', pathMatch: pathMatch: 'full' } ]; } ]; ~~~ 这里我们有一个“标签”路径,我们加载。在此示例中,我们将路径称为“tabs”,但路径的名称将打开以进行更改。它们可以被称为适合您的应用程序。在该路由对象中,我们也可以定义子路由。在此示例中,顶级子路由“tab1”充当我们的“出口”,并且可以加载其他子路由。对于此示例,我们有一个子子路由,它只加载一个新组件。选项卡的标记如下: ~~~ <ion-tabs> <ion-tab-bar slot="bottom"> <ion-tab-button tab="tab1"> <ion-icon name="flash"></ion-icon> <ion-label>Tab One</ion-label> </ion-tab-button> </ion-tab-bar> </ion-tabs> ~~~ 如果您之前使用Ionic构建应用程序,这应该会让您感到熟悉。我们创建一个`ion-tabs`组件,并提供一个`ion-tab-bar`。在`ion-tab-bar`提供了一个`ion-tab-button`具有`tab`一个与在路由器配置的标签“出口”相关联的属性。请注意,最新版本`@ionic/angular`不再需要`<ion-tab>`,但允许开发人员完全自定义选项卡栏,并且单一事实源存在于路由器配置中。