<๊ฐ์>
์น๊ตฌ ๋ฆฌ์คํธ ๋ง๋ค ๋๋
๋ด ํ๋กํ๊ณผ ๊ตฌ๋ถ๋๋ division ์ ์ ๋๊ณ ,
๊ทธ ๋ฐ์๋ ์น๊ตฌ์ ์น๊ตฌ ๋ช ์ ๋ํ๋ด๋ ๊ตฌ๊ฐ์ด ํ์ํ๋ค. (FriendSection)
๊ทธ๋ฆฌ๊ณ ์น๊ตฌ ๋ฆฌ์คํธ๋ฅผ ํ ๊ธ ํ ์ ์๋ ํ์ดํ๊ฐ ํ์ํ๋ค.
์น๊ตฌ ๋ฆฌ์คํธ๋ data.js์ ์ ์ฅ๋ ์์ ๋ฐ์ดํฐ๋ค์ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ค. (FriendList)
์์ ๋ฐ์ดํฐ๋ค์ ๊ฐ์ฒด๊ฐ ๋ฐฐ์ด๋ก ์ ๋ ฌ๋์ด ์๋ค.
1. ์ฝ๋ ๋ฆฌ๋ทฐ
(1) App.js ์์ ๋ชจ๋ ๊ฐ์ ๊ด๊ณ ํ ๋ฒ์ ๋ณด๊ธฐ
<View style={styles.container}>
<Header />
<Margin height = {10}/>
<Profile
uri={myProfile.uri}
name={myProfile.name}
introduction={myProfile.introduction}
/>
<Margin height={15}/>
<Division/>
<Margin height={12}/>
<FriendSection
friendProfileLen = {friendProfiles.length}
onPressArrow={onPressArrow}
/>
<FriendList
data = {friendProfiles}
/>
</View>
//onPressArrow ๋ก์ง์ ์์ง ์ ์งฐ๊ณ , ํด๋ฆญ์ ๋ก๊ทธ์ ๋จ๋ ๊ฒ๋ง ๋ง๋ค์๋ค.
const onPressArrow = () => {
console.log("clicked arrow")
}
์น๊ตฌ ๋ฆฌ์คํธ ๋ฐฐ์ด์ ๊ธธ์ด๋ ์น๊ตฌ๋ฆฌ์คํธ๋ฅผ ์ ์ฅํด๋์ ๋ฐฐ์ด friendsProfile.length๋ก ๋ฐ์.
(2) Division
import { View } from "react-native";
export default () => {
return (
<View style = {{width: "100%", height: 0.5, backgroundColor: "lightgrey"}}/>
)
}
/*width: 100%๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋๋น ์์ญ ์ ์ฒด๋ฅผ ์ฐจ์ง ํ๊ฒ ๋ค๋ ์๋ฆฌ์ด๋ค.*/
(3) FriendSection
import { View, Text, TouchableOpacity } from "react-native"
import { MaterialIcons } from '@expo/vector-icons';
export default (props) => {
return (
<View style={{flexDirection: "row", justifyContent: "space-between"}}>
<Text style={{color: "grey"}}> ์น๊ตฌ {props.friendProfileLen}</Text>
<TouchableOpacity onPress={props.onPressArrow}>
<MaterialIcons name="keyboard-arrow-down" size={24} color="lightgrey" />
</TouchableOpacity>
</View>
)
}
ใฑ. ๋ฐฐ์ด ์ด๋ฆ ๋ค์์ Len์ ๋ถ์ด๋ฉด ํด๋น ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ ๋ฐํ๋๋ค.
ใด. <TouchableOpacity> ํ๊ทธ ์ด ํ๊ทธ๋ก ๊ฐ์ผ ๊ฒ๋ค์ ์ฌ์ฉ์์ ํฐ์น์ ์๋ตํ ์ ์๊ฒ ๋๋ค.
์ฌ์ฉ์๊ฐ ๋๋ ์ ์, ๊ฐ์ผ ๋ด์ฉ์ ๋ถํฌ๋ช ๋๊ฐ ๊ฐ์ํด์ ํ๋ ค์ง๋ค. (ํด๋ฆญํ ๊ฒ์ ์ค๊ฐํ๊ฒ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์.)
ใท. ์ ์ชฝ์๋ ์ ๋ฒ์ ๋ดค๋ Icon ์ฌ์ดํธ๋ฅผ ์ด์ฉํ ๊ฒ.
(4) FriendList
import { ScrollView, View } from "react-native"
import { getBottomSpace } from "react-native-iphone-x-helper"
import Margin from "./Margin";
import Profile from "./Profile"
const bottomSpace =getBottomSpace();
export default (props) => {
return(
<ScrollView showsVerticalScrollIndicator={false} contentContainerStyle={{paddingBottom: bottomSpace}}>
{props.data.map((item, index) => (
<View key={index}>
<Profile
uri={item.uri}
name={item.name}
introduction={item.introduction}
/>
<Margin height={13}/>
</View>
))}
</ScrollView>
)
}
ใฑ. ScrollView์ ์์ฑ์ธ showsVerticalScrollIndicator๋ ์คํฌ๋กค ํ ๋ ์ค๋ฅธํธ์ ์ผ๋ง๋ ์คํฌ๋กค ํ๋์ง ๋ณด์ฌ์ฃผ๋ Bar ์์ฑ์ ํ ๊ฒ์ธ๊ฐ ๋ง ๊ฒ์ธ๊ฐ๋ฅผ ๋ํ๋ธ๋ค.
ใด. ScrollView์ ์์ฑ contentContainerStyle์ ๋ํด
Scroll View์์ ๊ทธ๋ฅ style ์์ฑ์ผ๋ก ๊พธ๋ฐ ๋๋ ์๊ณ , content ContainerStyle๋ก ๊พธ๋ฐ ๋๋ ์๋๋ฐ ์ด ๋์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ?
react native - style Vs contentContainerStyle in ScrollView? - Stack Overflow ์ฐธ์กฐ
Scroll View์๋ ๋ ๊ฐ์ง ์ธก๋ฉด์ด ์๋ค.
ScrollView์ ํ์ ๋ด๋นํ๋ ํ์(Container) ๋ถ๋ถ๊ณผ
์์ ๋ด์ฉ๋ฌผ์ ๋ด๋นํ๋ ํ๋ ๋ถ๋ถ(Content) ์ด๋ค.
Container ๋ถ๋ถ์ ๋ถ๋ชจ ์์์ ํฌ๊ธฐ ์ด์ ์ปค์ง ์ ์์ผ๋ฉฐ ๊ณ ์ ๋์ด ์๋ค.
์ด ์์์ scroll ํ๋ Content ๋ถ๋ถ์ ๋ถ๋ชจ ์์๋ณด๋ค ์ปค์ง ์ ์์ง๋ง, ํ๋ฉด์ ๋ณด์ด๋ ๋ถ๋ถ์ Container์ ์คํฌ๋กค๋ก ๋ค์ด์ ์๋ ๋ถ๋ถ ํ์ ์ด๋ค.
์ฌ๊ธฐ์ ๊ทธ๋ฅ Style ์์ฑ์ ์จ์ Styling์ ํ๋ฉด, ์ด๊ฑฐ๋ Container(ํ์)๋ถ๋ถ์ ๋ํด ์์ ํ๊ฒ ๋ค๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ ๋์ด๋ ํ์ ์์๋ค๊ณผ์ ๊ด๊ณ๋ฅผ ์กฐ์ ํ ์ ์๋ค.
์ฌ๊ธฐ์ contentContainerStyle์ ์ฐ๋ฉด Content (ํ๋) ๋ถ๋ถ์ ๋ํด ์์ ํ๊ฒ ๋ค๋ ๊ฒ์ด๋ค. ๋ด์ฉ๋ฌผ๋ค์ padding (ํ์ ์์๋ก ๋ถํฐ ์ฌ๋ฐฑ์ ์ผ๋ง๋ ์ค๊ฒ์ธ๊ฐ?), item๋ค์ ์ ๋ ฌ ๋ฑ์ ๋ค๋ฃฌ๋ค.
ใท. Scroll View์์ ์ธ ์ ์๋ ํจ์ map ((item, index) => {return: ์ด๋ค ๋ก์ง์ item์ ๋ฃ์ ๊ฒฐ๊ณผ์ ๋ํ ๋ฐฐ์ด})
์ฒซ ๋ฒ์งธ ์ธ์์ธ item์๋ ๋ฐฐ์ด์ ์์๋ค์ด ํ๋์ฉ ์ฐจ๋ก๋๋ก ๋ค์ด๊ฐ๋ค.
๋ ๋ฒ์งธ ์ธ์์ธ index๋ ์ง๊ธ ๋ค์ด์จ ๋ฐฐ์ด์ ์์์ ์์์ด๋ค.
return ๋ฌธ์๋ ๋ฐฐ์ด์ ์์๋ฅผ ๋ฃ์ด ์ฌ์ฉํ๋ ๋ก์ง์ด ์จ๋ค.
๋ฐํ๋๋ ๊ฐ์ ํด๋น ๋ก์ง์ ๊ฒฐ๊ณผ๋ค์ ๋ชจ์ ๋ฐฐ์ด์ด๋ค.
์์์๋ item์ ์น๊ตฌ๋ค์ ํ๋กํ ์ฌ์ง, ์ด๋ฆ, ์๊ฐ๊ธ ์ ๋ณด๋ฅผ ๋ฐ์๋ค.
์ด ์ธ์๋ค์ Profile์ด๋ผ๋ ๋ชจ๋์ ํ๋์ฉ ๋ฃ์ด ๋์จ ๊ฒฐ๊ณผ๋ค์ ๋ฐฐ์ด๋ก ๋ง๋ค์ด ๋ฐํ ํ๋ค.
ํด๋น ์์์์๋ retrun๋ฌธ์ ์ ์ผ๋๋ฐ, return {} ๋์ ์ ๊ทธ๋ฅ () ์ด๊ฒ๋ ์ธ ์ ์๊ตฌ๋ ์ ๋๋ก ์ธ์งํ์.
2. ์ค์ค๋ก ํด๋ณด๊ธฐ
homeless-Api์๋ค๊ฐ ๋ง๋ค์๋ค.