1. React Navigation ์ค์น
Getting started | React Navigation
2. React Navigation์ ๋ํด,
Hello React Navigation | React Navigation
์ฐ๋ฆฌ๋ ๋จผ์ ๊ฐ์ฅ ์ฝ๊ณ ๊ธฐ๋ณธ์ ์ธ Navigator์ธ Stack Navigator๋ฅผ ํตํด ํ๋ฉด ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ์ต๋ํ๊ณ , ๋ค๋ฅธ ์ข ๋ฅ์ ๋ค๋น๊ฒ์ดํฐ๋ฅผ ์์๋ณด๊ฒ ๋ค.
๋ค๋น๊ฒ์ดํฐ๋ RN ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ์ ๋ฐ๋ก ์ค์นํด์ ์จ์ผ ํ๋ค. ๊ฐ Navigator ๋ง๋ค ๊ณ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค ๋ฐ๋ก ์กด์ฌํ๋ ์ฐธ๊ณ ๋ฐ๋๋ค.
(1) Browser์ StackNavigator์ ๊ณตํต์ , ์ฐจ์ด์
Browser์ ํ๋ฉด ์ด๋ ์๋ฆฌ๋ Stack ์๋ฃ ๊ตฌ์กฐ์ ์๋ฆฌ์ ๋๊ฐ๋ค. <a> ํ๊ทธ๋ฅผ ํตํด ๋ค๋ฅธ ํ๋ฉด์ผ๋ก ์ด๋ํ๊ณ , ์ด๋ํ ํ๋ฉด์ด ๊ธฐ์กด ํ๋ฉด ์์ Stack์ผ๋ก ์์ธ๋ค. ์ฐ๋ฆฌ๋ ์ด Stack์์ ๋งจ ๊ฒ์ ์ธต๋ง ํ๋ฉด์ผ๋ก ๋ณผ ์ ์๋ค.
์์ ๊ฐ์ด Stack ํํ๋ก page๋ค์ด ์์ฌ์๊ธฐ ๋๋ฌธ์, ๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ฐ๋ก ์ง์ ์ page๋ฅผ ์ด ์ ์๋ ๊ฒ ์ด๋ค.
Stack Navigator๋ App ์์์ ํ๋ฉด ์ด๋ ์ Browser์ ๊ฐ์ ์๋ฆฌ๋ก ์๋ํ๋ค. ํ๋ฉด ์ด๋์ ํ ๋๋ง๋ค ์ด๋ํ ํ๋ฉด์ด ๊ธฐ์กด ํ๋ฉด ์๋ก ์์ธ๋ค. ๊ทธ๋์ ๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด Stack ๋งจ ๊ฒ์ ์ธต ํ๋ฉด์ด Pop out ๋๊ณ , ์ง์ ํ๋ฉด์ผ๋ก ๋์๊ฐ ์ ์๋ ๊ฒ์ด๋ค.
StackNavigator์ Browser์ ์ฐจ์ด์ ์ Stack Navigator๋ ํ๋ฉด ์ด๋์ ํ ๋ ์ฐ๋ ์ ์ค์ณ๋ ์ ๋๋ฉ์ด์ ์ต์ ๋ ์ ๊ณตํ๋ค๋ ๊ฒ์ด๋ค.
(2)Stack Navigator ์ฉ์ด ์ค๋ช
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
๋จผ์ ์์ ๊ฐ์ด ๋ค๋น๊ฒ์ด์ ์ฝํ ์ด๋์ createNativeStackNavigator ํจ์๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์์ ํด ์์ผ ํ๋ค.
const Stack = createNativeStackNavigator();
์ฐ๋ฆฌ๋ ํด๋น ํจ์๋ฅผ Stack์ด๋ผ๋ ๋ณ์์ ์์๋ก ํ ๋นํ๊ฒ ๋ค. (ํจ์ ํํ์)
createNativeStackNavigator ํจ์๋ ๋ ๊ฐ์ง ์์ฑ์ ๋ฐํํ๋ค. ์ฒซ์งธ๋ Navigator์ด๋ฉฐ ๋์งธ๋ Screen์ด๋ค.
<NavigationContainer>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
</NavigationContainer>
๋ ๋ค react Component์ด๊ณ , ํ๋ฉด์ด๋์ ๋ํ ํ๊ฒฝ ์ค์ ์ ํ๋๋ฐ ์ฌ์ฉ๋๋ค.
๋จผ์ NavigationContainer๋ ๋ ์์ผ๋ก ์ ์ฒด๋ฅผ ๊ฐ์ผ ๊ฒ์ ์ ์ ์๋ค. ๋ค๋น๊ฒ์ด์ ์ฝํ ์ด๋๋ ์ ์ฒด ๋ค๋น๊ฒ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ๋ค๋น๊ฒ์ดํฐ์ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ํ๋ฉด ์ด๋์ ์ค์ ํ ๋ ค๋ฉด, ํด๋น Navigation Container๊ฐ ๋ชจ๋ Navigator๋ฅผ ๊ฐ์ธ๊ณ ์์ด์ผ ํ๋ค. (์๋๋ฉด ์๋ฌ๋จ.) ๊ทธ๋์ ์ฌ๋๋ค์ ๋ณดํต ํ๋ฉด ์ด๋์์ ๊ฐ์ฅ ๋ฟ๋ฆฌ๊ฐ ๋๋ js ํ์ผ (์๋ฅผ ๋ค์ด App.js ๋ index.js)์ NavigationContainer๋ฅผ ์ฌ์ฉํด ๋ชจ๋ Navigator๋ค์ ๋ฌถ์ด ๋๋๋ค.
์ฒซ ๋ฒ์งธ๋ก Navigator๋ ํ๋ฉด ์ด๋์ ๋ด๋นํ๋ ์ปดํฌ๋ํธ์ด๋ค.
Navigator๋ ์์ ์ปดํฌ๋ํธ๋ก ๋ฌด์กฐ๊ฑด Screen ์ปดํฌ๋ํธ๋ฅผ ํ๋ ์ด์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
Navigator๋ก ๊ฐ์ผ ์์ Screen๋ค ์ฌ์ด์์๋ง ์ด๋์ด ๊ฐ๋ฅํ๋ค.
initialRouteName - ์ฌ๊ธฐ๋ค๊ฐ ํน์ ์คํฌ๋ฆฐ ์ปดํฌ๋ํธ์ name์ ๊ธฐ๋กํ๋ฉด, ์ฑ์ ๋๋ํ ๋ ์ฒ์์ผ๋ก ๋จ๋ ํ๋ฉด์ด ํด๋น Screen์ด ๋๋ค. ํด๋น ์์ฑ์ ๋ฐ๋ก ์ค์ ํด๋์ง ์์ผ๋ฉด, Navigator์์ ์ฒซ ๋ฒ์งธ๋ก ์ฐ์ฌ์ง Screen์ด ์ฒซ ํ๋ฉด์ด ๋๋ค.
๋ ๋ฒ์จฐ๋ก Screen ์ปดํฌ๋ํธ์ด๋ค. ํด๋น ์ปดํฌ๋ํธ๋ ์ด๋ํ ํ๋ฉด์ ๋ํ ๋ช ์ธ๋ฅผ ๋ด๋นํ๋ค. route๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
Navigator๋ Screen ์ปดํฌ๋ํธ์ ์ ํ ๋ด์ฉ์ ์ฝ๊ณ ๋ฒ์ง ์๋ฅผ ์ฐพ์ ์ฌ๋ฐ๋ฅธ ํ๋ฉด์ ๋๋ฐ์ด์ค์ ๋์ด๋ค๋ ์ ์์ route๋ผ๋ ์ด๋ฆ๋ ์ด์ธ๋ฆฐ๋ค.
(์ฃผ์์ ! Screen๊ณผ Screen ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ๋ถํ์. Screen์ ์ฐ๋ฆฌ๊ฐ ๋๋ํ ํ๋ฉด ์์ฒด๋ฅผ ๋งํ๊ณ , Screen ์ปดํฌ๋ํธ๋ ํด๋น ํ๋ฉด์ ๋ํ ๋ช ์ธ์ด๋ค.)
์์ ์ ํ ์์ฑ๋ค์ ํ์๋ก ๊ธฐ์ ํด์ผ ํ๋ ๊ฒ๋ค์ด๋ค.
name - ์ฐ๋ฆฌ๊ฐ ๊ฐ ํ๋ฉด์ ์ด๋ฆ์ด๋ค. ์ด๋ Component ์์ ์ ํ ๋ด์ฉ๋ฌผ๊ณผ ์ด๋ฆ์ด ๋ฌ๋ผ๋ ๋๋ค. name์ ์ฃผ์๋ก์์ ์ญํ ์ ํ๋ค. ํ์ ๋ฐฐ์ฐ๊ฒ ์ง๋ง ํ๋ฉด ์ด๋์ ํ ๋๋ Navigator๋ ๋ค๋น๊ฒ์ด์ ๋ด์ฅ ํจ์๋ฅผ ์จ์ผํ๋๋ฐ. ์ด๋ Navigator("Screen ์ปดํฌ๋ํธ์ name")์ ์น๋ฉด ํด๋น ํ๋ฉด์ผ๋ก ๊ฐ ์ ์๋ค.
component - name์ ํตํด ๊ฐ ํ๋ฉด, ์ฆ ๋ด์ฉ๋ฌผ์ ์ฌ๊ธฐ ๊ธฐ์ ํ๋ค.
<Stack.Screen name="Home" component={HomeScreen} />
์ด ์์์๋ HomeScreen์ด๋ผ๋ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ๋ฐ๋ก ์กด์ฌํ๋ ๊ฒ์ด๋ค.
(3) ๊ฐ Screen์ Option ์ฃผ๊ธฐ (์ ํ์ฌํญ)
Option์ด๋ผ๋ Screen ์ปดํฌ๋ํธ์ ์์ฑ์ ์ด์ฉํด, ํด๋น Screen์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ๋ณด๋ผ ์ ์๋ค.
Options์ ๋ด์ฉ๋ฌผ์ ๊ฐ์ฒด ํํ๋ก ๋ณด๋ด์ค์ผ ํ๋ค. ์๋ฅผ ๋ค์ด options = {{title : "OverView"}}๋ ํด๋น ์คํฌ๋ฆฐ์ ํค๋ ์ด๋ฆ์ ๋ฐ๊พผ๋ค. default๋ก๋ Screen์ name์ด ํค๋์ ์ด๋ฆ์ด์๋ค. ํด๋น Options๋ ์์ title ์ฒ๋ผ ์ฝ์๋ key๊ฐ์ ๋ํด์๋ง ๊ฐ๋ฅํ๋ค. ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ก ์ค์ ํ์ง ์์๋, title์ ๊ฐ์ ๋ฃ์ผ๋ฉด ์๋์ผ๋ก Screen์ ํค๋ text๊ฐ ๋ฐ๋๋ค.
๋ง์ฝ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ๊ณณ์ ๋ณด๋ด๊ณ ์ถ๋ค๋ฉด 1๋ฒ React-Context๋ฅผ ์ด์ฉํ๋์ง, (๋์ค์ ๊ณต๋ถ ์์ ) ์๋๋ฉด Screen ๋ช ์ธ ์ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์จ์ผ ํ๋ค.
<Stack.Screen name="Home">
{(props) => <HomeScreen {...props} extraData={someData} />}
</Stack.Screen>
์์ ํํ๋ฒ์ Component ์์ฑ์ ๋์ ํด์ {}๋ฅผ ์ด์ฉํด ์ฝ๋ฐฑํจ์๋ฅผ ์ฌ์ฉํ๋ค. ์ด ๋ฐฉ๋ฒ์ ํตํด ์ฐ๋ฆฌ๋ ์ต์ํ ๊ธธ๋ก props๋ค์ ์ฐ๋ฆฌ๊ฐ ๋๋ํ ํ๋ฉด ์ปดํฌ๋ํธ์ ๋ณด๋ผ ์ ์๊ฒ ๋์๋ค. (()์์ props๋ค์ </> ์์์ ์์ฑ์ผ๋ก ๋ฐ๋๋ค. )
({item1, item2}) => <HomeScreen requirement1={item1} requirement2={item2}/>
3. ํ๋ฉด ์ด๋์ ๋ํด
Moving between screens | React Navigation
/*HomeScreen๊ณผ DetailsScreen์ด Stack.Navigator์ ๋ฑ๋ก๋์ด ์๋ค๊ณ ๊ฐ์ */
function HomeScreen({ navigation }) {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Home Screen</Text>
<Button
title="Go to Details"
onPress={() => navigation.navigate('Details')}
/>
</View>
);
}
// ... other code from the previous section
์ฐ๋ฆฌ๋ navigation ์์ฑ์ navigate๋ผ๋ ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ํ๋ ํ๋ฉด์ผ๋ก ์ด๋ํ ์ ์๋ค.
navigate("")์ ๊ดํธ์์ ๊ฐ๊ณ ์ถ์ Screen์ name์ ์ ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
ํ์ง๋ง Screen ์ ์ธ ๋ถ๋ฅผ ์ ๋ณด๋ผ! ์ฐ๋ฆฌ๋ Navigation์ด๋ ์์ฑ์ ์ธ์๋ก ๋ฃ์ ์ ์ด ์๋ค.
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
ํ์ง๋ง Navigation์ด๋ผ๋ ์์ฑ์ ์ธ ์๊ฐ ์๋ค. ์๋ํ๋ฉด Navigator์ ์์๋ Screen๋ค์๊ฒ๋ ์๋์ผ๋ก Navigation์ด๋ ์์ฑ์ด ๋ค์ด๊ฐ๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์์๋ ๋งํ๋ฏ์ด ์ฐ๋ฆฌ๋ Navigator์์ ์ ์๋ Screen๋ค ์ฌ์ด์์๋ง ์ด๋์ด ๊ฐ๋ฅํ๋ค. ๋ง์ฝ ๋ค๋ฅธ ์ปดํฌ๋ํธ ์ด๋ฆ์ Navigate์ ()์์๋ค ์ง์ด๋ฃ์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ ๊ฒ์ด๋ค.
a. ๊ฐ์ ํ๋ฉด์ Stack์ ์ฌ๋ฌ ๋ฒ ์๊ณ ์ถ์ ๊ฒฝ์ฐ
์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๋ค๊ณ ๊ฐ์ ํ๋ฉด์ ์ฌ๋ฌ ๋ฒ ๋ฐฉ๋ฌธ ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์๋ค. ์ผ๋จ '๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๋ค๊ณ '๋ ์ฐจ์นํ๊ณ , ๊ฐ์ ํ๋ฉด์ ์ฌ๋ฌ ๋ฒ ๋ฐฉ๋ฌธํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์.
"์ด? ๊ทธ๋ฅ navigate("์ง๊ธ ์๋ ํ๋ฉด์ ์ด๋ฆ")์ผ๋ก ํ๋ฉด ๋์ง ์๋์? "
ํ๋ฒ ํด๋ณด๋ผ. ๋ถ๋ช details๋ก ๊ฐ๋ ๋ฒํผ์ ์ฌ๋ฌ ๋ฒ ๋๋ฅผ ๋ ๋ง๋ค Stack์ ๊ฐ์ ํ๋ฉด์ด ์ฌ๋ฌ ๊ฐ ์์๋ค๋ฉด, ๋ค๋ก ๊ฐ๊ธฐ๋ฅผ ๋๋ ์ ๋ details ํ๋ฉด์ด ๋ณต์๋ก ๋์์ผ ํ๋ค.
ํ์ง๋ง navigate๋ก ์์ ์, ๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ณง์ฅ ์ด๊ธฐ ํ๋ฉด์ธ Home์ผ๋ก ์จ๋ค!
์ด ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค. navigate์ ๋๋ต์ ๋ป์ ()์์ ์คํฌ๋ฆฐ์ผ๋ก ์ด๋ํ๋ผ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฏธ ํด๋น ํ๋ฉด์ ์ ์๋ค๋ฉด ํด๋น ํจ์๋ฅผ ์คํํด๋ ์๋ํ์ง ์๋๋ค! ๋ํ Stack์ ํด๋น ์คํฌ๋ฆฐ์ด ์ด๋ฏธ ์์ฌ ์๋ค๋ฉด, ๊ทธ ์คํฌ๋ฆฐ์์ ์์ธ ํ๋ฉด๋ค์ ๋ค pop ํ๊ณ ํด๋น ์คํฌ๋ฆฐ์ผ๋ก ์ด๋ํ ๋ฟ, ์๋ก ์์ง ์๋๋ค.
๋ง์ฝ ๊ฐ์ ํ๋ฉด์ ์ฌ๋ฌ๋ฒ ๋ฐฉ๋ฌธํ๊ณ ์ถ๋ค๋ฉด, Navigation.navigate() ๋์ ์ Navigation.push()๋ฅผ ์จ์ผํ๋ค. push๋ ์ด๋ฆ์์๋ ์ ์ ์๋ฏ์ด Stack์๋ค๊ฐ ()์์ ํ๋ฉด์ ์์๋ผ๋ ๋ช ๋ น์ด ์ด๋ค.
function DetailsScreen({ navigation }) {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Details Screen</Text>
<Button
title="Go to Details... again"
onPress={() => navigation.navigate('Details')}
/>
</View>
);
}
b. ๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ/ ์์ ์ฒ์์ผ๋ก ๊ฐ๊ธฐ ๋ฒํผ
์คํฌ๋ฆฐ์ด 2๊ฐ ์ด์ ์์์ ์, StackNavigator๋ ์๋์ผ๋ก ๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ์ ์ ๊ณตํ๋ค. ํ์ง๋ง ์ด๋ค ๊ฒฝ์ฐ์ ์ฐ๋ฆฌ๋ ๋ด์ฉ๋ฌผ ์์ go back ๋ฒํผ์ด ํ์ํ๊ธฐ๋ ํ๊ณ , ์ง์ ํ๋ฉด ๋ง๊ณ , ๋งจ ์ฒ์์ผ๋ก ๋์๊ฐ๊ธฐ ๋ฒํผ์ด ํ์ํ๊ธฐ๋ ํ๋ค.
๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, navigation.goBack()์ด๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ํด๋น ํจ์๋ ()์์ ๋ญ๋ผ๊ณ ์ ๋ ์ง์ ํ๋ฉด์ผ๋ก ๋๋์๊ฐ๋ค.
๋ง์ฝ ์ด๊ธฐํ๋ฉด (์ด๋ฆ์ด Home์ด๋ผ๊ณ ๊ฐ์ )์ผ๋ก ๋์๊ฐ๊ณ ์ถ๋ค๋ฉด,
navigation.navigate("Home")์ ์ฐ๊ฑฐ๋, navigation.popToTop()์ ์ฐ๋ฉด ๋๋ค.
๋ ๋ช ๋ น์ด ๋ค ์์ธ ์คํ๋ค์ ๋ค ์ ๊ฑฐํ๊ณ , ๋งจ ๋ฐ์ ์๋ ์ด๊ธฐํ๋ฉด์ผ๋ก ๋์๊ฐ๋ผ๋ ๋ป์ด๋ค.
4. ํ๋ฉด ์ด๋ ์ Params ๋ณด๋ด๊ธฐ
Passing parameters to routes | React Navigation
(1) ๊ธฐ๋ณธ์ ์ธ ์ ์ฐจ
a. navigation.navigate()์ ๋ ๋ฒ์งธ ์ธ์๋ก ๊ฐ์ฒดํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋ณด๋ด๋ฉด ๋๋ค.
navigation.navigate('Details', {
itemId: 86,
otherParam: 'anything you want here',
});
b. ์ฐ๋ฆฌ๊ฐ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฃ์ ๊ฐ์ฒด๋ route๋ ๊ฐ์ฒด์ params๋ผ๋ ๋ฉค๋ฒ๋ก ๋ค์ด์๋ค.
(์ผ๋ฐ์ ์ธ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก params ์ด๋ ์ props์ ์ญํ ์ route.params๊ฐ ๋์ ํ๋ ๊ฒ์ด๋ค.)
function DetailsScreen({ route, navigation }) {
/* 2. Get the param */
const { itemId, otherParam } = route.params;
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Details Screen</Text>
<Text>itemId: {JSON.stringify(itemId)}</Text>
<Text>otherParam: {JSON.stringify(otherParam)}</Text>
<Button
title="Go to Details... again"
onPress={() =>
navigation.push('Details', {
itemId: Math.floor(Math.random() * 100),
})
}
/>
<Button title="Go to Home" onPress={() => navigation.navigate('Home')} />
<Button title="Go back" onPress={() => navigation.goBack()} />
</View>
);
}
์ฐ๋ฆฌ๋ params๋ฅผ ๊ตฌ์กฐ ๋ถํด ํ ๋น ํ์ฌ, ์ฐ๋ฆฌ๊ฐ ๋ฃ์ ๋ฐ์ดํฐ๋ค์ ๊บผ๋ด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
route๋ผ๋ ์์ฑ ๋ํ navigation๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋น ์คํฌ๋ฆฐ์ด ๋ค๋น๊ฒ์ดํฐ ์์ ์ํด ์๋ค๋ฉด ์๋์ผ๋ก ์ธ์๋ก ๋ค์ด์ค๋ ์์ฑ์ด๋ค.
(2) ์ธ์๋ก ๋ค์ด์์ผ ํ๋ Params๊ฐ ์ ๋ค์ด์์ ๋ ๋๋น (initialParams)
์์ ์์์์ itemId์ OtherParams๋ ๊ผญ ๋ค์ด์์ผ ํ๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๊ฐ ํด๋น ์ธ์๋ฅผ ๊บผ๋ด์ <Text> ํ๊ทธ์์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์์ผ๋ฉด ์๋ฌ๋๋ค.
๊ทผ๋ฐ ๊น๋นกํ๊ณ ์ ๋ณด๋ด๊ธฐ ๋ง๋ จ์ด๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ํด๋น ์คํฌ๋ฆฐ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ฑ์ผ๋ก initialParams๋ฅผ ์ค์ ํ๋ฉด, ๋ง์ฝ ์์ ์ปดํฌ๋ํธ๋ก ํด๋น ์ธ์๊ฐ ๋ค์ด์ค์ง ์์ ๊ฒฝ์ฐ initialParams๊ฐ ๋์ ์ฐ์ธ๋ค.
<Stack.Screen
name="Details"
component={DetailsScreen}
initialParams={{ itemId: 42 }}
/>
Details๋ก ํ๋ฉด ์ด๋ ์ itemId๊ฐ ๋ค์ด์ค์ง ์์ผ๋ฉด , 42๋ผ๋ ๊ฐ์ด ๋์ ์ฐ์ธ๋ค.
(3) Screen ์์ ์ปดํฌ๋ํธ์์ Params์ ๊ฐ update ํ๊ธฐ
์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ํด๋น ํ๋ฉด์ ์์๋๋ฐ, ํน์ Params๋ฅผ ๊ณ ์ณ์ผ ํ๋ ์๊ฐ์ด ์๋ค. ์ฃผ์ฌ์ ๋์ง๊ธฐ๋ผ๊ณ ์๊ฐํด๋ณด์.
๋ค๋ฅธ ํ๋ฉด์ ์ฃผ์ฌ์๋์ง๊ธฐ! ๋ฒํผ์ ๋๋ฅด๊ณ ์ฃผ์ฌ์ ๋์ง๋ ํ๋ฉด์ผ๋ก ์๋ค. ํ๋ฉด์ ์ด๋ฏธ 6์ด ๋์์ ธ ์์ง๋ง, ํด๋น ํ๋ฉด์ '์ฃผ์ฌ์ ํ๋ฒ ๋ ๋์ง๊ธฐ' ๋ฒํผ์ ๋๋ฅด๋ฉด ํด๋น ํ๋ฉด์ ๊ฐ์ด ๋ ํ๋ฒ ๋ฐ๋์ด์ผ ํ๋ค.
์ด๋ ์ ์ฉํ๊ฒ ์ธ ์ ์๋ ๊ฒ์ด navigation.setParams({๋ฐ๊ฟ ๊ฐ์ ์ด๋ฆ: ๋ฐ๊พธ๋ ๋ด์ฉ}) ์ด๋ค.
function HomeScreen({ route, navigation }) {
const { itemId } = route.params;
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Home Screen</Text>
<Text>itemId: {JSON.stringify(itemId)}</Text>
<Button
title="Update param"
onPress={() =>
navigation.setParams({
itemId: Math.floor(Math.random() * 100),
})
}
/>
</View>
);
}
์ด ํจ์๋ ํ ์คํฌ๋ฆฐ์ ํ์๋๋ ๋๋ค ์๋ฅผ updateParam ๋ฒํผ์ ๋๋ฌ ๊ณ์ ๋ฐ๊ฟ์ฃผ๊ณ ์๋ค.
(4) ์ด์ ํ๋ฉด์ผ๋ก Params ๋ณด๋ด๋ ์ ์ฐจ
์ธ๋ป ๋ณด๋ฉด ์ด๋ ค์ด ๋ก์ง์ด ๋ค์ด๊ฐ ๊ฒ ๊ฐ์ง๋ง, ์ ์ผ ์ฝ๋ค. navigate ํจ์ ๊ธฐ์ตํ๋๊ฐ? ์ฐ๋ฆฌ๊ฐ ์ด๊ธฐ ํ๋ฉด์ผ๋ก ๋์๊ฐ๊ณ ์ถ์๋ค๋ฉด, navigate("Home")์ ์จ์ฃผ๋ฉด ๋์๋ค. ์ด๋ Home ์์ ์์ฌ์๋ ๋ค๋ฅธ Screen๋ค์ ์ ๋ถ popํ๊ณ ๊ทธ ํ๋ฉด์ผ๋ก ๋์๊ฐ๋ค.
์ฐ๋ฆฌ๋ ์ด๋ ์ฌ๊ธฐ๋ค๊ฐ params๋ง ๋ํด์ ๋ณด๋ด์ฃผ๋ฉด ๋๋ค.
function CreatePostScreen({ navigation, route }) {
const [postText, setPostText] = React.useState('');
return (
<>
<TextInput
multiline
placeholder="What's on your mind?"
style={{ height: 200, padding: 10, backgroundColor: 'white' }}
value={postText}
onChangeText={setPostText}
/>
<Button
title="Done"
onPress={() => {
// Pass and merge params back to home screen
navigation.navigate({
name: 'Home',
params: { post: postText },
merge: true,
});
}}
/>
</>
);
}
์ฌ๊ธฐ์๋ navigate()์ ()์์ ์ ๋ณด๋ฅผ ์ธ์ ํ๋์ ๋ค ์ฐ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ๋ณด์ฌ์คฌ์ง๋ง, ๋ปํ๋ ๋ฐ๋ ๊ฐ๋ค.
(5) Nested ๋ Screen์ผ๋ก params ๋ณด๋ด๊ธฐ(๋ค๋น๊ฒ์ดํฐ ์ ๋ค๋น๊ฒ์ดํฐ์ ์คํฌ๋ฆฐ์ผ๋ก)
Nested๋ ์ด์ค์ด๋ผ๋ ๋ป์ด๋ค. ์ฌ๊ธฐ์๋ Navigator ์ Navigator๊ฐ ํ๋ ๋ ์๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ 1์ธต์ด ์๋๋ผ ์งํ 1์ธต์ ์กด์ฌํ๋ Screen์๊ฒ params๋ฅผ ๋ณด๋ด๊ณ ์ถ์ ๊ฒ์ด๋ค.
navigation.navigate('Account', {
screen: 'Settings',
params: { user: 'jane' },
});
์ฌ๊ธฐ์ Account๋ Navigator ์์ Navigator์ด๋ค. ๋ ๋ฒ์งธ ์ธ์์ธ ๊ฐ์ฒด๋ Account๊ฐ Params๋ก ๋ฐ์ ๊ฐ์ฒด์ด๋ค.
์ฐ๋ฆฌ๋ Account๊ฐ ๋ฐ์ Params์์ params๋ฅผ ๋ ์จ์คฌ๋ค. params๋ nested ํด์ ๋ณด๋ด์ฃผ๋ฉด ๋๋ค๋ ๊ฒ์ด๋ค.
์ด๋ Account ์์ Screen์ด ๋ณต์ ์ผ ์ ์์ผ๋ฏ๋ก ํด๋น params๋ฅผ ๋ณด๋ผ Screen์ ์ด๋ฆ๋ ๊ฐ์ด ์ ์ด์ค์ผ ํ๋ค.
** ์ฐธ๊ณ ์ฌํญ TextInput ํ๊ทธ์ ๊ดํ์ฌ**
textInput์ ์์ฑ์ ๋ํ ์ค๋ช
multiline -> default๋ false์ธ๋ฐ, true๋ก ๋ณ๊ฒฝํ๋ฉด, ์ฌ๋ฌ ์ค ์
๋ ฅ ๊ฐ๋ฅ
onChangeText
-> ์ฌ์ฉ์์ ์
๋ ฅ์ด ๋ฐ๋๋ฉด ํธ์ถ ๋๊ณ ,
์ฌ์ฉ์ ์
๋ ฅ์ผ๋ก ์ธํด ๋ฐ๋ ํ
์คํธ๋ฅผ
ํ๋์ ๋ฌธ์์ด ๋จ๋ฝ์ผ๋ก ์ฝ๋ฐฑ ํจ์์๊ฒ ๋ณด๋ธ๋ค.
์ฌ์ฉ์๊ฐ ์น ๋๋ง๋ค ์ง๊ธ๊น์ง ์ณค๋ ํ
์คํธ ์ ๋ถ๋ฅผ ์ธ์๋ก ๋ณด๋ธ๋ค.
native value -> ๊ธฐ๋ณธ๊ฐ
value -> ๊ธฐ๋ณธ๊ฐ์ด ์ฃผ์ด์ง ๊ฒฝ์ฐ, ํด๋น ๊ฐ๊ณผ ์ผ์นํ ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ค.
5. ํค๋ ํ๊ฒฝ ์ค์
Configuring the header bar | React Navigation
(1) params๋ฅผ ์ด์ฉํด Screen Header์ title ๋ฐ๊พธ๊ธฐ
a. ๊ทธ๋ฅ screen์ ์์ฑ์ธ Options ์ฌ์ฉํ์ฌ ๋ฐ๊พธ๊ธฐ
function StackScreen() {
return (
<Stack.Navigator>
<Stack.Screen
name="Home"
component={HomeScreen}
options={{ title: 'My home' }}
/>
</Stack.Navigator>
);
}
b. params ์ด์ฉํ์ฌ ๋ฐ๊พธ๊ธฐ.
์ด๋ ํ๋ฉด ์ด๋์ navigate ํจ์์ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ค์ด์จ ๊ฐ๋ค์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ Options ์์ฑ์ด ๋ฐ์์ ์ด์ฉํ๋ ์๋ฆฌ์ด๋ค.
/*HomeScreen ๋ด๋ถ*/
navigation.navigate("profile", {name : "It is a profile"})
/*-----------------------------------------------------------------*/
function StackScreen() {
return (
<Stack.Navigator>
<Stack.Screen
name="Home"
component={HomeScreen}
options={{ title: 'My home' }}
/>
<Stack.Screen
name="Profile"
component={ProfileScreen}
options={({ route }) => ({ title: route.params.name })}
/>
</Stack.Navigator>
);
}
์ด๋ฅผ ํตํด Params๋ก ๋ณด๋ด๋ ๊ฐ์ Screen์ ์์ ์ปดํฌ๋ํธ ๋ถ๋ชจ ์ปดํฌ๋ํธ ๋ ๋ค listening ํ๊ณ ์์์ ์ ์ ์๋ค.
(2) ๋ง์ฝ ์ด๋ฏธ ์คํฌ๋ฆฐ์ ๋ค์ด์๋๋ฐ, ํด๋น ์คํฌ๋ฆฐ์ ์ต์ ์ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด?
/* Inside of render() of React class */
<Button
title="Update the title"
onPress={() => navigation.setOptions({ title: 'Updated!' })}
/>
setParams์ ๋ง์ฐฌ๊ฐ์ง๋ก setOptions๋ฅผ ์ด์ฉํด Screen์ Options ๊ฐ์ฒด ๋ด๋ถ ๊ฐ๋ค์ update ํ ์ ์๋ค.
ํท๊ฐ๋ฆฌ์ง ๋ง์! setParams๋ ์ด๋ฏธ ๋๋๋ ํ๋ฉด์ ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๊ณ , setOptions๋ ๋๋๋ ํ๋ฉด์ Screen Options๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด๋ค.
(3) Hedaer์ ์คํ์ผ์ ๋ณ๊ฒฝํ๋ Option์ key ๊ฐ๋ค
function StackScreen() {
return (
<Stack.Navigator>
<Stack.Screen
name="Home"
component={HomeScreen}
options={{
title: 'My home',
headerStyle: {
backgroundColor: '#f4511e',
},
headerTintColor: '#fff',
headerTitleStyle: {
fontWeight: 'bold',
},
}}
/>
</Stack.Navigator>
);
}
headerStyle์ ์คํฌ๋ฆฐ์ Header๋ฅผ ๊ฐ์ธ๊ณ ์๋ View์ ์ ์ฉ๋๋ style ์์ฑ
headerTintColor:
ํค๋ ์ ๋ชฉ๊ณผ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ด ์ด๊ฑฐ์ ์ ์ฉ ๋ฐ๋๋ค.
ํค๋์คํ์ผ ๋ฐ๊นฅ์์ ๊ธฐ์ ํด์ค์ผ ํ๋ค.
headerTitleStyle -> ํด๋ ์ ๋ชฉ์ font, ํฐํธ ๊ตต๊ธฐ, ํค๋ ํ
์คํธ ์คํ์ผ์ ๋ฐ๊ฟ ์ ์๋ ๊ฒ ์ด๊ฒ๋ headerstyle ๋ฐ๊นฅ์์ ๊ธฐ์ ํด์ค์ผํจ.
(4) ๋ชจ๋ ์คํฌ๋ฆฐ์ ๋์ผํ ์ต์ ์ฃผ๋ ๋ฐฉ๋ฒ
Navigator์ ์์ฑ ์ค ํ๋์ธ ScreenOptions ์์ Option์ ์ค์ ํ๋ฉด, ํด๋น ๋ค๋น๊ฒ์ดํฐ ๋ด์ ๋ชจ๋ Screen๋ค์๊ฒ ๊ฐ์ Options์ด ์ ์ฉ๋๋ค.
๋ฌผ๋ก ํน์ Screen์๊ฒ๋ ๋ง์ถคํ Option์ ์ ์ฉํ ์ ์๋ค. ScreenOptions์ Options ์ฌ์ด์์ Options๊ฐ ๋ ์ฐ์ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์คํฌ๋ฆฐ ์ปดํฌ๋ํธ์์ ๋ฐ๋ก Options๋ฅผ ์ ์ํ๋ฉด ๊ทธ๊ฒ ์ฐ์ ์ ์ฉ๋๋ค.
function StackScreen() {
return (
<Stack.Navigator
screenOptions={{
headerStyle: {
backgroundColor: '#f4511e',
},
headerTintColor: '#fff',
headerTitleStyle: {
fontWeight: 'bold',
},
}}
>
<Stack.Screen
name="Home"
component={HomeScreen}
options={{ title: 'My home' }}
/>
</Stack.Navigator>
);
}
(5) ๋ด๊ฐ ์ปค์คํฐ๋ง์ด์งํ ํค๋๋ก ์คํฌ๋ฆฐ ํค๋ ๋ฐ๊พธ๊ธฐ
function LogoTitle() {
return (
<Image
style={{ width: 50, height: 50 }}
source={require('@expo/snack-static/react-native-logo.png')}
/>
);
}
function StackScreen() {
return (
<Stack.Navigator>
<Stack.Screen
name="Home"
component={HomeScreen}
options={{ headerTitle: (props) => <LogoTitle {...props} /> }}
/>
</Stack.Navigator>
);
}
Header๋ก ์ธ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ณ , ํด๋น ์ปดํฌ๋ํธ๋ฅผ Screen ์ปดํฌ๋ํธ์ Options ์์ฑ ์์ headerTitle์ ๊ฐ์ผ๋ก ์ง์ด๋ฃ์ผ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ์ title์ value๊ฐ ์๋๋ผ headerTitle์ value๋ก ์ง์ด๋ฃ๋์ง ์๋ฌธ์ด ๋ค ์ ์๋ค.
๊ทธ ์ด์ ๋ headerTitle์ด ๋ฐ๋ก ์ ์๊ฐ ์๋์์ ๋ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ํ๋ ๊ธฐ๋ฅ์ด title์ ์ ์๋ text๋ฅผ ํค๋ ์ ๋ชฉ์ผ๋ก ๋์ฐ๋ <Text> ํ๊ทธ๋ฅผ ๋๋ํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ headerTitle์ด๋ key๊ฐ์ด title๋ณด๋ค ์์ ๊ฐ๋ ์์ ์ ์ ์๋ค.