๐ React Navigation๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค!
NavigationContainer
๋ navigation์ ์ํด ์ต์์์ ๋ ๋ฐ๋ง๋์ด์ผ ํ๋ค.
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
const Stack = createNativeStackNavigator();
export default function App() {
return (
<NavigationContainer>
<Stack.Navigator>{/* ... */}</Stack.Navigator>
</NavigationContainer>
);
}
props
๋ก ref
๋ฅผ ์ ๋ฌํ์ฌ navigation ๊ด๋ จ action๋ค์ ์ํํ ์ ์๋ค.
import { NavigationContainer, useNavigationContainerRef } from '@react-navigation/native';
function App() {
const navigationRef = useNavigationContainerRef();
return (
<View style={{ flex: 1 }}>
<Button onPress={() => navigationRef.navigate('Home')}>
Go home
</Button>
<NavigationContainer ref={navigationRef}>{/* ... */}</NavigationContainer>
</View>
);
}
// Example
navigationRef.navigate(name, params);
์ ํ๋ฉด์ด navigation stack ๋งจ ์์ ์์นํ์ฌ ํ๋ฉด ๊ฐ์ ์ ํ์ ์ ๊ณตํ๋ navigator์ด๋ค.
Example
import { NavigationContainer } from "@react-navigation/native";
import { createStackNavigator } from '@react-navigation/stack';
import { RootStackParamList } from "./src/types";
import HomeScreen from "./src/screens/HomeScreen";
import MovieScreen from "./src/screens/MovieScreen";
const RootStack = createStackNavigator<RootStackParamList>();
export default function App() {
return (
<NavigationContainer>
<RootStack.Navigator initialRouteName="Home">
<RootStack.Screen
name="Home"
component={HomeScreen}
options={{ headerShown: false }}
/>
<RootStack.Screen
name="Movie"
component={MovieScreen}
options={{ headerShown: false }}
/>
</RootStack.Navigator>
</NavigationContainer>
);
}
export type RootStackParamList = {
Home: undefined;
Movie: {
id: number;
title: string;
overview: string;
voteCount: number;
};
};
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ๋จผ์ , route์ ์ด๋ฆ๊ณผ parameter ํ์ ์ ์ ์ํด์ผ ํ๋ค.
export type RootStackParamList = {
[name]: params;
};
Home
๊ณผ Movie
์ด๋ฆ์ ๊ฐ์ง route๊ฐ ์๊ณ , Home
route์๋ parameter๊ฐ ์๊ณ , Movie
route์๋ id
, title
๋ฑ์ parameter๊ฐ ์๋ค.RootStackParamList
ํ์
์ createStackNavigator
ํจ์์๊ฒ ์ ๋ฌํด์ผ ํ๋ค.Stack์ Screen์ผ๋ก ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ๋ ์๋์ผ๋ก navigation props
์ route props
๋ฅผ ์ฃผ์
๋ฐ๋๋ค.
// src/screens/HomeScreen.tsx
import { StackScreenProps } from "@react-navigation/stack";
import { RootStackParamList } from "../types";
export type HomeScreenProps = StackScreenProps<RootStackParamList, "Home">;
export default function HomeScreen({ navigation, route } : HomeScreenProps){
return (
//...
);
}
// src/screens/MovieScreen.tsx
import { StackScreenProps } from "@react-navigation/stack";
import { RootStackParamList } from "../types";
export type MovieScreenProps = StackScreenProps<RootStackParamList, "Movie">;
export default function MovieScreen({ navigation, route } : MovieScreenProps){
const { id, title, overview, voteCount } = route.params;
return (
//...
);
}
route
์๋ ์์ RootStackParamList
์์ ์ ์ํ params
๊ฐ์ฒด๊ฐ ์๋ค.navigation
์ navigation action์ ์คํํ ์ ์๋ ํจ์๋ฅผ ํฌํจํ๊ณ ์๋ค.navigation.goBack();
navigation.navigate("Home");
navigation.navigate("Movie", {
id: movie.id,
title: movie.original_title,
overview: movie.overview,
voteCount: movie.vote_count,
}); // MovieScreen์ผ๋ก ์ ํํ ๋ ์์ ์ ์ํ ํ์
์ ๋ง๋ parameter ๊ฐ์ฒด๋ฅผ ๋ณด๋ด์ผ ํ๋ค!!
useNavigation
๊ณผ useRoute
๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.props
๋ก ์ ๋ฌํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌํ๋ค.const route = useRoute<MovieScreenProps["route"]>();
const navigation = useNavigation<MovieScreenProps["navigation"]();
์ด ๋ฐ์๋ useScrollToTop, useIsFocused ๋ฑ ๋ค์ํ๊ณ ์ ์ฉํ hook๋ค์ ์ ๊ณตํ๋ค.
๊ณต์๋ฌธ์๋๋ก Stack Navigator๋ฅผ ์ ๊ณตํ๋๋ฐ๋ ์๋์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
โ ๏ธ 'RootStack.Navigator' cannot be used as a JSX component
Stack overflow์์ ๋ฐฉ๋ฒ์ ์ฐพ์๋๋ฐ @types/react
์ ๋ฒ์ ๋ฌธ์ ์๋ค. ๋ฒ์ ์ ์
๋ฐ์ดํธํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
- "@types/react": "~17.0.21",
+ "@types/react": "18.0.0",
๐ React Navigation์ Stack Navigator๋ฟ๋ง ์๋๋ผ Bottom Tabs Navigator ๋ฑ ์ด 6๊ฐ์ Navigator๋ฅผ ์ ๊ณตํ๋ค.
๐ ์ ๋ฆฌํ ๋ด์ฉ ์ด์ธ์๋ ๊ณต์๋ฌธ์์๋ Nesting Navigators, Navigator Lifecycle ๋ฑ ๋ค์ํ ๋ด์ฉ๋ค์ ์น์ ํ๊ฒ ์ค๋ช ํ๊ณ ์๋ค. Typescript๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ค์ ์ํด Type checking with TypeScript์ ๋ํ ๋ด์ฉ๋ ํจ๊ป ์ค๋ช ํ๊ณ ์๋ค. ์ฌ์ฉ์์๊ฒ ๋ค์ํ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์๋ navigation์ ๊ฑฐ์ ํ์ ์์์ด๋ค. ๊ทธ๋์ navigation ๊ด๋ จ api๋ฅผ ์ ๊ณตํ์ง ์๋ React Native ์ฑ์ ๊ฐ๋ฐํ๋ ๋ฐ ์์ด์๋ ๋งค์ฐ ์ ์ฉํ๊ณ ๊ณ ๋ง์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๐