SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ExpoとEASで始める快適モバイルアプリ開発

Expo Routerを使って、手続き的ナビゲーションと認証フローを構築しよう

ExpoとEASで始める快適モバイルアプリ開発 第7回

  • X ポスト
  • このエントリーをはてなブックマークに追加

 Expo RouterはExpoにおけるデファクトスタンダードな画面遷移ライブラリです。Expo Routerはモバイルアプリに必要な込み入った用途にも十分に耐えるインターフェースを備えています。今回は手続き的なナビゲーションや認証フローの構築などのアプリ内の実装に加えて、アプリ外でのURLアクセスに反応してアプリを起動するディープリンクの仕組みについても解説します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

対象読者

  • モバイルアプリを作ってみたいReactエンジニア
  • モバイルアプリのリリース作業を手軽に行いたい方

前提環境

 筆者の検証環境は以下の通りです。

  • macOS Sequoia 15.5
  • Node.js 24.4.1
  • npm 11.4.2
  • Expo 53.0.20
  • React Native 0.79.5

プログラムによるナビゲーション

 今回はExpo Routerの応用的な機能について解説していきます。

 Linkコンポーネントによる宣言的な画面遷移に加え、Expo RouterではuseRouterフックを用いることで、ボタンのタップやフォーム送信といったイベントに応じた手続き的なナビゲーションを実装できます。

useRouterフックの基本

 useRouterフックは、プログラムによる画面遷移を行うためのメソッドを提供します。特に使用するメソッドは次の3つです。

  • router.push(href):新しい画面をスタックに追加します。router.push('/settings')のように使用します。
  • router.replace(href):現在の画面を新しい画面に置き換えます。ログイン後のリダイレクトのように、履歴を残したくない場合に使います。
  • router.back(): スタック内の前の画面に戻ります。

 router.pushで新しい画面をスタックに追加し、router.backで前の画面に戻れます(リスト1)。

[リスト1]app/(tabs)/home.tsx
import { useRouter } from 'expo-router';
import { View, Button } from 'react-native';

export default function HomePage() {
  const router = useRouter();
  return (
    <View style={{ padding: 20 }}>
      <Button 
        title="プロフィール表示 (push)"
        onPress={() => router.push('/users/123')}
      />
      <Button
        title="戻る (back)"
        onPress={() => router.back()}
      />
    </View>
  );
}

 また、リスト2はフォーム送信のような非同期処理の完了後に画面遷移を行う実例です。

[リスト2]app/settings/profile.tsx
import React, { useState } from 'react';
import { View, TextInput, Button, Alert } from 'react-native';
import { useRouter } from 'expo-router';

export default function ProfileEdit() {
  const [name, setName] = useState('');
  const router = useRouter();

  const handleSave = async () => {
    // APIでプロフィール更新(仮想)
    const isSuccess = true; // 本来はAPIレスポンスで判断
    if (isSuccess) {
      Alert.alert('成功', 'プロフィールを更新しました', [
        { text: 'OK', onPress: () => router.back() },
      ]);
    } else {
      Alert.alert('エラー', '更新に失敗しました');
    }
  };

  return (
    <View style={{ padding: 20 }}>
      <TextInput placeholder="名前" value={name} onChangeText={setName} />
      <Button title="保存" onPress={handleSave} />
      <Button title="キャンセル" onPress={() => router.back()} color="#999" />
    </View>
  );
}

 useRouterフックにより、宣言的なLinkコンポーネントと手続き的なナビゲーションを適切に使い分け、洗練されたUIを構築できます。

次のページ
認証フローの実装例

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ExpoとEASで始める快適モバイルアプリ開発連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 中川幸哉(ナカガワユキヤ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/22082 2025/08/21 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング