
๋ชจ๋ฐ์ผ ์ฑ์์ ๋ชจ๋ฌ์
ํ์ง๋ง, ์๋ชป ์ค๊ณํ๋ฉด
๋ชจ๋ฌ์ด ๊ฒน์น๊ฑฐ๋, ๋ซํ์ง ์๊ฑฐ๋, UI๊ฐ ๊นจ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ฒ ๊ธ์ React Native์์ ๋ชจ๋ฌ์ ์์ ์ ์ด๊ณ ์ ์ฐํ๊ฒ ์ค๊ณํ๋ ์ ๋ต์ ์ ๋ฆฌํ ๊ธ์ด๋ค.
import { Modal, View, Text, Button } from 'react-native';
<Modal
visible={isVisible}
transparent={true}
animationType="slide"
onRequestClose={() => setIsVisible(false)}
>
<View style={styles.overlay}>
<View style={styles.modalBox}>
<Text>์๋ด ๋ฉ์์ง</Text>
<Button title="๋ซ๊ธฐ" onPress={() => setIsVisible(false)} />
</View>
</View>
</Modal>
โ
๋น ๋ฅด๊ฒ ๋์ธ ์ ์์
โ
์๋ฆผ/ํ์ธ์ฐฝ์ ์ ํฉ
โ ์ค์ฒฉ ์ฒ๋ฆฌ, ์ ์ญ ์ฒ๋ฆฌ ์ด๋ ค์
const useModalStore = create((set) => ({
isOpen: false,
modalContent: null,
openModal: (content) => set({ isOpen: true, modalContent: content }),
closeModal: () => set({ isOpen: false, modalContent: null }),
}));
<Modal visible={isOpen}>
{modalContent}
</Modal>
โ
์ด๋ ํ๋ฉด์์๋ openModal(<MyModal />) ํธ์ถ ๊ฐ๋ฅ
โ
์ํ๋ฅผ ํ ๊ณณ์์ ํตํฉ ๊ด๋ฆฌ
โ
์ค์ฒฉ, ์ค๋ณต ๋ฐฉ์ง
npm install react-native-modalize
import { Modalize } from 'react-native-modalize';
<Modalize ref={modalRef} snapPoint={300}>
<Text>์ต์
๋ชฉ๋ก</Text>
</Modalize>
โ
๋ฐํ
์ํธ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ์ ์นํ์ UX
โ
swipe, scroll ์ฐ๋
โ
๋ชจ๋ฌ๋ณด๋ค ์์ฐ์ค๋ฌ์ด UI ์ ๊ณต
import { Portal, Modal } from 'react-native-paper';
<Portal>
<Modal visible={visible}>
<Text>์ต์์ ๋ชจ๋ฌ</Text>
</Modal>
</Portal>
โ
์ต์๋จ์์ ๋ ๋๋ง โ ๊ฒน์นจ ๋ฌธ์ ๋ฐฉ์ง
โ
์ฌ๋ฌ ํ๋ฉด ๊ฒน์นจ์๋ ์์ ์ ์ผ๋ก ์๋
| ์ํฉ | ์ถ์ฒ ์ ๋ต |
|---|---|
| ๋จ์ ์๋ฆผ | RN Modal + ์ํ |
| ์ ํํ ๋ฐํ ์ํธ | Modalize, BottomSheet |
| ์ฑ ์ ์ญ ์๋ฆผ์ฐฝ | Zustand + ์ ์ญ Modal ์ปดํฌ๋ํธ |
| ์ค์ฒฉ๋ ํ๋ฉด์์ ์ฌ์ฉ | Portal or absolute ์์น ์กฐ์ |
| ๋์์ธ ์ปค์คํฐ๋ง์ด์ง | Modal ์ปดํฌ๋ํธ ๋ถ๋ฆฌ + props ์ ๋ฌ ๊ตฌ์กฐ |
๋ชจ๋ฌ์ ๋จ์ํ visible ์ํ ํ๋๋ก ๊ด๋ฆฌ๋๋ ๊ฒ ์๋๋ผ
์ ์ญ/์ค์ฒฉ/UI/๋์ ๋ชจ๋ ๊ณ ๋ คํ ๊ตฌ์กฐ๊ฐ ์์ด์ผ
์ฑ์ด ๋ฌด๋์ง์ง ์๊ณ ์ฌ์ฉ์ ๊ฒฝํ๋ ์์ฐ์ค๋ฝ๊ฒ ์ด์ด์ง ์ ์๋ค๋ ๊ฑธ ๋๊ผ๋ค.
์ง๊ธ์ Zustand + ModalWrapper + Modalize ์กฐํฉ์ผ๋ก
์๋ฆผ, ์ ํ์ฐฝ, ๋ฐํ
์ํธ, ์ฌ์ฉ์ ์
๋ ฅ ๋ชจ๋ฌ์ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ๊ณ ์๋ค.
๐ช โ๋ชจ๋ฌ์ ํ๋ฉด ์์ ํ๋ฉด์ด ์๋๋ผ, ํ๋ฆ ์์ ์ธํฐํ์ด์ค๋ค.โ