react-navigation/native-stackの使い方

ライブラリインストール

前回の失敗を踏まえ、コアライブラリからインストールしていきます。
今回はnative-stackです。

// コアライブラリをインストール
npm install @react-navigation/native

// コアライブラリの依存関係を持つライブラリもインストール
npm install react-native-screens react-native-safe-area-context

// native-stackのライブラリをインストール
npm install @react-navigation/native-stack

// iosの場合はpod-install
cd ios
pod install
cd ..

プログラミング

基本はStackの時と同じにします。

Home.tsxとHome2.tsxを作成

src/screens/homeのフォルダを作成して、その下にHome.tsxとHome2.tsxを作成。以下の内容を記述。
(HomeをHome2に読み替えて、Home2.tsxを記述してください。)

import React from 'react';
import { StyleSheet, View } from 'react-native';
import { Text, Button } from 'react-native-elements';
import { useNavigation } from '@react-navigation/native';

export const Home: React.FC = () => {

  const nav = useNavigation();

  return (
    <View style={styles.container}>
      <Text h1>Home</Text>
      <Button onPress={() => nav.navigate('Home2')} title="Home2に遷移" />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
});

App.tsxにルーティングを記述

今回はreact-navigation/native-stackを使用したルーティングで簡素に記述。

import { createNativeStackNavigator } from '@react-navigation/native-stack';
import React from 'react';
import { Home } from './src/screens/home/Home';
import { Home2 } from './src/screens/home/Home2';
import { NavigationContainer } from '@react-navigation/native';

const Stack = createNativeStackNavigator();

function App(): JSX.Element {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName='Home'>
        <Stack.Screen name="Home" component={Home} />
        <Stack.Screen name="Home2" component={Home2} options={{ headerLeft: () => undefined }} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

export default App;

実行

今回の実行結果は、前回のStackと動きを比較してみます。

Native Stack(今回)

Stack(前回)

基本的には同じレイアウトで同じ動きをしていますが、Home2のヘッダ左側のボタンがNative Stackでは表示されたままになっています。

両方ともoptionsで隠すように記述していますが、その点の効果が異なるようです。

StackとNative Stackの違い

公式のページを読んでみると、以下のようなことが書かれています。(こちら)

Stackはカスタマイズがしやすいのが特徴で、Nativeを使ってアニメーションやジェスチャを実行しているものの、JavaScript実装であるため、パフォーマンスに懸念がある。

Native StackはNativeのパフォーマンスを提供するのが特徴で、一方でStackよりカスタマイズ性は劣る。

つまり、両方とも画面遷移の表現は同じですが(ヘッダ横のボタンで違いはありましたが)、カスタマイズ性とパフォーマンスのトレードオフで2通りの提供をしているという解釈になるようです。

まとめ

StackとNative Stackは用途によって使い分けができるようですが、基本的にはパフォーマンス重視でNative Stackで良いのかなという印象です。
今回は、ヘッダ左側のボタンが消えないという違いはありましたが、モーダルを指定した画面では、ボタンを消すことができるのは別途確認しましたので、そこも含めて用途による使い分けだと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です