[์น ํ๋ก์ ํธ] ๋ฆฌ์กํธ datepicker ์ง์ ๊ตฌํํ๊ธฐ
- -
๐ ์ง์ ๊ตฌํํ๋ ์ด์ ?
๋ฆฌ์กํธ์์๋ ๋ณดํต react-datepicker๋ผ๋ ๊ธฐ์กด์ ์ ๋ง๋ค์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
ํ์ง๋ง ๋ด๊ฐ ์ํ๋ ๊ธฐ๋ฅ, ์ํ๋ ๋์์ธ ๋๋ก๋ง ์์ ํ๋ ๊ฒ์ ๋ค์ ๋ฒ๊ฑฐ๋กญ๋ค.
๋๋ฌธ์ ๋๋ ์ธ์ ๋ ์ํ๋ ๊ธฐ๋ฅ๊ณผ ๋์์ธ์ผ๋ก ์์ ์ ์ฉ์ดํ๊ฒ ํ ์ ์๋๋ก datepicker๋ฅผ ์ง์ ๊ตฌํํด ๋ณด์๋ค.
๐ข ๊ตฌํ ์ค ์ฌ์ฉ๋๋ ๊ฒ
1. ๋จผ์ moment๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์์๋์ด์ผ ํ๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌ๋ ฅ์ ํ์๋๋ ์์ผ ๋ฑ์ ๋์ ๊ณ์ฐํด์ค๋ค.
์ด ๊ณ์ฐ ๋ํ ์ง์ ํ๋ ค๋ฉด ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ๊ตฌํ ์ ์์ผ๋ ์ฌ๊ธฐ์๋ moment๋ฅผ ์ด์ฉํ์๋ค.
2. ์ ํ๋ ๋ ์ง๋ ํ์ฌ ๋ฌ๋ ฅ์ ํ์๋๋ ์ฐ๋ ๋ฑ์ useState๋ผ๋ ๋ฆฌ์กํธ ํ ์ ์ด์ฉํ์ฌ ๊ด๋ฆฌํ๋ค.
( * ๋ณ๊ฒฝ ์ render๋๋๋ก )
3. ํด๋ฆญ ์ด๋ฒคํธ๋ก target.classList๋ฅผ ์ด์ฉํ์ฌ UI๋ฅผ ์์ ํ๋ค.
๐ข ๊ตฌํ ๊ณผ์ ( ํต์ฌ์ ์ธ ๋ก์ง๋ง )
// ํ์ฌ ํด๋นํ๋ ๋ ๋ ๋ฐ ๋ฌ const [curYear, setCurYear] = useState(moment().year()); const [curMonth, setCurMonth] = useState(moment().month()); // ํด๋นํ๋ ๋ฌ์ day ์ const allDaysOfMonth = moment([curYear, 0, 31]).month(curMonth).format("DD"); // ํด๋น ๋ฌ ์ฒซ 1์ผ์ ์์ผ const firstDayOfCurMonth = moment([curYear, curMonth, 1]).day(); // ํด๋น ๋ฌ ๋ง์ง๋ง ์์ผ const lastDayOfCurMonth = moment([curYear, curMonth, allDaysOfMonth]).day(); // ์ง๋ ๋ฌ ๋ง์ง๋ง ๋ ์ง const lastDateOfLastMonth = moment([curYear, 0, 31]) .month(curMonth - 1) .format("DD"); // ์ง๋ ๋ฌ์ ๋ณด์ฌ์ ธ์ผํ๋ day๋ค const preCalendarDays = []; // ํด๋น ๋ฌ const curCalendarDays = []; // ๋ค์ ๋ฌ const nextCalendarDays = []; // ๋ณด์ฌ์ ธ์ผํ๋ ์ง๋ ๋ฌ ์ if (firstDayOfCurMonth > 0) { for (let i = 0; i < firstDayOfCurMonth; i++) { preCalendarDays.push(lastDateOfLastMonth - firstDayOfCurMonth + i + 1); } } // ๋ณด์ฌ์ ธ์ผํ๋ ํด๋น ๋ฌ ์ for (let i = 1; i <= allDaysOfMonth; i++) { curCalendarDays.push( `${curYear}-${String(curMonth + 1).padStart(2, 0)}-${i}` ); } // ๋ณด์ฌ์ ธ์ผํ๋ ๋ค์ ๋ฌ ์ for (let i = 1; i < 7 - lastDayOfCurMonth; i++) { nextCalendarDays.push(`${i}`); }
์ฃผ์์ฒ๋ผ moment๋ฅผ ์ด์ฉํด ๊ฐ๊ฐ์ ๊ฐ์ ๋ฐ์์ฌ ์ ์๋ค.
ํด๋น ๋ณ์๋ค์ pre, cur, next ๋ฐฐ์ด์ ํตํด ๋ ์ง๋ฅผ ๋ด๋ ์ด์ ๋ ํด๋น ๋ฌ์ ๋ณด๋๋ผ๋
์ด์ ๋ฌ์ ๋ง์ง๋ง ๋ ์ง์ ๋ค์ ๋ฌ์ ์ฒ์ ๋ ์ง๋ฅผ ํ์ํด์ฃผ๋๊ฒ ์ฌ์ฉ์ ์ธก๋ฉด์์ ๋ ์ง๊ด์ฑ์๊ณ ,
์ด๋ฅผ ๋ ๋์ํฌ ๋, ๊ตฌ๋ถ์ง์ด UI๋ฅผ ํ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
( ๋ค ๋ฐ๋ก ํ๊ทธ๋ฅผ ๋ฌ์ ๋ง๋๋ ๊ฒ์ด ์๋๋ผ๋ ๊ฒ์ ์์์ผ ํ๋ค. )๊ทธ๋ผ ์์ ๊ฐ์ด 27, 28 ๋ฐ๋ก 1~31 ๋ฐ๋ก 1~2 ๋ฐ๋ก ๋ ๋๋งํ์ฌ ์ง๊ด์ ์ผ๋ก ๋ณด์ด๊ฒ ํ๋ค.
ํ๋ฉด์ ๋ณด์ฌ์ง๋ ํต์ฌ ํ์ ๋ง๋ค์์ผ๋, ์ด์ ๋ค๋ฅธ ๋ ๋์ ๋ฌ์ ๋ณด๋๋ผ๋ ๋ฐ๋๋๋ก ์ค์ ํด์ผํ๋ค.
๋จผ์ ๋ ๊ฐ์ง ์ ๋๋ฅผ ๊ณ ๋ คํด ๋ณด์๋ค.
1. ๋ฌ๋ ฅ์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ํ์๋ฅผ ํด๋ฆญํด์ ์ด๋ํ๋๋ก
2. ์ด์ ๋ฌ ๋๋ ๋ค์ ๋ฌ์ ์ผ์๋ฅผ ํด๋ฆญํ๋ฉด ์ด๋๋๋๋ก
1๋ฒ์ ๊ฒฝ์ฐ์๋ ๋งค์ฐ ๊ฐ๋จํ๋ค. ์ผ์ชฝ์ผ๋ก ๊ฐ ์์๋ ์๋ฅผ๋ค์ด 2022๋ 1์์์ 2021๋ 12์๋ก ๋์ด๊ฐ๋ ์ํฉ๋ง
์ ๊ณ์ฐํด์ฃผ๋ฉด ๋๋ค. ์ค๋ฅธ์ชฝ๋ ๋ง์ฐฌ๊ฐ์ง๋ค.// ์ด์ ๋ฌ ์ด๋ const checkPreCalendar = () => { if (curMonth === 0) { setCurYear(curYear - 1); setCurMonth((curMonth = 11)); return; } setCurMonth(curMonth - 1); }; // ๋ค์ ๋ฌ ์ด๋ const checkNextCalendar = () => { if (curMonth === 11) { setCurYear(curYear + 1); setCurMonth((curMonth = 0)); return; } setCurMonth(curMonth + 1); };
๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ useState๋ฅผ ์ด์ฉํ๋ ๋ฌ์ - ๋๋ + ํด์ฃผ๊ณ ์์ ์ธ๊ธํ ์์ธ์ํฉ๋ง ๊ณ ๋ คํด์ฃผ์๋ค.
์ดํ ๋ฒํผ์ ๋ง๋ค์ด ๊ฐ๊ฐ์ event๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
2๋ฒ์ ๊ฒฝ์ฐ์๋ ์ด์ ๋ฌ์ ํด๋ฆญํ ๊ฒ์ธ์ง, ๋ค์ ๋ฌ์ ํด๋ฆญํ ๊ฒ์ธ์ง, ์๋๋ฉด ํด๋นํ๋ ๋ฌ์ ํด๋ฆญํ๋ ๊ฒ์ธ์ง ๋ถ๋ณ์ด ํ์ํ๋ค.
๋ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ ๋ ์ className์// pre className={`special-days-in-grid left`} // current className={`days-in-grid ${curYear}-${curMonth + 1}-${index + 1}`} // next className={`special-days-in-grid right`}
์ ํตํ์ฌ ์ฐจ๋ณ์ ์ฃผ์๊ณ , ํด๋ฆญ์ e.target.classList์ ๊ฐ์ ํตํด ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ตฌ๋ถ์ง์๋ค.
๊ทธ ์ดํ๋ 1๋ฒ์ ๊ฒฝ์ฐ์ ๋๊ฐ๋ค๊ณ ๋ณผ ์ ์๋ค.
๋ง์ง๋ง์ผ๋ก ์ ์ผ ์ค์ํ ๊ฒ์ ์์ผ์ ์ ํํ ๋์ ์ฒ๋ฆฌ์๋ค.
์์ผ์ ์ ํํ๋ ๊ฒ์ ์ด์ ๋ฌ์ ์์ผ์ ํด๋ฆญํ์ฌ๋ ์ด์ ๋ฌ๋ก ๋์ด๊ฐ์ ํด๋นํ๋ ์์ผ์ด ์ ํ๋์ด ์์ด์ผ ํ๋ค.
์ด ํต์ฌ์ ์์ current์ ๋ ๋ ์ ํด๋นํ๋ ์์ผ์ className์ ๋ฃ์ด๋๊ณ ,// ์ ํ๋ ๋ const [curSelectedDate, setCurSelectedDate] = useState();
์์ ๊ฐ์ด ์ ํ๋ ๋ ์ useState๋ฅผ ํตํด ์ ์ฅํด์, ๋ ๋ ์ ์ ํ๋ ๋ ์ผ๋๋ง clicked ๋ผ๋ className์ ์ฃผ์ด ํ์ํ๋ค.
๊ทธ๋ ๊ฒ ํ๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
์ถ๊ฐ ๊ธฐ๋ฅ์ด ์๊ธด๋ค๋ฉด ์ธ์ ๋ ํธํ๊ฒ ๊ตฌํํด์ ๋ฃ์ผ๋ฉด ๋!
'Project : Together Sports' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
-
์ฑ๋ฅ ์ต์ ํ (1) LightHouse๋ฅผ ์ด์ฉํด ์ฑ๋ฅ ์ต์ ํ ํด๋ณด๊ธฐ 2022.07.08
-
[์น ํ๋ก์ ํธ] ๋ฆฌ์กํธ๋ก Carousel(Slider) ์คํฌ๋กค ๋ฐฉ์์ผ๋ก ๊ตฌํํ๊ธฐ 2022.06.21
-
[์น ์๋น์ค ํ๋ก์ ํธ #2] ํ ๋ฌ ๊ฐ์ ์ฌ์ 2022.03.05
-
[์น ์๋น์ค ํ๋ก์ ํธ #1] ํ ํ๋ก์ ํธ ์์.. 2022.02.08
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค