๐Ÿ’ป[React Native] React Navigation, Scroll

ํ˜ฑยท2023๋…„ 1์›” 8์ผ

React Native Navigation : ์™ธ๊ตญ ๊ฐœ๋ฐœ์—์„œ ๋งŽ์ด ์“ฐ์ž„

โœ”๏ธ React Navigation

ํ•„์ˆ˜ ์„ค์น˜ npm install @react-navigation/native
expo์ธ ๊ฒฝ์šฐ: npx expo install react-native-screens react-native-safe-area-context
npm install @react-navigation/native-stack : ์ƒˆ๋กœ์šด ๋ทฐ๊ฐ€ ์Œ“์ด๋„๋ก ์˜ฌ๋ผ์˜ค๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜

// In App.js in a new project

import * as React from 'react';
import { View, Text } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';

function HomeScreen() {
return (
 <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
   <Text>Home Screen</Text>
 </View>
);
}

const Stack = createNativeStackNavigator();

function App() {
return (
 <NavigationContainer>
   <Stack.Navigator>
     <Stack.Screen name="Home" component={HomeScreen} />
   </Stack.Navigator>
 </NavigationContainer>
);
}

export default App;

<NavigationContainer>: ์•ฑ์—์„œ ๋ณดํ†ต ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉ, ๋‹ค ๊ฐ์‹ธ๋Š” ํ˜•ํƒœ
<Navigator>: ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ์Œ, ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ชจ์—ฌ์„œ ํ•˜๋‚˜์˜ ์•ฑ์„ ๋งŒ๋“ฆ
(์šฉ๋„ ๋ณ„๋กœ ๋‚˜๋‰˜์–ด์„œ) ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ <Screen>
<Stack>์—๋Š” name๊ณผ component๊ฐ€ ๋“ค์–ด๊ฐ
๊ฐ component๋Š” props๋กœ props->props.navigation ๋˜๋Š” {navigation}์„ ๋ฐ›์Œ: ํ˜„์žฌ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ •๋ณด + ๋‚ด๊ฐ€ ์•ž์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™๋“ค๋„ ๋“ค์–ด์˜ค๊ฒŒ ๋จ

function Hone({navigation}) {
  return (
    <>
      <Button
        title="๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ๊ธฐ"
        onPress={() => {
          navigation.navigate('LottoGenerator');
        }}
      />
    </>
  );
}

`' ios: ์ขŒ์šฐ, ์•ˆ๋“œ๋กœ์ด๋“œ: ์ƒํ•˜๋กœ ์Œ“์—ฌ ์žˆ๋Š” ๊ฒƒ, ์›๋ž˜ ํ™”๋ฉด์ด ๋’ค๋กœ ๊ฐ€๊ณ  ์œ„์— ์Œ“์ด๋Š” ๊ฒƒ
๊ธฐ๋ณธ๊ฐ’: header(๋’ค๋กœ ๊ฐ€๋Š” ๋ฒ„ํŠผ)

โœ”๏ธ Scroll

๊ธฐ๋ณธ View๋Š” scroll์ด ๋˜์ง€ ์•Š์Œ

ScrollView: List Component๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ: <ScrollView>

FlatList: List component๊ฐ€ overflow๋˜๋Š” ๊ฒƒ์„ ์ง€์›: dataset์„ ํ™”๋ฉด์— ๋ฟŒ๋ฆฌ๋Š” ํ˜•ํƒœ

 <FlatList
       data={DATA} //์–ด๋–ค ๋ฐ์ดํ„ฐ?
       renderItem={renderItem} //์–ด๋–ค ํ˜•ํ…Œ๋กœ ๊ทธ๋ฆด ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ํ•จ์ˆ˜
       keyExtractor={item => item.id} //item์˜ key๋ฅผ ์–ด๋–ค ๊ฒƒ์œผ๋กœ ์“ธ ์ง€
     /> 

dataset์—๋Š” ํ•ญ์ƒ key๊ฐ€ ํ•„์š”!! > ์–ด๋–ค ๊ฒƒ์ธ์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก

const screenList = [
 {key:1, title: "๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ๊ธฐ", link: "LottoGenerator"},
 {key:2, title: "์ž์—ฐํ’๊ฒฝ์‹œ๊ณ„", link: "WatchFace"},
]

function Home({navigation}) {
   function renderItem({item}){
 		return <Button title={props.item.title} 
		onPress={()=>{navigation.navigate(item.link);
   }}/>
} //ํ•จ์ˆ˜ ์•ˆ์— ํ•จ์ˆ˜-> rendering์ด ํ™”๋ฉด์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์•ˆ์˜ ํ•จ์ˆ˜๋„ ๊ฐ™์ด ๋จ
 return (
   <>
     <FlatList data={screenList} renderItem={renderItem}/>
   </>
 );
}

๐Ÿ”ง useCallback(): ์ฃผ์‹œํ•˜๋Š” ๋Œ€์ƒ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์„ ์–ธ!

react์—์„œ useCallback()์„ ์„ ์–ธํ•ด์˜ด(useState ์ฒ˜๋Ÿผ)

const screenList = [
  {key:1, title: "๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ๊ธฐ", link: "LottoGenerator"},
  {key:2, title: "์ž์—ฐํ’๊ฒฝ์‹œ๊ณ„", link: "WatchFace"},
]

function Home({navigation}) {
    const renderItem = useCallback(({item}) => {
  		return <Button title={item.title} 
    	onPress={() =>{navigation.navigate(item.link);
    }}/>
}, [] );
  return (
    <>
      <FlatList data={screenList} 
              	renderItem={renderItem}
              	keyExtractor={item => item.key}/>
    </>
  );
}

๐Ÿ”ง Pressable: ์–ด๋–ค ์š”์†Œ๋“ ์ง€ ํด๋ฆญ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ์คŒ

์ด๋ฏธ์ง€, ๋ณธ๋ฌธ ์•ˆ์˜ ํ…์ŠคํŠธ ๋“ฑ, ๋ฒ„ํŠผ UI-> ์Šคํƒ€์ผ๋กœ ์ง€์ •๋œ UI
ios, ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ๊ฐ™๋„๋ก ๊ณ ์œ ์˜ UI ๋””์ž์ธ์„ ์ง€์ •ํ•œ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ

const LinkItem = styled.View`
padding: 8px 12px;
border-bottom: 1px solid #e5e5e5;
`;

function Home({navigation}) {
    const renderItem = useCallback(({item}) => {
    return (
      <Pressable onPress={() => navigation.navigate(item.link)}>
      <LinkItem>
      <Text>{item.title}</Text>
      </LinkItem>
      </Pressable>
    )
}, [] );
profile
new blog: https://hae0-02ni.tistory.com/

0๊ฐœ์˜ ๋Œ“๊ธ€