on
[리액트 네이티브를 다루는 기술 #7] 5장 리액트 배비게이션으로 여러...
[리액트 네이티브를 다루는 기술 #7] 5장 리액트 배비게이션으로 여러...
@ List
* 5.1 설치 및 적용하기
** 5.1.1 의존 패키지 설치하기
** 5.1.2 라이브러리 적용하기
* 5.2 기본적인 사용법
** 5.2.1 네이티브 스택 내비게이터
** 5.2.2 스크린 이동하기
** 5.2.3 라우트 파라미터
** 5.2.4 뒤로가기
** 5.2.5 헤더 커스터마이징하기
@ Note
1. react-navigation 의존 패키지 설치
// 모듈 설치 yarn add @react-navigation/native // 의존 라이브러리 설치 yarn add react-native-screens react-native-safe-area-context
- reference : https://reactnavigation.org/docs/getting-started
2. 주요 함수
- navigation.push() : 새로운 화면이 스택이 쌓여가면서 전환됨, 뒤로가기 클릭 시 이전 화면 열림
- navigation.navigate() : 새로운 화면이 현재 화면과 같으면 화면을 쌓지않고 파라미터만 변경함, 뒤로가기 클릭 시 홈 화면 열림
- navigation.pop() : 뒤로가기
- navigation.popToTop() : 처음으로 가기
3. 화살표 함수 사용 시 주의점
- 화살표 함수 호출 시 바로 반환하는 경우는 중괄호와 return 생량 가능
> const add = (a, b) => { return a + b };
> const add = (a, b) => a + b;
- 바로 반환하는 값이 객체 타입이면 객체를 소괄로 감싸줘야 함
> const createObject = (a, b) => { return {a, b}; };
> const createObject = (a, b) => ({a, b})
4. navigation, route 파라미터의 사용
- HomeScreen({navigation}) 에서 navigation.push('Detail', {id: 1})} 로 id값 넘겨줌
- DetailScreen({route}) 에서 route.params.id 로 id 값 불러옴
DetailScreen 에 넘어오는 route, navigation Props의 정보
5. Header 커스터마이징 시 Options Props
> Stack.Navigatior 의 screenOptions={} : 모든 화면에 공통으로 적용할 때
> Stack.Screen 의 options={} : 개별 화면에 적용할 때
- reference : https://reactnavigation.org/docs/native-stack-navigator#options
# App.js
import React from 'react'; import {NavigationContainer} from '@react-navigation/native'; import {createNativeStackNavigator} from '@react-navigation/native-stack'; import HomeScreen from './screens/HomeScreen'; import DetailScreen from './screens/DetailScreen'; import {View, Text, TouchableOpacity, SafeAreaView} from 'react-native'; import HeaderlessScreen from './screens/HeaderlessScreen'; const Stack = createNativeStackNavigator(); function App() { return ( ( Left ), headerTitle: ({children}) => ( {children} ), headerRight: () => ( Right ), }} /> ); } export default App;
# screens > HomeScreen.js
import React, {useEffect} from 'react'; import {View, Button} from 'react-native'; import HeaderlessScreen from './HeaderlessScreen'; function HomeScreen({navigation}) { // useEffect(() => { // navigation.setOptions({title: '홈'}); // }, [navigation]); return ( navigation.navigate('Detail')} onPress={() => navigation.push('Detail', {id: 1})} /> navigation.push('Detail', {id: 2})} /> navigation.push('Detail', {id: 3})} /> navigation.push('Headerless', {id: 4})} /> ); } export default HomeScreen;
# screens > DetailScreen.js
import React, {useEffect} from 'react'; import {View, Text, StyleSheet, Button} from 'react-native'; function DetailScreen({route, navigation}) { useEffect(() => { navigation.setOptions({ title: `상세 정보 - ${route.params.id}`, }); }, [navigation, route.params.id]); return ( id: {route.params.id} navigation.navigate('Detail', {id: route.params.id + 1})} onPress={() => navigation.push('Detail', {id: route.params.id + 1})} /> navigation.pop()} /> navigation.popToTop()} /> ); } export default DetailScreen; const styles = StyleSheet.create({ block: { flex: 1, alignItems: 'center', justifyContent: 'center', }, text: { fontSize: 48, }, buttons: { flexDirection: 'row', }, });
# screens > HeaderlessScreen.js
import React from 'react'; import {View, Text, Button} from 'react-native'; import {SafeAreaView} from 'react-native-safe-area-context'; function HeaderlessScreen({navigation}) { return ( Header가 없네? navigation.pop()} title="뒤로가기" /> ); } export default HeaderlessScreen;
이전 이전 01234 ios / android - Stack 전환 테스트
이전 이전 012345 ios / android - Header 커스터마이징
반응형
from http://bocoder.tistory.com/65 by ccl(A) rewrite - 2021-12-27 22:01:09