๐ฉ๐ป๐ป Today I Learned ๐
โญ React์์ ๋ชจ๋ฌ์ฐฝ ๋ง๋ค๊ธฐ
์ง๋ ์ฃผ์ ๋ชจ๋ฌ์ฐฝ์ ๋ง๋ค์ด์ผํ ๋ ๋ฐ๋ก React-Modal ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ์ง ์์๋๋ฐ, ์ด๋ฒ์ ๋ ๋ชจ๋ฌ์ฐฝ์ ๋ง๋ค์ด์ผํด์ ์๋ก์ด ๊ฒ์ ์จ๋ณด์๋ ๋ง์์ ์จ๋ดค๋ค. ์๊ฐ๋ณด๋ค ๊ฐ๋จํด์ ๋๋ฌด ์ข์๋ react-modal
โญ React-Modal
์์ฃผ ํจ์จ์ ์ธ ๋ฆฌ์กํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์ธ ๋ชจ๋ฌ. ์ฌ์ฉํ๋ ค๋ฉด ์ฐ์ ์ค์น๋ถํฐ ํด์ผํ๋ค.
react-modal(๊ณต์๋ฌธ์)
npm install react-modal
or
yarn add react-modal
โญ ๋ชจ๋ฌ ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
modal์ฐฝ์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ ์ index.js ํ์ผ์์ ๋ฆฌ์กํธ ๋ชจ๋ฌ์ import ํด์ค์ผํฉ๋๋ค. ๋ชจ๋ฌ์ด ์ด๋ ค์์ ๋ ํ๋ฉด์ ๋ณด๊ณ ์์ ์ ์ ๊ฐ ๋ชจ๋ฌ์ฐฝ์ด ์๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ปจํ ์ธ ๋ฅผ ๋ณด์ง ์๋๋ก ํ๊ธฐ ์ํด ์จ๊ฒจ์ค ์๋ฆฌ๋จผํธ๋ฅผ ์ ์ํด์ฃผ๋ ๊ฒ๋๋ค.
import React, { useState } from "react";
import UserModal from "../components/UserModal";
const Mypage = () => {
const [modalOpen, setModalOpen] = useState(false);
const handleClose = () => {
setModalOpen(false);
};
return (
<>
<MypageBox>
<Grid is_container padding="16px" _className="border">
<UserInfo>
<Button Btn _className="btn" _onClick={() => setModalOpen(true)}>
ํ์์ ๋ณด์์
</Button>
</UserInfo>
//๋ชจ๋ฌ์ฐฝ ์ปดํฌ๋ํธ
<UserModal
isOpen={modalOpen}
onCancel={handleClose}
name={name} />
</Grid>
</MypageBox>
<Nav />
</>
);
};
๐ ๋ชจ๋ฌ์ฐฝ์ ์ปดํฌ๋ํธ๋ก ๋ฐ๋ก ๋ถ๋ฆฌํ๊ณ ์์ ์ปดํฌ๋ํธ์์ useState๋ฅผ ์ฌ์ฉํด์ ์คํ๊ณผ ํด๋ก์ง์ ๊ด๋ฆฌํด์ฃผ๊ณ props๋ก ๋๊ฒจ์ค๋๋ค
import React, { useState } from "react";
import ReactModal from "react-modal";
import { icons } from "../shared/util";
import { Image } from "../elements/index";
import styled from "styled-components";
const UserModal = (props) => {
const { name, isOpen, onCancel } = props;
const [newName, setNewName] = useState();
const handleClose = () => {
onCancel();
};
return (
<>
<ReactModal
isOpen={isOpen}
style={{
overlay: {
position: "fixed",
top: 0,
left: 0,
right: 0,
bottom: 0,
backgroundColor: "rgba(255, 255, 255, 0.75)",
},
content: {
width: "340px",
height: "400px",
position: "absolute",
top: "40%",
left: " 50%",
transform: "translate(-50%, -50%)",
border: "1px solid #eee",
borderRadius: "15px",
background: "#fff",
overflow: "auto",
WebkitOverflowScrolling: "touch",
outline: "none",
padding: "20px",
textAlign: "center",
},
}}
>
<ExtraIcon>
{icons.map((item, i) => {
return (
<Image
size="80"
shape="circle"
src={item}
key={i}
_className="icons"
/>
);
})}
</ExtraIcon>
<NameInput
type="text"
className="inputform"
defaultValue={name}
onChange={(e) => setNewName(e.target.value)}
/>
<BtnBox>
<Btn onClick={handleClose}>์๋ฃ</Btn>
<Btn onClick={handleClose}>๋ซ๊ธฐ</Btn>
</BtnBox>
</ReactModal>
</>
);
};
๐ react-modal์ ์ธ๋ผ์ธ ์คํ์ผ๋ก css๋ฅผ ํ ์ ์๋ต๋๋ค. ์ ๋ ์์น๋ ์ฌ์ด์ฆ๋ฅผ ๋ฐ๋ก ์ก์์คฌ์ด์. ๋ฐ๋ก div๋ฅผ ์ด์ฉํด์ ๋ชจ๋ฌ์ฐฝ์ ๋ง๋ค๋ฉด position์ ์จ์ผํ๋ ๋ฒ์กํจ์ด ์๋๋ฐ, ๋ชจ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐ๋ฉด ํธํฉ๋๋ค.
๐ overly๋ก ๋ชจ๋ฌ์ฐฝ ์๋๋ก ๊น๋ฆฌ๋ ๋ฐ์ค๋ ์ก์ ์ค ์ ์๋ต๋๋ค
๐ ๋ชจ๋ฌ์ฐฝ ์์ ๋ค์ด๊ฐ๋ ๋ ์ด์์๋ค์ css๋ classname์ ์ฌ์ฉํด์๋ ์ ๋๋ต๋๋ค. styled-component๋ฅผ ์ด์ฉํด์ css๋ฅผ ํด์ฃผ์ธ์!
๐ ์ด ์ธ์๋ ๊ณต์๋ฌธ์๋ฅผ ๋ณด์๋ฉด ๋ค์ํ ์์ฑ๋ค์ด ๋ง๋ จ๋์ด์๋ต๋๋ค. ํ์ํ์ ๋ถ๋ถ๋ค์ ์ฐพ์์ ์ฐ์๋ฉด ๋ฉ๋๋ค!