반응형
인덱스페이지

export default function HomeScreen() { const [isFriendSectionOpen, setIsFriendSectionOpen] = useState(true); return ( <View style={styles.container}> <Header /> {/* 컴포넌트별 간격 지정시 명시적으로 height주는게 좋음 */} <Margin height={6} /> <Profile source={myProfile.source} name={myProfile.name} introduction={myProfile.introduction} /> <Margin height={10} /> <Division /> <Margin height={10} /> <FriendSection friendProfileLen={friendProfiles.length} onPress={() => setIsFriendSectionOpen(!isFriendSectionOpen)} isOpen={isFriendSectionOpen} /> {/* isOpen이 true일 때만 FriendList 컴포넌트가 보이도록 설정 */} {isFriendSectionOpen && <FriendList friendProfiles={friendProfiles} />} </View> ); }
리액트네이티브에서는 재사용성과 유지보수성 향상을 위해
마진과 보더(Division)를 따로 컴포넌트화해서 사용한다고 하는게 신기했다.
웹과 다른 UI/스타일링 패턴을 따로 글로 정리해봐야겠다.
Margin 컴포넌트
import React from 'react'; import { View } from 'react-native'; interface MarginProps { height: number } const Margin = (props: MarginProps) => { return <View style={{ height: props.height }} />; }; export default Margin
사용은 <Margin height={10} />
이렇게 하는데,
크기 단위는 기본적으로 dp
(device-independent pixels)임.
웹에서는 px, %, rem 등을 사용하는데
리액트네이티브에서는 dp로 자동변환된다고함.
단위를 사용하지 않고 숫자만 사용해서 표기한다.
Division 컴포넌트
import React from 'react' import { View } from 'react-native' const Division = () => { return ( <View style={{ height: 0, borderBottomWidth: 0.5, borderBottomColor: 'lightgrey', width: "100%" }} /> ) } export default Division
마진에서 height받았다면 Division에서는 width를 받아도될듯
FriendSection 컴포넌트: 친구목록 상단 count, toggle
<FriendSection friendProfileLen={friendProfiles.length} onPress={() => setIsFriendSectionOpen(!isFriendSectionOpen)} isOpen={isFriendSectionOpen} />
친구수, onPress, isOpen내려줌
import { MaterialIcons } from '@expo/vector-icons'; import React from 'react'; import { Text, TouchableOpacity, View } from "react-native"; interface FriendSectionProps { friendProfileLen: number; onPress: () => void; isOpen: boolean; } const FriendSection = (props: FriendSectionProps) => { return ( <View style={{ flexDirection: "row", justifyContent: "space-between", width: "100%", }} > <Text style={{ color: "grey" }}>친구 {props.friendProfileLen}</Text> <TouchableOpacity onPress={props.onPress}> <MaterialIcons name={props.isOpen ? "keyboard-arrow-up" : "keyboard-arrow-down"} size={24} color="grey" /> </TouchableOpacity> </View> ); }; export default FriendSection
버튼 눌렀을때 친구목록 열렸다닫혔다 할거고 아이콘도 위아래 바뀔것
반응형
'Frontend > React Native' 카테고리의 다른 글
React Native 2-1. 카카오톡 친구목록 클론코딩(6): ScrollView vs FlatList (1) | 2025.03.15 |
---|---|
React Native 2-1. 카카오톡 친구목록 클론코딩(5): 친구목록 컴포넌트 (1) | 2025.03.15 |
React Native 2-1. 카카오톡 친구목록 클론코딩(3): expo 기본앱에서 tabbar 커스텀 하기 (0) | 2025.03.13 |
React Native 2-1. 카카오톡 친구목록 클론코딩(2) (0) | 2025.03.10 |
React Native 2-1. 카카오톡 친구목록 클론코딩(1) (0) | 2025.03.10 |