๐ŸชŸ 57. React Native ๋ชจ๋‹ฌ ๊ด€๋ฆฌ ์ „๋žต โ€” ์ „์—ญ ์ƒํƒœ, BottomSheet, ์ค‘์ฒฉ ์ฒ˜๋ฆฌ๊นŒ์ง€

JM_Devยท2025๋…„ 7์›” 1์ผ
0
post-thumbnail

๋ชจ๋ฐ”์ผ ์•ฑ์—์„œ ๋ชจ๋‹ฌ์€

  • ์•Œ๋ฆผ
  • ์„ ํƒ์ง€ ์ œ์‹œ
  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ
  • ๋ฐ”ํ…€์‹œํŠธ ๋ฉ”๋‰ด
    ๋“ฑ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

ํ•˜์ง€๋งŒ, ์ž˜๋ชป ์„ค๊ณ„ํ•˜๋ฉด
๋ชจ๋‹ฌ์ด ๊ฒน์น˜๊ฑฐ๋‚˜, ๋‹ซํžˆ์ง€ ์•Š๊ฑฐ๋‚˜, UI๊ฐ€ ๊นจ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋ฒˆ ๊ธ€์€ React Native์—์„œ ๋ชจ๋‹ฌ์„ ์•ˆ์ •์ ์ด๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ์ „๋žต์„ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.


โœ… ๊ธฐ๋ณธ Modal ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ

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>

โœ… ๋น ๋ฅด๊ฒŒ ๋„์šธ ์ˆ˜ ์žˆ์Œ
โœ… ์•Œ๋ฆผ/ํ™•์ธ์ฐฝ์— ์ ํ•ฉ
โŒ ์ค‘์ฒฉ ์ฒ˜๋ฆฌ, ์ „์—ญ ์ฒ˜๋ฆฌ ์–ด๋ ค์›€


๐Ÿ“ฆ ์ „์—ญ ๋ชจ๋‹ฌ ๊ด€๋ฆฌ ๊ตฌ์กฐ (Zustand ๊ธฐ๋ฐ˜)

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 />) ํ˜ธ์ถœ ๊ฐ€๋Šฅ
โœ… ์ƒํƒœ๋ฅผ ํ•œ ๊ณณ์—์„œ ํ†ตํ•ฉ ๊ด€๋ฆฌ
โœ… ์ค‘์ฒฉ, ์ค‘๋ณต ๋ฐฉ์ง€


๐Ÿงฒ BottomSheet (Modalize / Reanimated BottomSheet)

npm install react-native-modalize
import { Modalize } from 'react-native-modalize';

<Modalize ref={modalRef} snapPoint={300}>
  <Text>์˜ต์…˜ ๋ชฉ๋ก</Text>
</Modalize>

โœ… ๋ฐ”ํ…€์‹œํŠธ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ์ž ์นœํ™”์  UX
โœ… swipe, scroll ์—ฐ๋™
โœ… ๋ชจ๋‹ฌ๋ณด๋‹ค ์ž์—ฐ์Šค๋Ÿฌ์šด UI ์ œ๊ณต


๐ŸŒ€ Portal ๋ฐฉ์‹ (react-native-paper)

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 ์กฐํ•ฉ์œผ๋กœ
์•Œ๋ฆผ, ์„ ํƒ์ฐฝ, ๋ฐ”ํ…€์‹œํŠธ, ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ชจ๋‹ฌ์„ ์œ ์—ฐํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.


๐ŸชŸ โ€œ๋ชจ๋‹ฌ์€ ํ™”๋ฉด ์œ„์˜ ํ™”๋ฉด์ด ์•„๋‹ˆ๋ผ, ํ๋ฆ„ ์œ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.โ€


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

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