์๋ ํ์ธ์ Foma ์ ๋๋ค.
์ ๋ฒ ๊ธ์ Modal์ ๋ํด์ ์์ ๋ณด์๋๋ฐ์. (์๋ณด์ ๋ถ์ ์ฌ๊ธฐ ์์ ๋ด์ฃผ์ธ์!)
์ค๋์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปค์คํ Modal์ ๋ง๋ค์ด ๋ณด๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์ ๋ณด๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
Modal.tsx
๊ฐ์ฅ ๋จผ์ ํ์ํ ์ปดํฌ๋ํธ๋ค์ import ํด์ค๋๋ค.
Modal์ importํ ๋ ์ปค์คํ ํ๋ Component Modal๊ณผ ์ด๋ฆ์ด ๊ฒน์น๋ฏ๋ก as๋ฅผ ์ด์ฉํด์ DefaultModal๋ก ๋ฐ๊ฟ์ค๋๋ค.
import { FunctionComponent, useState } from "react";
import { StyleSheet, View, Modal as DefaultModal, Button } from "react-native";
Modal Props
๋ชจ๋ฌ์ ์์ฑ๋ค์ ์ ํฉ๋๋ค.
1. activator
Custom Modal ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ๋ ํ๋ฉด์์ ์ง์ ๋์ํ ํจ์๋ฅผ ์ปค์คํ ํ๋๋ก ๋์์ฃผ๋ ์์ฑ์ ๋๋ค.
handlOpen ์ต๋ช ํจ์๋ฅผ ์ด์ฉํ์ฌ Openํ๋ ํจ์๋ฅผ ์์ฑํ ์ ์๋๋ก ํฉ๋๋ค.
2. children
๋ชจ๋ฌ ๋ทฐ ์์ ๋ค์ด๊ฐ ํ๋ฉด์ ๋ํ๋ผ ์์ฑ์ ๋๋ค.
type ModalProps = {
activator?: FunctionComponent<{ handleOpen: () => void }>;
children: React.ReactNode;
};
Modal
์์์ ๋ง๋ ModalProps๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ Modal ํจ์๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
visible ์์ฑ์ ์ํ๋ก ๊ด๋ฆฌํ useState๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
export function Modal({ activator: Activator, children }: ModalProps) {
const [isVisible, setVisible] = useState(false);
...
View
DefaultModal๋ก ์์ฑ์ ์ํ๋๋๋ก ์ปค์คํ ํฉ๋๋ค.
View ํ๊ทธ๋ฅผ ๋ง๋ค์ด ์ฃผ๊ณ children์ ๋ฃ์ด์ค Modal์ ์ฌ์ฉํ๋ ํ๋ฉด์์ ์ปค์คํ ํ ์ ์๋๋ก ํฉ๋๋ค.
Close ๋ฒํผ์ ๋ง๋ค์ด์ค ํด๋น ๋ฒํผ์ ๋๋ฅด๋ฉด Modal์ด ๊บผ์ง๋๋ก ๊ตฌํํฉ๋๋ค.
return (
<View>
<DefaultModal
visible={isVisible}
...
>
<View style={styles.contentView}>
{children}
<Button onPress={() => setVisible(false)} title="Close"></Button>
</View>
</DefaultModal>
...
);
Activator๊ฐ ์๋ค๋ฉด Modal์ ๋์ฐ๋ ํ๋ฉด์์ handleOpen์ด ์คํ ๋์๋ค๋ฉด ๋ชจ๋ฌ ํ๋ฉด์ด ๋ฐ ์ ์๋๋ก ํฉ๋๋ค.
๋ง์ฝ ์กด์ฌ ํ์ง ์๋๋ค๋ฉด Open ๋ฒํผ์ ๋ง๋ค์ด ์ฃผ๊ณ ๋๋ ์ ๋ ๋ชจ๋ฌ ํ๋ฉด์ด ๋ฐ ์ ์๋๋ก ํฉ๋๋ค.
{Activator ? (
<Activator handleOpen={() => setVisible(true)} />
) : (
<Button onPress={() => setVisible(true)} title="Open"></Button>
)}
</View>
Screen.tsx
Modal์ ๋์ธ ํ๋ฉด์์ ์์์ ๋ง๋ Modal์ import ํด์ค๋๋ค.
import { Modal } from "../components/styled/Modal";
ํด๋น ํ๋ฉด์์ Modal์ ๋ง๋ค๊ณ activator์ ์ํ๋ ๋ฒํผ์ ์ปค์คํ ํด์ฃผ๊ณ ํด๋น ๋ฒํผ์ ๋๋ ์ ๋ handleOpen์ด ์คํ๋ ์ ์๋๋ก ํฉ๋๋ค.
Modal ์ปดํฌ๋ํธ ํ๊ทธ ์์ Text๋ฅผ children์ผ๋ก ๋ฃ์ด์ค๋๋ค.
export default function Screen({ route }: Navigation) {
return (
...
<Modal
activator={({ handleOpen }) => (
<Button onPress={handleOpen} title="Open"></Button>
)}
>
<Text>Hello This is a activator modal view</Text> //children
</Modal>
...
activator๊ฐ ์์ด Modal์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํด ์ฃผ๋ฉด ๋ฉ๋๋ค.
<Modal>
<Text>Hello This is a modal view</Text>
</Modal>
์คํํ๋ฉด
Source Code
Modal.tsx
import { FunctionComponent, useState } from "react";
import { StyleSheet, View, Modal as DefaultModal, Button } from "react-native";
type ModalProps = {
activator?: FunctionComponent<{ handleOpen: () => void }>;
children: React.ReactNode;
};
export function Modal({ activator: Activator, children }: ModalProps) {
const [isVisible, setVisible] = useState(false);
return (
<View>
<DefaultModal
visible={isVisible}
transparent={false}
animationType={"slide"}
>
<View style={styles.contentView}>
{children}
<Button onPress={() => setVisible(false)} title="Close"></Button>
</View>
</DefaultModal>
{Activator ? (
<Activator handleOpen={() => setVisible(true)} />
) : (
<Button onPress={() => setVisible(true)} title="Open"></Button>
)}
</View>
);
}
const styles = StyleSheet.create({
contentView: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
});
Screen.tsx
import { View, Text, StyleSheet, Button } from "react-native";
import { Modal } from "../components/styled/Modal";
export default function Screen() {
return (
<View style={styles.container}>
<Modal
activator={({ handleOpen }) => (
<Button onPress={handleOpen} title="Open"></Button>
)}
>
<Text>Hello This is a activator modal view</Text>
</Modal>
{/* <Modal>
<Text>Hello This is a modal view</Text>
</Modal> */}
</View>
);
}
๋๊ธ