ionic+cordova

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

2019-03-22  本文已影响0人  昵称已被使用_

前言

路由配置

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}
        ]
    }

  ])
  ],
})
    {
        path: 'tabs',
        component: TabsPage,
        children: [
            {path: 'demo', component: DemoPage},
            {path: 'mine', component: MinePage}
        ]
    }
const routes: Routes = [
    {path: 'test', redirectTo: 'tab',  pathMatch: 'full' },
    {path: 'tab',  component: TabPage}
];
 { path: '', redirectTo: '/path', pathMatch: 'full'}

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


图2
        <ion-buttons slot="start">
            <ion-back-button defaultHref="/tabs/tab1"></ion-back-button>
        </ion-buttons>

导航

    { path: 'main', component: 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');
     }
    goBack() {
        this.nav.pop(); // 返回到上一个页面
        this.nav.back(); // 同上
        this.nav.navigateBack('/'); // 可以指定返回的页面路径
    }

    {path: 'detail/:id', component: DetailPage }
    <ion-button [routerLink]="['/detail', 6]">next page</ion-button>
     constructor(public router: Router) {}
     next() {
        this.router.navigate(['/detail, 6']);
     }
  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);
        });
    }

其他

constructor(public nav: NavController) {}
login() {
    this.nav.navigateRoot('/tabs/tab1');
}
  1. CanActivate路由入口守卫:访问页面前执行业务处理,可以用于访问鉴权,先判断是否有权限访问该页面
  2. CanDeactivate路由出口守卫:离开页面前执行业务处理,如用户填写了表单未保存,点击了返回,可以提示是否保存
  3. 路由动画NavController在ionic3也有,ionic4继续存在,就是封装了返回/前进动画等功能
上一篇下一篇

猜你喜欢

热点阅读