React Nativeのカスタムルーティング管理に関する深い理解

React Nativeのカスタムルーティング管理に関する深い理解

1. カスタムルーティング

ご存知のとおり、ネイティブ Android でも iOS でも、デフォルトのルーティング スタック管理クラスがあります。 React Native はルート管理用のコンポーネントを公式に提供していないため、ルートを管理するには react-navigation プラグインが提供する Stack.Navigator コンポーネントを使用する必要があります。

Stack.Navigator は名前付きルートを使用します。いわゆる名前付きルートは、ルートを使用する前に宣言する必要があることを意味します。ルーティング ページの管理を容易にするために、以下に示すように、ルートを screens パッケージなどの統一された場所に配置します。

次に、プロジェクトの screens/index.js ファイルに新しい定数を作成します。これは、次に示すように、宣言されたルートを管理するために主に使用されるものです。

エクスポートconstスタック=[
  {
    名前: 'AllMovieScreen',
    コンポーネント: AllMovieScreen、
    オプション: {headerShown: false},
  },
  {
    名前: 'CitySelectScreen',
    コンポーネント: CitySelectScreen、
    オプション: {title: '都市を選択'},
  },
  .... //他のルーティングページを省略];

次に、ルーティングジャンプ、リターン、その他の操作を実装するための新しい MainStackScreen.js ファイルを作成します。同時に、MainStackScreen クラスのもう一つの機能は、ナビゲーション バーのスタイルを統一することです。コードは次のとおりです。

MainStack を createStackNavigator() に追加します。

関数 MainStackScreen({ナビゲーション}) {
  戻る (
    <メインスタック.ナビゲーター
      初期ルート名="アプリ"
      画面オプション={{
        ヘッダータイトル配置: 'center'、
        ヘッダースタイル: {
          影オフセット: {幅: 0, 高さ: 0},
          影色: '#E5E5E5',
          背景色: '#fff',
        },
        ジェスチャー有効: true、
        ヘッダーバックタイトル表示: false、
        ヘッダー左: () => (
          <タッチ可能な不透明度
            onPress={() => navigation.goBack()}
            スタイル={{パディング: 10, パディング右: 30}}>
            <アイコン名="chevron-thin-left" サイズ={20} 色="#222222" />
          </TouchableOpacity>)、
      }}>
      <メインスタック.スクリーン
        名前="アプリ"
        コンポーネント={下部タブ}
        オプション={{headerShown: false}}/>
      {stacks.map((item, index) => (
        <メインスタック.スクリーン
          キー={index.toString()}
          名前={アイテム名}
          コンポーネント={item.component}
          オプション={item.options}/>
      ))}
    </メインスタック.ナビゲーター>
  );
}

デフォルトの MainStackScreen をエクスポートします。

上記のコードでは、screens/index.js ファイルを作成してアプリケーション ルートを宣言し、MainStackScreen クラスの map ループを使用してルートの登録を完了します。ご覧のとおり、上記の処理の後、ルーティング管理は非常に明確になります。新しいページがある場合は、screens/index.js ファイルにルートを追加するだけで済みます。

2. タブナビゲーション

React Native アプリケーション開発では、 react-navigation はルーティング管理機能を提供するだけでなく、タブナビゲーションとドロワーナビゲーションもサポートします。また、最新バージョンでは、タブナビゲーション、ドロワーナビゲーション、スタックナビゲーションが依存するライブラリが別々になっているため、開発プロセス中に個別にインストールする必要があります。

タブナビゲーションの場合、プロジェクトにタブナビゲーションに必要な bottom-tabs ライブラリをインストールする必要があります。コマンドは次のとおりです。

npm インストール @react-navigation/bottom-tabs    

Tab ナビゲーションを作成するには、createBottomTabNavigator() メソッドが必要です。このメソッドは、それぞれ Tab.Navigator コンポーネントと Tab.Screen コンポーネントに対応する navigator と route という 2 つのプロパティを提供する必要があります。最後に、以下に示すように、NavigationContainer コンポーネントを使用してそれらをラップする必要があります。

'@react-navigation/bottom-tabs' から {createBottomTabNavigator} をインポートします。
'@react-navigation/native' から {NavigationContainer} をインポートします。

定数 BottomTabs = createBottomTabNavigator();

デフォルト関数BottomTabScreen()をエクスポートする{
  戻る (
    <ナビゲーションコンテナ>
      <BottomTabs.Navigator
        initialRouteName="ホーム"
        screenOptions={({route}) => ({
          タブバーアイコン: ({focused}) => {
            戻る (
              <画像ソース={ focused? tabImage[`${route.name}_active`]
                    : tabImage[ルート名]
                }
                スタイル={{幅: 26, 高さ: 26}}/>
            ); }})}}
        タブバーオプション={{
          アクティブティントカラー: 'トマト'、
          非アクティブTintColor: 'グレー'、
          スタイル: {
            背景色: '#fff',
          },
        }}>
        <BottomTabs.Screen
          name="ホーム"
          コンポーネント={ホーム画面}
          オプション={{
            tabBarLabel: '映画',
          }}/>
         
.... //他のコードは省略 <BottomTabs.Screen
          name="私のもの"
          コンポーネント={MineScreen}
          オプション={{
            tabBarLabel: 'マイ',
          }}/>
      </BottomTabs.Navigator>
    </ナビゲーションコンテナ>
  );
}

同時に、bottom-tabs プラグインは他の多くの便利なコンポーネントとプロパティも提供しており、開発者はニーズに応じて選択できます。上記のコードを実行すると、その効果は次の図に示されます。

3. データの返却

場合によっては、次のページにジャンプし、次のページでデータを選択した後にポストバックする必要があることがあります。例えば:

上記のシナリオでは、アクティビティ リストをフィルターする必要があります。アクティビティ フィルター ページに移動した後、選択したアクティビティ タイプを返す必要があります。このシナリオでは、react-navigation をどのように処理すればよいでしょうか。

まず、以下に示すように、screens/index.js ファイルにアクティビティ タイプ ページを登録します。

{
  名前: 'セレクタスクリーン',
  コンポーネント: SelectorScreen、
  オプション: nav => {
    定数{ルート} = nav;
    const {params = {}} = ルート;
    const {title = 'アクティビティタイプ', onRightPress = () => {}} = params;
    戻る {
       タイトル、
       ヘッダー右: () => (
         <タッチ可能な不透明度
            onPress={onRightPress}
            スタイル={styles.button}>
            <Text style={{color: '#fff', fontSize: 14}}>OK</Text>
         </タッチ可能な不透明度>
        )、
      };
    },
  }

同時に、アクティビティ リスト ページからアクティビティ フィルタリング ページのデータが渡されます。そのため、使用する場合は、上記でカプセル化したルーティングツールを使用してジャンプ操作を実行するだけで済みます。コードは次のとおりです。

ナビゲート('セレクタスクリーン', {
      値: カテゴリ.map(c => c.andGroupName)、
      デフォルト値: カテゴリ名、
      onConfirm: changeCategory、
    });

ご覧のとおり、フィルター ページで選択されたデータを取得するために、ジャンプ時に onConfirm コールバック関数を定義しました。次に、新しく作成したアクティビティ フィルタリング ページで前のページから渡されたアクティビティ データを受け取り、以下に示すようにリストを使用して表示します。

関数SelectorScreen({ナビゲーション、ルート}) {
  const {values ​​= [], defaultValues ​​= [], onConfirm} =route.params || {};
  const [選択された、setSelected] = useState(defaultValues);

  const _onRightPress = () => {
    onConfirm(選択済み);
    ナビゲーション.goBack();
  };

  使用効果(() => {
    ナビゲーション.setParams({onRightPress: _onRightPress});
  }, [選択済み]);

  定数onPressItem = val => {
    arr = [] とします。
arr = [値];  
選択されたものをセットします。
  };

  const レンダリングアイテム = ({item}) => {
    const レンダリング右 = () => {
    const isSelected = selected.includes(item);
    戻る (
      <リスト項目
        テキスト={アイテム}
        レンダリング右={レンダリング右}
        onPress={() => onPressItem(item)} />
    );
  };

  戻る (
    <表示スタイル={styles.bg}>
      <フラットリスト
        keyExtractor={(item, index) => アイテム + インデックス}
        データ={値}
        レンダリングアイテム = {レンダリングアイテム}
        ListFooterComponent={<ビューの高さ={120} />}} />
    </表示>
  );
};

const スタイル = StyleSheet.create({
 .... // スタイルコードを省略 });

デフォルトの SelectorScreen をエクスポートします。

アクティビティの種類を選択した後、選択した結果を前のページに戻すにはどうすればよいですか?このとき、以下のように、上で定義した onConfirm コールバック関数が使用されます。

const {values ​​= [], defaultValues ​​= [], onConfirm} =route.params || {};

const _onRightPress = () => {
    onConfirm(selected); //onConfirm コールバック関数はデータを返します navigation.goBack();
 };

要約する

React Nativeカスタムルーティング管理に関するこの記事はこれで終わりです。React Nativeカスタムルーティング管理に関するより関連性の高いコンテンツについては、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • React NativeのScrollViewプルダウンリフレッシュ効果
  • React NativeのstartReactApplicationメソッドの簡単な分析
  • React Nativeの起動プロセスの詳細分析
  • React NativeプロジェクトでLottieアニメーションを使用する方法

<<:  Linux seqコマンドの使い方

>>:  Django2.* + Mysql5.7 開発環境統合チュートリアル図

推薦する

nohup /dev/null 2>&1 の使い方の詳しい説明

nohup コマンド: プロセスを実行しており、アカウントからログアウトしてもプロセスが終了しないと...

MySQL 4 の一般的なマスタースレーブレプリケーションアーキテクチャ

目次1つのマスターと複数のスレーブのレプリケーションアーキテクチャマルチレベルレプリケーションアーキ...

純粋な CSS ヘッダーの実装コードを修正

純粋な CSS で固定ヘッダーを実装するのが難しい主な理由は 2 つあります。まず、最大のシェアを持...

MySQL数千万の大規模データに対する30のSQLクエリ最適化テクニックの詳細な説明

1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...

HTML から PDF への変換事例の概要 (複数の画像を推奨)

仕事の都合上、最近 HTML を PDF に変換する機能について調べることに時間を費やしました。 H...

MySQL のフィールドにデフォルトの時間を追加する方法

日付型の違いと用途MySQL には、日付、時刻、年、日付時刻、タイムスタンプの 5 つの日付タイプが...

MySQL のフィールドに一意のインデックスを追加および削除する方法

1. PRIMARY KEY(主キーインデックス)を追加するmysql>ALTER TABLE...

CSS を使用して小さな画像をプルダウンし、大きな画像と情報を表示する方法

今日は、Taobao、JD.comなどのショッピングモールでよく使われている、小さな画像の上にマウス...

リンク内の href=# はどういう意味ですか?

現在のページへのリンク。 -------------------一般的な使用法は次のとおりです。 &...

HTML コマンドラインインターフェースの実装

HTML部分コードをコピーコードは次のとおりです。 <!DOCTYPE html> &l...

Vue の better-scroll コンポーネントを使用して水平スクロール機能を実現する

について最近、Vue を学習する過程で、基本的な知識の練習と強化を目的として、Qunar.com の...

MySQL で乱数を生成し、文字列を連結する方法の例

この記事では、MySQL が乱数を生成し、文字列を連結する方法について例を使用して説明します。ご参考...

MySQL解凍版のインストール手順の詳しい説明

1. 公式サイトにアクセスします: D:\mysql-5.7.21-winx64\bin をダウンロ...

Centos7 で yum を使用して Ceph 分散ストレージをインストールするチュートリアル

目次序文yumソース、epelソースを設定するCephソースの設定Cephとそのコンポーネントをイン...

mysql 8.0.19 win10 クイックインストールチュートリアル

このチュートリアルでは、参考までにMySQL 8.0.19のインストールチュートリアルを共有します。...