
ReactNavigation ํํ์ด์ง
ํ์ํ Package ์ค์น ํ (์๋๋ก์ด๋๋MainActivity์์@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(null); }๋ํ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ํด์ฃผ์ด์ผ ํ๋ค.
๋ค๋น๊ฒ์ด์ ๊ฒฝ๋ก ์คํฌ๋ฆฐ: BoxOffice page-> ํ๋์ ์ํ ํด๋ฆญ -> MovieDetail page -> ๊ฐ๋ ๋๋ ๋ฐฐ์ฐ ํด๋ฆญ -> ๊ฐ๋ , ๋ฐฐ์ฐ์ ๋ํ ์ผํ page
DefaultStackNavigator.js
import React from 'react'; import {createNativeStackNavigator} from '@react-navigation/native-stack'; import BoxOffice from '../screens/BoxOffice'; import MovieDetail from '../screens/MovieDetail'; import SearchResult from '../screens/SearchResult'; const Stack = createNativeStackNavigator(); export default function DefaultStackNavigator() { retrun( <> <Stack.Navigator> <Stack.Screen name={'BoxOffice'} component={BoxOffice} /> <Stack.Screen name={'MovieDetail'} component={MovieDetail} /> <Stack.Screen name={'SearchResult'} component={SearchResult} /> </Stack.Navigator> </>, ); }๊ฐ screen์ ๋ํ StackNavigator๋ฅผ ์ค์ ํ๊ณ , ์ด๋ฅผ component๋ก ๋ฌถ์
์ดํ ๋ฌถ์RootControllerstate๋ฅผ App.js์ ์ถ๊ฐexport default function RootController() { return ( <NavigationContainer> <DefaultStackNavigator /> </NavigationContainer> ); }
BoxOffice.js
import React, {useEffect} from 'react'; import BoxOfficeItem from '../components/BoxOfficeItem'; import axios from 'a xios'; export default function BoxOffice({navigation}) { const [ranks, setRanks] = useState((initialState = [])); useEffect( (effect = () => { const url = 'https://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json'; axios.get( url, (config = { params: { key: 'bb4881b8d562d9187648f76284e6f14c', targetDt: '20220222', }, }).then(res => { setRanks(res.data?.boxOfficeResult?.dailyBoxOfficeList || []); }), ); }), (deps = []), ); return ( <> {ranks.map(item => ( <BoxOfficeItem navigation={navigation} key={item.rnum} data={item} /> ))} </> ); }BoxOfficeItem.js
import {useNavigation} from '@react-navigation/native'; import React, {useCallback} from 'react'; import {Pressable} from 'react-native'; import Paragraph from './ui/Paragraph'; import styled from 'styled-components'; const Container = styled.View` padding: 11px; `; export default function BoxOfficeItem({data}) { const navigation = useNavigation(); let intenIcon = 'โบ'; const parsedRankInten = parseInt(data.rankInten, {radix: 10}); if (parsedRankInten < 0) { intenIcon = '๐ฝ'; } else if (parsedRankInten > 0) { intenIcon = '๐ผ'; } const navigateMovieDetail = useCallback( ((callback = () => { navigation.navigate('MovieDetail', {movieCd: data.movieCd}); }), (deps = [navigation, data])), ); return ( <Pressable onPress={navigateMovieDetail}> <Container> <Row> <Paragraph> <Paragraph>{data.rank}</Paragraph> <Paragraph> {intenIcon} {data.rankInten} </Paragraph> <Paragraph>{data.movieNm}</Paragraph> <Paragraph>{data.rankOldAndNew === 'NEW' ? '๐' : ''}</Paragraph> </Paragraph> </Row> </Container> </Pressable> ); }๊ฐ ์์ดํ ์ ํด๋นํ๋
BoxOfficeItem.js์์MovieDetailํ์ด์ง๋ก ๋์ด๊ฐ ์ ์๋๋กconst navigateMovieDetail = useCallback( ((callback = () => { navigation.navigate('MovieDetail', {movieCd: data.movieCd}); }), (deps = [navigation, data])), );
<Pressable onPress={navigateMovieDetail}>์ฒ๋ฆฌ,
navigation Hook ๋ง๋ค์ด ์ฒ๋ฆฌ
MovieDetail.js
import {useFocusEffect, useRoute} from '@react-navigation/native'; import React, {useCallback, useEffect, useState} from 'react'; import {ActivityIndicator, Pressable} from 'react-native'; import Row from '../components/Row'; import Paragraph from '../components/ui/Paragraph'; import axios from 'axios'; export default function MovieDetail({route, navigation}) { const [detail, setDetail] = useState((initialState = null)); useFocusEffect( useCallback( (callback = () => { const url = 'https://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieInfo.json'; axios.get( url, (config = { params: { key: 'bb4881b8d562d9187648f76284e6f14c', movieCd: route.params.movieCd, }, }) .then(res => setDetail(res.data.movieInfoResult.movieInfo)) .catch(console.warn), ); }), (deps = []), ), ); if (!detail) return <ActivityIndicator />; //๋ก๋ฉ์ด ๋์๊ฐ๋ ํ์ return ( <> <Row> <Paragraph>์ํ๋ช : {detail.movieNm} </Paragraph> </Row> <Row> <Paragraph>์์์๊ฐ : {detail.showTm}๋ถ </Paragraph> </Row> <Row> <Paragraph>๊ฐ๋ด์ผ : {detail.openDt} </Paragraph> </Row> <Row> <Paragraph> ๊ฐ๋ : {detail.directors.map(director => ( <Link key={director.peopleNm} onPress={() => { navigation.navigate('SearchResult', { peopleNm: director.peopleNm, }); }}> {director.peopleNm} </Link> ))} </Paragraph> </Row> <Row> <Paragraph> ์ถ์ฐ: {detail.actors.map(actor => ( <Link key={actor.peopleNm} onPress={() => { navigation.navigate('SearchResult', { peopleNm: actor.peopleNm}); }}> {actor.peopleNm} </Link> ))} </Paragraph> </Row> </> ); }SearchResult.js
import React, {useCallback} from 'react'; import {useFocusEffect} from '@react-navigation/native'; import axios from 'axios'; import {FlatList, Pressable} from 'react-native'; import Paragraph from '../components/ui/Paragraph'; export default function SearchResult() { const [list, setList] = useState((initialState = [])); useFocusEffect( useCallback( (callback = () => { const url = 'https://www.kobis.or.kr/kobisopenapi/webservice/rest/people/searchPeopleList.json'; axios.get( url, (config = { params: { key: 'bb4881b8d562d9187648f76284e6f14c', peopleNm: route.params.peopleNm, }, }) .then(res => setList(res.data.peopleListResultpeopleList)) .catch(console.warn), ); }), (deps = []), ), ); return ( <FlatList data={list} keyExtractor={item => item.peopleCd} renderItem={data => ( <Pressable onPress={() => {}}> <Paragraph> {data.item.peopleNm} <Text>({data.item.filmoNames})</Text> </Paragraph> </Pressable> )}></FlatList> ); }๋ฐฐ์ฐ, ๊ฐ๋ ์ ์ด๋ฆ์ ํด๋ฆญํ๋ฉด ํด๋น ํ์ด์ง๋ก ๋์ด๊ฐ์ผ ํ๋ฏ๋ก,
MovieDetail.js์์onPress={() => { navigation.navigate('SearchResult', { peopleNm: director.peopleNm, });์ผ๋ก ์ฒ๋ฆฌ
StackNavigator๋ก ์ค์ (๋ค๋ฅธ navigation์ ์๋จ ๋งํฌ ํ์ธ)
navigation.navigate('ํ์ด์ง์ด๋ฆ', {๋๊ฒจ์ค params})๋ก ์ค์
๋๋
navigation Hook์ผ๋ก ์ฒ๋ฆฌ
Stack.Screen์์options={{headerShown: false}๋ก stack์ header๋ฅผ ์์ ๊ณ ui๋ฅผ ๊พธ๋ฐ ์ ์์
์ฑ์์ ๊ฐ screens๋ ์ ์ ํ๋ฉด์ ๋ฎ์ด์ฐ์ฌ์ง๋ ๊ฒ์ด๋ฏ๋ก, useEffect๋ก๋ ์ํ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ธ ์ ์์ ๋ฐ๋ผ์ ๊ฐ ์คํฌ๋ฆฐ์ ๋ฐ๋ผ๋ณด๋ ์์ ์ผ๋ก ์ค์ :
useFocusEffect
axios ํต์ ์ get-> ์ ๋ณด๋ฅผ ๋ฐ์ ๋ ํด๋นํ๋ ๋งํฌ(url, https๋ก ์ฒ๋ฆฌ),config์์ ๊ฐparms๋ฅผ ์๊ตฌ์ฌํญ๋๋ก ์ค์ ํ์ฌ ์ ๋ณด๋ฅผ ๋ฐ์