対象読者
- モバイルアプリを作ってみたい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)。
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はフォーム送信のような非同期処理の完了後に画面遷移を行う実例です。
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を構築できます。
