다양한 네비게이션 패턴을 제공함
overflow: Platform.OS === 'android' ? 'hidden' : 'visible' styles.button,
pressed ? styles.buttonPressed : null,
]}
React Navigation Package 설치 후,
앱의 모든 화면을 NavigationContainer로 감싸기
createNativeStackNavigator: 화면과 사용자 정의 옵션을 포함한 Configuration Object를 인수로 받아 실행되는 함수. 화면은 네비게이터가 표시할 콘텐츠를 렌더링하는 리액트 컴포넌트들.createStaticNavigation: 네비게이터를 인수로 받아 실행되는 함수로 앱에서 렌더링할 수 있는 컴포넌트들을 반환. 앱에서 딱 한번 호출됨Stack.Navigator와 Stack.Screen 에서 커스터마이징 할 수 있다.import CategoriesScreen from './screens/CategoriesScreen'; // 첫 번째 화면
import MealsOverviewScreen from './screens/MealsOverviewScreen'; // 두 번째 화면
const App = () => {
return (
<NavigationContainer>
<Stack.Navigator
screenOptions={{
headerStyle: { backgroundColor: '#f4511e' },
headerTintColor: '#fff',
headerTitleStyle: { fontWeight: 'bold' },
}}
>
{/* 첫 번째 화면 */}
<Stack.Screen
name="Categories" // 유니크한 화면 이름
component={CategoriesScreen}
options={{
title: 'Meal Categories', // 헤더 제목 변경
}}// 렌더링할 컴포넌트
/>
{/* 두 번째 화면 */}
<Stack.Screen
name="MealsOverview"
component={MealsOverviewScreen}
/>
</Stack.Navigator>
</NavigationContainer>
);
};
export default App;
react-native-screens 라이브러리를 활용화면 전환을 위해 navigation 객체를 사용하는데 이는 props로 전달되며 navigate 메서드를 통해 화면 이동을 처리함
이 객체는 Stack.Screen에 등록된 컴포넌트에서만 기본적으로 접근 가능
import { FlatList } from 'react-native';
import { CATEGORIES } from '../data/dummy-data';
import CategoryGridTile from '../components/CategoryGridTile';
export default function CategoriesScreen({ navigation }) {
function renderCategoryItem(itemData: any) {
function pressHandler() {
navigation.navigate('MealsOverview', {
categoryId: itemData.item.id,
});
}
return (
<CategoryGridTile
title={itemData.item.title}
color={itemData.item.color}
onPress={pressHandler}
/>
);
}
return (
<FlatList
data={CATEGORIES}
keyExtractor={(item) => item.id}
renderItem={renderCategoryItem}
numColumns={2}
/>
);
}
useNavigation 훅을 사용한다.import { useNavigation } from '@react-navigation/native';
const CategoryGridTile = () => {
const navigation = useNavigation();
return (
<Pressable onPress={() => navigation.navigate('MealsOverview')}>
<Text>Go to Meals</Text>
</Pressable>
);
};
https://reactnavigation.org/docs/route-object
import { View, Text, StyleSheet } from 'react-native';
import { MEALS } from '../data/dummy-data';
export default function MealsOverviewScreen({ route }) {
const categoryId = route.params.categoryId;
// const route= useRoute()
// route.params 를 대신 사용해도 된다.
const displayedMeals = MEALS.filter((mealItem) => {
return mealItem.categoryIds.indexOf(categoryId) >= 0;
});
return (
<View style={styles.container}>
<Text>Meals Overview Screen a</Text>
<Text>{categoryId}</Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 16,
},
});