きまぐれweb/app開発日記

個人でWEBやアプリの開発してます。使用している言語・フレームワークはGo,Flutter,Rails,Vue,ionicです。これらの開発で発見したこと、思ったことを気まぐれに書いていきます。

ionic4のページ遷移

前回 ionic3からionic4への移行について記事を書きましたが、ionic4になって最も大きく変更されたのがページ遷移の方法です。

今回の記事では前回書ききれなかったページ遷移について書きたいと思います。

Ionic4ではルーティングmoduleを使用

ionic4ではwebページと同じような、urlを元にしたページ遷移に変わっています。その鍵になるのがsrc/appフォルダの中にあるapp-routing.module.tsです。例えばHomeというページとContactというページにパスを登録するのであれば、下記のように記入します。

const routes: Routes = [
  { path: 'home', loadChildren: './home/home.module#HomePageModule' },
  { path: 'contact', loadChildren: './contact/contact.module#ContactPageModule' },
];

これによってsrc/app/homeとsrc/app/contactにあるページへのルーティングができます。

最も単純なページ遷移

homeページからcontactページ遷移したい時はどうしたらいいかというと、下記のようにangular/routerを利用して遷移できます。

home.page.ts

import { Router } from '@angular/router';

export class HomePage implements OnInit {
  constructor(
    private router:Router,
  ){}

this.router.navigateByUrl('/contact');

「this.router.navigateByUrl('/contact')」がionic3の

this.navCtrl.push(ContactPage);

に代わるメソッドです。

さらに、home.page.htmlから下記のようなリンクを使って遷移することもできます。

<a href="/contact">contact page</a>

パラメータを送るときのページ遷移のしかた

homeページからcontactページへidというパラメーターを送付したい場合は下記のようにurlの後にパラメータを設定します。

app-routing.module.ts

const routes: Routes = [
  { path: 'home', loadChildren: './home/home.module#HomePageModule' },
  { path: 'contact/:id', loadChildren: './contact/contact.module#ContactPageModule' },
];

パラメータを送るために変えるのはpath: contact/:idのところだけです。

送信側のhomeはこんな感じ。

home.page.ts

import { Router } from '@angular/router';

export class HomePage implements OnInit {
  constructor(
    private router:Router,
  ){}
var id:string = '1';
this.router.navigateByUrl('/contact/' + id);

home.page.html

<a href="/contact/1">contact page</a>

受け取る側のcontactではActivatedRouteとParamapを使って下記のように受け取ります。

contact.page.ts

import { Router, ActivatedRoute, ParamMap } from '@angular/router';

export class ContactPage implements OnInit {
   id:string;

  constructor(
    private router:Router,
    private route: ActivatedRoute,
    ){}

  ngOnInit(){
    this.route.paramMap.subscribe((params: ParamMap) => {
      this.id = params.get('id');
      });
  }

最初は少し戸惑うんですが、一度やってみると難しくは感じません。

複数のパラメータを送るページ遷移

複数のパラメータを送るときも基本的に同じで、/でつなげて後ろにパラメータを増やしていくだけです。下記はidに加えてnameとageを送る例です。

app-routing.module.ts

const routes: Routes = [
  { path: 'home', loadChildren: './home/home.module#HomePageModule' },
  { path: 'contact/:id/:name/:age', loadChildren: './contact/contact.module#ContactPageModule' },
];

home.page.ts

import { Router } from '@angular/router';

export class HomePage implements OnInit {
  constructor(
    private router:Router,
  ){}
var id:string = '1';
var name:string = "bob";
var age:string = '20';
this.router.navigateByUrl('/contact/' + id + '/' + name + '/' + age);

home.page.html

<a href="/contact/1/bob/20">contact page</a>

contact.page.ts

import { Router, ActivatedRoute, ParamMap } from '@angular/router';

export class ContactPage implements OnInit {
   id:string;
   name:string;
   age:string;

  constructor(
    private router:Router,
    private route: ActivatedRoute,
    ){}

  ngOnInit(){
    this.route.paramMap.subscribe((params: ParamMap) => {
      this.id = params.get('id');
      this.name = params.get('name');
      this.age = params.get('age');
      });
  }

ionic4のルーティングは恐れる必要なし

ionic3やり方が変わったので最初は慣れませんし、実際少しだけ複雑になっています。しかし、webアプリであるかのようにページを遷移していける自由度はionic3までには無かったものです。

この変更により、わずかな手間と引き換えに、大きな自由度を手にした印象です!Ionic team, good job!