ionic4/angular路由配置与导航传参

前言

  • 由于angular官网路由与导航章节介绍的内容太多、太复杂,本文本着实用的目的介绍angular路由的常用配置及导航传参
  • 阅读本文前,建议先阅读[ionic官网路由与导航内容

路由配置

  • 常见的路由配置如下代码,配置说明看代码上的注释,后面还有重难点说明
import { RouterModule } from '@angular/router';

@NgModule({
  imports: [
  ...
  RouterModule.forRoot([
    // 若app启动地址为http://localhost:8100/,则访问LoginPage
    { path: '', component: LoginPage },

    // 访问http://localhost:8100/main,则跳转至mainPage
    { path: 'main', component: mainPage },

    // loadChildren懒加载,参数值是相对模块文件所在路径
    // 访问http://localhost:8100/register,才去加载资源
    // 建议app一级页面使用component,二级页面均使用loadChildren
    {path: 'register', loadChildren: './pages/login/register/register.module#RegisterPageModule'}

     // 访问http://localhost:8100/detail/2,则访问DetailPage,id为动态参数
     {path: 'detail/:id', component: DetailPage },

     // 访问main/666重定向到mainPage
     {path: 'main/666', redirectTo: '/main',  pathMatch: 'full' },

     // pathMatch: 'prefix',访问main/666、main/xxx、main/abc,均跳转到mainPage
     {path: 'main', redirectTo: '/main',  pathMatch: 'prefix' },

     // 路径匹配不到则访问NotFoundPage
     {path: '**', component: NotFoundPage },

     // children(父子路由配置)
     // 访问/tabs跳转到TabsPage,TabsPage只是一个底部导航。也相当于web网站的顶部导航或左侧导航
     // 所以需要访问/tabs/demo,才会显示导航和内容
     // 访问/tabs/tab1/test,显示导航和testPage,test模块使用loadChildren懒加载
    {
        path: 'tabs',
        component: TabsPage,
        children: [
            {path: 'demo', component: DemoPage},
            {path: 'tab1', component: Tab1Page},
            {path: 'tab1/test', loadChildren: './pages/tab1/test/test.module#TestPageModule'},
            {path: 'mine', component: MinePage}
        ]
    }

  ])
  ],
})
  • 使用component,需要在对应的模块declarations中声明组件
  • 使用loadChildren加载子模块,路径是相对相对路径,相对于父模块文件所在路径;什么时候会用loadChildren配置?
    在web端界面一般顶部或左侧有导航,下面或右侧显示内容,在app端一般底部有tab导航,上面显示内容;如下配置,TabsPage就是导航界面,children配置内容界面路由
    {
        path: 'tabs',
        component: TabsPage,
        children: [
            {path: 'demo', component: DemoPage},
            {path: 'mine', component: MinePage}
        ]
    }
  • 根模块是forRoot子模块是forChild,如下图所示
  • 建议app一级页面使用component配置,二级页面使用loadChildren,如下图是我的路由配置,TabsPage是导航页面,Tab1Page、DemoPage、MinePage是一级页面,其余是二级页面
    考虑多人开发,若同时修改一份路由文件,会经常冲突,所以按业务分类多个配置文件,所以下图出现...tab1Routes、...demoRoutes、 ...mineRoutes,完整代码点这里
  • redirectTo重定向有个坑,假如配置如下,由于TabPage使用component配置,则应用启动时就会加载TabPage,当你后来导航到/test,则会重定向到TabPage,此时TabPage就会初始化第二次,如果你在constructor()中对全局对象做过修改那就回修改第二次
    我当时在tabs.page.ts文件中订阅android返回按钮事件,就订阅了两次,而且只能在真机调试中发现,坑很深
const routes: Routes = [
    {path: 'test', redirectTo: 'tab',  pathMatch: 'full' },
    {path: 'tab',  component: TabPage}
];
  • 刚开始对路由配置不熟悉,应尽量避免使用path: ''配置,尤其类似下面的重定向,要不然会让你懵逼
 { path: '', redirectTo: '/path', pathMatch: 'full'}

如下gif图,从tab2跳转到test页面,点击返回,竟然返回到了tab1页面,如下图2注释默认生成的path: ''路由即可


图2

  • 如下图红色框内代码,是给页面动态添加返回按钮,当页面是根页面时,返回按钮不显示;当ion-back-button添加defaultHref属性后,即使是根页面或按F5刷新页面也会显示返回按钮,点击返回按钮返回到指定页面
        <ion-buttons slot="start">
            <ion-back-button defaultHref="/tabs/tab1"></ion-back-button>
        </ion-buttons>

导航

  • 如下是最基本的路由配置
    { path: 'main', component: mainPage }
  • 在html中和ts中导航到mainPage 方法如下
    <ion-button routerLink="/main">next page</ion-button>
    <ion-button [routerLink]="['/main']">next page</ion-button>
     constructor(public router: Router, public nav: NavController) {}
     next() {
        this.router.navigateByUrl('/main');
        this.router.navigate(['/main']);
        this.nav.navigateForward('/main');
     }
  • 返回方式如下。返回和上面的“navigate”方法动画是不一样的
    goBack() {
        this.nav.pop(); // 返回到上一个页面
        this.nav.back(); // 同上
        this.nav.navigateBack('/'); // 可以指定返回的页面路径
    }

  • 如下是url带参数的路由配置
    {path: 'detail/:id', component: DetailPage }
  • 在html中和ts中导航到DetailPage 方法如下,注意参数是在数组内,不是方法内
    <ion-button [routerLink]="['/detail', 6]">next page</ion-button>
     constructor(public router: Router) {}
     next() {
        this.router.navigate(['/detail, 6']);
     }
  • 接收url参数两种方法,注意这里用的是ActivatedRoute不是Router
  constructor(private route: ActivatedRoute) {
      const params = this.route.snapshot.params;
      console.log(params.id);
      
      this.route.params.subscribe(res => {
          console.log(res.id);
      });
  }

  • 导航传递对象参数
this.router.navigateByUrl('/main?page=1&size=10');
this.router.navigate(['/main'], {queryParams: {page: 1, size: 10}});

注意这样传参是接收不到的
this.nav.navigateByUrl('/main', {queryParams: {page: 1, size: 10}});

  • 接收参数两种方法
    constructor(private route: ActivatedRoute) {
        const queryParams = this.route.snapshot.queryParams;
        console.log(queryParams);
        
        this.route.queryParams.subscribe(res => {
            console.log(res);
        });
    }
  • 还有其他传递参数的方法。如发布订阅事件,使用Service,全局对象,本地存储等

其他

  • 默认情况下,应用登录成功后跳转到主页,这时候点击返回按钮又返回到登录页,这是不科学的。所以需要使用如下NavController.navigateRoot方法设置主页面为顶层页面
constructor(public nav: NavController) {}
login() {
    this.nav.navigateRoot('/tabs/tab1');
}
  1. CanActivate路由入口守卫:访问页面前执行业务处理,可以用于访问鉴权,先判断是否有权限访问该页面
  2. CanDeactivate路由出口守卫:离开页面前执行业务处理,如用户填写了表单未保存,点击了返回,可以提示是否保存
  3. 路由动画NavController在ionic3也有,ionic4继续存在,就是封装了返回/前进动画等功能
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342