01. ๋ฌธ์
2์ผ๋์ ์ฐพ์๋ณด๋ ๋ฒ๊ทธ…
ํ์ฌ ํ๋ก์ ํธ์์ react-datepicker๋ฅผ ์ฌ์ฉํด์ ๋ฌ๋ ฅ์ ๋ง๋ค์๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌ๋ ฅ์ ๋ซ์ผ๋ ค๊ณ ๋ฐฐ๊ฒฝ์ ํด๋ฆญํ์ ๋, ๋ฌ๋ ฅ์ด ๋ซํ๊ณ ์ด๋ฒคํธ๊ฐ ์ข ๋ฃ๋์ด์ผ ํ๋๋ฐ. ํด๋ฆญํ ์์น์ ๋ฒํผ์ด๋ ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฌ๋ฆฐ ์ปดํฌ๋ํธ๊ฐ ์์ผ๋ฉด ๊ทธ ์ด๋ฒคํธ๊ฐ ์คํ๋์๋ค.
๋ฆฌ์กํธ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉฐ ์ค์ตํ๊ณ ์๋ ํ๋ก์ ํธ๋ฅผ ์ฐ์ต์ฅ ์ผ์ ๋ฌ๋ ฅ์ ๋ค์ ๋ง๋ค์ด๋ดค๋ค. ๋ฌ๋ ฅ ์ธ๋ถ์ ์ฃผ๋ฌธํ๊ธฐ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ๋ฒํผ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์๋ค.
ProductItem์ ์๋ ๋ฒํผ ์ด๋ฒคํธ๊ฐ ์คํ๋๋ ๊ฒ์ ๋ก๊ทธ๋ฅผ ํตํด ํ์ธํ ์ ์์๋ค.
02. ํด๊ฒฐ๊ณผ์
DatePicker์ ์๋ onClickOutside์ ๋ฒ๋ธ๋ง์ ์ค๋จํ๋ ์ฝ๋๋ฅผ ๋ฃ์ด์คฌ๋ค. -> (X) ํด๊ฒฐ๋์ง ์์
<CalendarWrapper>
{/* {isOpen && <Overlay id="wldnjs" onClick={handleOverlayClick} />} */}
<DatePicker
selected={startDate}
onChange={(date) => {
console.log("111");
setStartDate(date);
setIsOpen(false);
}}
onCalendarOpen={() => {
console.log("222");
}}
onCalendarClose={() => {
console.log("333");
setIsOpen(false);
}}
onClickOutside={(e) => {
console.log("444");
e.stopPropagation();
}}
withPortal
/>
</CalendarWrapper>
DOM์์์ ์ง์ ์ ๊ทผํ์ฌ CalendarWrapper ๋ด๋ถ์ event.target์ด ํฌํจ๋์ด ์์ง ์๋ ๊ฒฝ์ฐ event.stopPropagation(); ์ผ๋ก ๋ฒ๋ธ๋ง์ ์ค๋จํ๋ ์ฝ๋๋ฅผ ๋ฃ์ด์คฌ๋ค. -> (X) ํด๊ฒฐ๋์ง ์์
const calendarRef = useRef(null);
useEffect(() => {
const handleClickOutside = (event) => {
console.log("handleClickOutside");
console.log(calendarRef.current);
console.log(event.target);
if (calendarRef.current && !calendarRef.current.contains(event.target)) {
console.log(calendarRef.current.contains(event.target));
event.stopPropagation();
event.preventDefault();
setIsOpen(false);
}
};
document.addEventListener("mousedown", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
}, [calendarRef]);
<CalendarWrapper ref={calendarRef}>
<DatePicker
selected={startDate}
onChange={(date) => {
console.log("111");
setStartDate(date);
setIsOpen(false);
}}
onCalendarOpen={() => {
console.log("222");
}}
onCalendarClose={() => {
console.log("333");
setIsOpen(false);
}}
onClickOutside={(e) => {
console.log("444");
}}
withPortal
/>
</CalendarWrapper>
03. ํด๊ฒฐ
react-datepicker ๊น ๋ ํฌ์งํ ๋ฆฌ์์ ํ๋ฒ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์์ธ์ ์ฐพ์๋ณด๊ธฐ๋ก ํ๋ค.
Issues ํญ์ด ์๊ธธ๋ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋๋ง ๋ฐ์ํ๋๊ฑด๊ฐ ์ถ์ด์ ๊ฒ์์ ํด๋ดค๋๋ ๊ฐ์ ๋ฌธ์ ์ ๋ํ ๋ด์ฉ์ด ์ฌ๋ผ์ ์์๋ค. !!
https://github.com/Hacker0x01/react-datepicker/issues/2524
์ฌ๊ธฐ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์๋ค. !!! ์์ ๊ฐ์ฌํฉ๋๋ค..
document.addEventListener("touchstart", handelTouchStart, true);๋ก touchstart ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐe.stopPropagation();์ผ๋ก ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์ค๋จํ ์ ์๋๋ก ํ๋ค.
๋ฌ๋ ฅ์ด ๋ซํ๋ฉด ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํ๋ค. ๋ฌ๋ ฅ์ ๋ซ์ ๋ ๋ฆฌ์ค๋๊ฐ ์ ๊ฑฐ๋์ง ์์ ์์น ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ค์ ๋ ๋๋งํ ๋ ํจ์๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด removeEventListener๋ก ์ด๋ฒคํธ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํด์คฌ๋ค.
const Calendar = () => {
const [startDate, setStartDate] = useState(new Date());
const handelTouchStart = useCallback((e) => e.stopPropagation(), []);
const hadleCalendarOpen = () => {
console.log("open");
document.addEventListener("touchstart", handelTouchStart, true);
};
const hadleCalendarClose = () => {
console.log("close");
document.removeEventListener("touchstart", handelTouchStart, true);
};
return (
<CalendarWrapper>
<DatePicker
selected={startDate}
onChange={(date) => {
setStartDate(date);
}}
onCalendarOpen={hadleCalendarOpen}
onCalendarClose={hadleCalendarClose}
withPortal
/>
</CalendarWrapper>
);
};
๋์ด์ ๋ฒํผ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. !!
'๐ป Programming > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ๋ฆฌ์กํธ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ (0) | 2024.05.16 |
---|---|
[React] ๋ฆฌ์กํธ 2๋ถ ๊ณ ๊ธ์ฃผ์ ์ ํ - 01. ์๊ฐ (0) | 2024.05.05 |