๐ ์ ์ฒด ๊ตฌ์กฐ
PayModalWrapper ๊ฐ RoomPayModal์ ๊ฐ์ธ๊ณ ์๋ ์ํ
๋์ : ์์๋ฅผ ๋๋ฅด๋ฉด ๋ชจ๋ฌ์ฐฝ์ด ๋จ๊ณ ๋ชจ๋ฌ์ฐฝ ์ธ์ ์์ญ ํด๋ฆญ ์ ๋ชจ๋ฌ์ฐฝ์ด ๋ซํ๋ค.
๐ ์ฝ๋
handlePayModalOff ํจ์๋ก ๋ชจ๋ฌ ์ธ ์์ญ ํด๋ฆญ ์ ๋ซํ๋ ํด๋ฆญ์ด๋ฒคํธ๋ฅผ ์ ์ดํ ์์
return ๋ถ๋ถ
return (
<ReservationMainDiv>
<AvailableRoom
setIsPayModalClicked={setIsPayModalClicked}
roomData={roomData}
/>
<RoomMap roomData={roomData} />
{isPayModalClicked && (
<PayModalWrapper
className="paymodalWrapper"
onClick={(e) => handlePayModalOff(e)}
>
<RoomPayModal />
</PayModalWrapper>
)}
</ReservationMainDiv>
);
handlePayModalOff
const ReservationMain = () => {
const [isPayModalClicked, setIsPayModalClicked] = useState(false);
const handlePayModalOff = (e) => {
const clicked = e.target.closest('.paymodal');
if (clicked) return;
else {
setIsPayModalClicked(false);
}
};
โ isPayModalClikced , setIsPayModalClicked : useState๋ก ๋ชจ๋ฌ click ์ฌ๋ถ boolean ๊ด๋ฆฌ
โ cliked : 'paymodal'์ด๋ผ๋ class์ด๋ฆ์ ๊ฐ์ง ์์๋ฅผ ์ ํ
โ ๏ธ ์ฌ๊ธฐ์ closest๋ ์์ ๋ถํฐ ๋ถ๋ชจ ์์ ๋จ์๋ก ์ถ๋ฐํด , ๊ฐ ์์๊ฐ ์ง์ ํ ์ ํ์์ ๋ง์กฑํ ๋๊น์ง ํ์ํ๋ค (Jenny ์ถ์ฒ
๋ฐ๋ก ์ด๋ฒคํธ ์บก์ณ๋ง ๋ฒ๋ธ๋ง ์ง์ ์ ์ํด์คฌ์์ผ๋ก ๋ฒ๋ธ๋ง์ผ๋ก ์งํ์ด ๋๊ณ ( ํด๋ฆญํ ์์ -> ์์๋ก)
๋ชจ๋ฌ์ ํด๋ฆญํ์ ์ : cliked์ <RoomPayModal> className= 'paymodal'์ด ๋ค์ด๊ฐ ( ์์ ๋ถํฐ ๋ถ๋ชจ๋ก ํ์ํ๋)
๋ชจ๋ฌ ์ธ ์์ญ ํด๋ฆญ ์ : cliked์ <payModalWrapper>๊ฐ ๋ค์ด๊ฐ
-> cliked๊ฐ ์กด์ฌํ๋ฉด : return ๋ชจ๋ฌ ๊ทธ๋๋ก
-> cliked null์ด๋ฉด : false ๋ชจ๋ฌ close
ํจ์์ ์ํ๊ด๋ฆฌ๋ฅผ ํตํด ๋ชจ๋ฌ์์ญ์ ๋ซํ์ ์ ์ดํ ์ ์์๋ค.
RoomMapPayModal
const RoomMapPayModal = () => {
return (
<RoomMapPayModalDiv className="paymodal">
์ฐธ๊ณ ๋ก className์ RoomMapPayModal ์ปดํฌ๋ํธ์ ์ง์ ํด๋จ๋ค.
๐ ์ฝ์ง๊ธฐ
const handlePayModalOff = (e) => {
if (e.target !== e.currentTarget) return;
else setIsPayModalClicked(false);
}
};
์ฒ์์ ์ด๋ ๊ฒ e.target ์ด e.currentTarget ์ฆ ๋ด๊ฐ ์ด๋ฒคํธ๋ฅผ ๊ฑด element , ๋ด๊ฐ ํด๋ฆญ ํ element ๋ฅผ ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋๋๋ฐ .
์ด ํจํด์ด explorer์์ ๋์์ด ์๋๋ค๊ณ ํด์ ์์ง๊น์ง ์ํํ๋ค๊ณ ํ๋ค.. (์ต์คํ๋ก๋ฌ....
๊ทธ ์ธ ๋ฐ๊นฅ ์์ญ์ ๊ฒ์ ์ ๋ง์ ์์ด ํจ๊ณผ๊ฐ ์์ ๋ ์ ์ฉํ useRef ์ฌ์ฉ๊ธฐ๋ https://rrecoder.tistory.com/141?category=950210์ด ๊ฒ์๊ธ์ ์ฐธ๊ณ ํด ์ฃผ์๊ธธ!
๐ ์ ์ฒด ์ฝ๋
const ReservationMain = () => {
const [roomData, setRoomData] = useState();
const [isPayModalClicked, setIsPayModalClicked] = useState(false);
useEffect(() => {
const fetchData = API.get.room();
fetchData.then((res) => setRoomData(res));
}, []);
const handlePayModalOff = (e) => {
const clicked = e.target.closest('.paymodal');
if (clicked) return;
else {
setIsPayModalClicked(false);
}
};
return (
<ReservationMainDiv>
<AvailableRoom
setIsPayModalClicked={setIsPayModalClicked}
roomData={roomData}
/>
<RoomMap roomData={roomData} />
{isPayModalClicked && (
<PayModalWrapper
className="paymodalWrapper"
onClick={(e) => handlePayModalOff(e)}
>
<RoomPayModal />
</PayModalWrapper>
)}
</ReservationMainDiv>
);
};
๋๊ธ