2021年8月30日
プログラミング
React Navigation 6.0のStack Navigatorの大きく変わった箇所の変更点をまとめてみた
はじめに
先日React Navigation 6.0が公開されました。この記事では今回のバージョンアップによる新機能や変更点をいくつか紹介していきたいと思います。 React Navigation 6.0を使用するために以下の条件を満たす必要があります。
react-native-safe-area-context >= 3.0.0 react-native-screens >= 2.15.0 react-native-tab-view >= 3.0.0 react-native >= 0.63.0 expo >= 41 typescript >= 4.1.0
React Navigationとは
React Navigationは、React Nativeアプリケーションでルーティングとナビゲーションを行うためのライブラリです。React Navigationを使用することで、複数の画面間に遷移したり、画面間でデータを共有する際の問題を解決するのに役立ちます。
React Navigation使用するためにプロジェクト内で以下のコマンドを入力する
npm install @react-navigation/native //React Native CLIプロジェクトの場合は下記を入力 npm install react-native-screens react-native-safe-area-context //Expoプロジェクトの場合は下記を入力 expo install react-native-screens react-native-safe-area-context
React Navigation6.0のStack Navigatorの大きく変わった箇所の変更点
カスタムヘッダーの「headerMode: screen」がデフォルトで指定される
これまでカスタムヘッダーを使用する時に、下記のようにheaderMode='screen'
またはカスタムアニメーションを手動で指定する必要がありました。
//v5
<Stack.Navigator headerMode="screen">
...
</Stack.Navigator>
v6からはカスタムヘッダーを指定すると、自動的にheaderMode='screen'
に設定されるようになります。これはheaderModeがナビゲーターのpropではなくなり、カスタムヘッダーが指定された画面ごとに設定できるようになりました。
//v6
//記述しなくてもheaderMode='screen'がデフォルトで設定されている
<Stack.Navigator>
...
</Stack.Navigator>
カスタムヘッダーに渡されるpropが合理化される
v5まではstack headerは現在の画面と遷移前の画面の状態を受け取り、それらにはdescriptor
, navigation
prop、progress
などが含まれていました。v6からpropはより簡素になりました。
header関連のオプション一覧は以下になります。これらのオプションはStack.navigatorのscreenOptions
やStack.Screenのoptions
で指定できます
headerとして表示するReact Elementを返す関数です。引数として、以下のプロパティを含むオブジェクトを受け取ります。
ヘッダー関連のオプション
- navigation – 現在の画面のナビゲーションオブジェクト
- route – 現在の画面のルートオブジェクト
- options – 現在の画面のオプション
- layout – 画面の寸法で、高さと幅のプロパティを含む
- progress – アニメーションの進行状況を表すアニメーションノード
- back – 戻るボタンのオプションで、戻るボタンのラベルに使用するtitleプロパティを持つオブジェクトを含む
- styleInterpolator – ヘッダー内の様々な要素のために、補間されたスタイルを返す関数
import { createStackNavigator } from '@react-navigation/stack';
const Stack = createStackNavigator();
function MyStack() {
return (
<Stack.Navigator
initialRouteName="Home"
//ここで全ての画面で共通するカスタムヘッダーを指定する
screenOptions={{
headerMode: 'screen',
headerTintColor: 'white',
headerStyle: { backgroundColor: 'tomato' },
}}
>
....
</Stack.Navigator>
);
};
カスタムヘッダーを使う場合の2つの注意点
不具合を防ぐためにheaderStyleで高さを指定する
headerの高さがデフォルトのheaderの高さと異なる場合、計測が非同期になることで不具合が発生する可能性があります。明示的に高さを指定することで、そのような不具合を避けることができます。headerStyle: {
height: 80, // Specify the height of your custom header
};
カスタムヘッダーアニメーションのために headerMode を float に設定する
デフォルトの非モーダルのiOSでは、複数の画面用のheaderをレンダリングするfloating headerが1つあります。これらのheaderにはスムーズに切り替えるためのアニメーションが含まれています。カスタムヘッダーを指定した場合、React Navigationは自動的に画面に変更し、代わりにheaderが画面に合わせてアニメーションするようにします。そのため個別にアニメーションを実装する必要がありません。 しかし、floating headerを維持して、header間で異なる遷移アニメーションをさせたい場合があります。そのためには、オプションでheaderMode: 'float'
を指定し、カスタムヘッダーの progress.current
と progress.next
のpropで補間する必要があります。例えば、以下のようにすると、headerがクロスフェードします。
import Animated from 'react-native-reanimated';
import progress from 'progress';
const opacity = Animated.add(progress.current, progress.next || 0).interpolate({
inputRange: [0, 1, 2],
outputRange: [0, 1, 0],
});
return (
<Animated.View style={{ opacity }}>{/* Header content */}</Animated.View>
);
gestureResponseDistanceオプションをオブジェクトではなく数値で指定する。
v5まではgestureResponseDistance
オプションは水平または垂直のプロパティを持つオブジェクトを受け取っていました。v6からはgestureDirection
オプションに基づいて、水平または垂直方向の値として使用される数値を受け取ります。
//v5
<Stack.Navigator
screenOptions={
gestureResponseDistance: {
horizontal:100,
vertical:50
}}
>
//v6
<Stack.Navigator
screenOptions={{
headerStyle: { backgroundColor: 'tomato' },
gestureResponseDistance: 50,
}}
>
一部の要素がElements Libraryに変更
以下のエクスポートはstack navigatorに固有のものではなくなったため、Elements Libraryへの変更となりました。Elements Libraryに変更されたもの
- Assets
- HeaderTitle
- HeaderBackButton
- HeaderBackground
- HeaderHeightContext
- useHeaderHeight
import { BlurView } from 'expo-blur';
// ...
<Stack.Screen
name="Setting"
component={SettingScreen}
options={{
headerTransparent: true,
headerBackground: () => (
<BlurView tint="light" intensity={90} />
),
}}
/>;
まとめ
今回はReact Navigation6.0のStack Navigatorの変更点を説明しました。v6ではv5とほとんど同じコアAPIを維持しており、よりシンプルで使いやすくなっています。 今回紹介したものはv6で変更のあった中の一部なので、他にも詳しく知りたい方は公式のドキュメントを見てみてください。 ご覧いただきありがとうございました。
React Nativeのお仕事に関するご相談
Bageleeの運営会社、palanではReact Nativeに関するお仕事のご相談を無料で承っております。
zoomなどのオンラインミーティング、お電話、貴社への訪問、いずれも可能です。
ぜひお気軽にご相談ください。
この記事は
参考になりましたか?
1
3
関連記事
2021年8月30日
React Navigation 6.0のStack Navigatorの大きく変わった箇所の変更点をまとめてみた
2021年1月4日
react-native-svgを使ってReact NativeでSVGを扱う
2019年12月23日
Expo Bare Workflow で Firebase Analytics を設定する
2018年12月6日
【React Native】キーボードで画面が隠れる場合の対処法
2018年7月13日
TypeScriptでReact Native開発をする方法2018年最新版
2018年6月29日
React Navigationのタブナビゲーションをカスタマイズしてみよう!
簡単に自分で作れるWebAR
「palanAR」はオンラインで簡単に作れるWebAR作成ツールです。WebARとはアプリを使用せずに、Webサイト上でARを体験できる新しい技術です。
palanARへpalanでは一緒に働く仲間を募集しています
正社員や業務委託、アルバイトやインターンなど雇用形態にこだわらず、
ベテランの方から業界未経験の方まで様々なかたのお力をお借りしたいと考えております。
運営メンバー
Eishi Saito 総務
SIerやスタートアップ、フリーランスを経て2016年11月にpalan(旧eishis)を設立。 マーケター・ディレクター・エンジニアなど何でも屋。 COBOLからReactまで色んなことやります。
sasakki デザイナー
アメリカの大学を卒業後、日本、シンガポールでデザイナーとして活動。
やまかわたかし デザイナー
フロントエンドデザイナー。デザインからHTML / CSS、JSの実装を担当しています。最近はReactやReact Nativeをよく触っています。
Sayaka Osanai デザイナー
Sketchだいすきプロダクトデザイナー。シンプルだけどちょっとかわいいデザインが得意。 好きな食べものは生ハムとお寿司とカレーです。
はらた エンジニア
サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています
こぼり ともろう エンジニア
サーバーサイドエンジニア。SIerを経て2019年7月に入社。日々学習しながらRuby on Railsを使った開発を行っています。
ささい エンジニア
フロントエンドエンジニア WebGLとReactが強みと言えるように頑張ってます。
Damien
WebAR/VRの企画・開発をやっています。森に住んでいます。
ゲスト bagelee
かっきー
まりな
suzuki
miyagi
ogawa
雑食デザイナー。UI/UXデザインやコーディング、時々フロントエンドやってます。最近はARも。
いわもと
デザイナーをしています。 好きな食べ物はラーメンです。
taishi kobari
フロントエンドの開発を主に担当してます。Blitz.js好きです。
kubota shogo
サーバーサイドエンジニア。Ruby on Railsを使った開発を行いつつ月500kmほど走っています!
nishi tomoya
aihara
グラフィックデザイナーから、フロントエンドエンジニアになりました。最近はWebAR/VRの開発や、Blender、Unityを触っています。モノづくりとワンコが好きです。
nagao
SIerを経てアプリのエンジニアに。xR業界に興味があり、unityを使って開発をしたりしています。
Kainuma
サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています
sugimoto
asama
ando
iwasawa ayane
oshimo
異業界からやってきたデザイナー。 palanARのUIをメインに担当してます。 これからたくさん吸収していきます!