対象読者
- モバイルアプリを作ってみたい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を構築できます。