こちらのPull Requestで諸々対応
■ react-navigation v5にアップデート
https://github.com/wheatandcat/Peperomia/pull/545/files
■ react-navigation v5のScreen optionにtypesを指定
https://github.com/wheatandcat/Peperomia/pull/549/files
概要
React Navigation v5はnpmのパッケージ自体を変更する大きな修正が入っています。 詳しくは以下のドキュメントを参照
良くなったところ
ナビゲーションのgetParam、setParamsにTypeが指定できるようになった
v4までだと画面遷移後にパラメータを引き渡すのにgetParam、 同画面内のheaderにパラメータを渡すのにsetParamsを使用していましたが、 v4まではここに対してtypeを指定できませんでしたが
■ v4 getParam
const kind = this.props.navigation.getParam('kind', null);
■ v4 setParam
const onDismiss = () => { this.setState({ open: false, }) } this.props.navigation.setParams({ onDismiss, });
v5からは各画面のScreen Optionsのtypeを指定できるようになりました。 指定の仕方は以下の各画面に書く画面のparamのtypeを指定して
■ src/lib/navigation.ts
export type RootStackParamList = { Main: undefined; Home: { refresh: boolean; onPushCreatePlan?: () => Promise<void> }; CreatePlan: { date?: string; kind?: string; }; AddScheduleDetail: { itemId?: string | number; kind?: string; priority?: number; onSave?: () => void; }; Icons: { kind?: string; onSelectIcon?: (kind: string) => void; onDismiss?: () => void; photo?: boolean; defaultIcon?: boolean; };
以下のようにRootStackParamListから画面をしていてnavigation、routeにtypeを指定
import { RouteProp } from '@react-navigation/native'; import { StackNavigationProp } from '@react-navigation/stack'; import { RootStackParamList } from 'lib/navigation'; type ScreenNavigationProp = StackNavigationProp<RootStackParamList, 'Icons'>; type ScreenRouteProp = RouteProp<RootStackParamList, 'Icons'>; type Props = { navigation: ScreenNavigationProp; route: ScreenRouteProp; };
すると、こんな感じで補完が効くようになります
ちなみにScreen Optionにtypeを指定する場合は、createStackNavigatorに指定すればOKです
import { createStackNavigator } from '@react-navigation/stack'; import { RootStackParamList } from 'lib/navigation'; const Stack = createStackNavigator<RootStackParamList>();
useRouteやuseNavigationを使用することでnavigationをpropsで引き回す必要はなくなった
import { useRoute } from '@react-navigation/native'; const Nav = memo((props: Props) => { const route = useRoute<ScreenRouteProp>(); const kind = route.params?.kind;
import { useNavigation } from '@react-navigation/native'; const Nav = memo((props: Props) => { const { navigate } = useNavigation(); const onPush = () => { navigate('Home') } })
上記のようにuseRoute、useNavigationを使えば子コンポーネントに対してporpsで引き回さなくても画面遷移や画面のパラメータを取得できる
移行した感想
上記の紹介以外にもナビーゲーションの宣言がJSXになったり、 Modalの指定がNavigatorのmodeに移動したりありました。
破滅的な修正なので大きなプロジェクトでの移行は、結構時間がかかると思います。 ただ、ナビゲーションパラメータのところにtype指定できるようになったことで、ここの実装の気持ち悪さはかなり軽減されました。
次回はExpo SDK 37にアップデートする話を書く予定