๋ฏธ๋ฃจ๊ณ ๋ฏธ๋ฃจ๋ ํฌ๋๋ฉ์ดํธ ๋ฌ๋ ฅ์ ๊ตฌํํด๋ด ์๋ค. ํ๋ก ํธ ๊ณต๋ถ๋ฅผ ํ๋ฉด์ ํ๋ฒ์ฏค์ ๋ง๋ค์ด์ผํ๋ ๊ด๋ฌธ ๊ฐ์ ๋๋์ด ์๋๋ฐ, ์ด๋ฒ ๊ธฐํ์ ํด๋ณด๋๊ฑฐ๋ก. dayjs ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
์ค์ ํฌ๋๋ฉ์ดํธ๋ผ๊ณ ํด๋ ๋ฏฟ๊ฒ ์ฃ ? ์์ง ๋ฌ๋ ฅ์์ ๋ ์ง๋ฅผ ์ ํํ๊ณ ํด๋น ๋ ์ง์ ํฌ๋๋ฅผ ๋์ฐ๋ ๋ก์ง์ ๊ตฌํํ์ง ์์๋ค. ๋ค์์ฃผ๊น์ง ํด๊ฐ ์์ . ๋ฌ๋ ฅ์ ๋ง๋ค๊ธฐ ์ ์ ์ฐธ๊ณ ํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ธ๋ก๊ทธ๋ค์ ๊ฐ๋ดค์๋๋ฐ, ๋ญ๊ฐ ๋ค ์์์ฐฎ๋ณต์กํ๊ณ ์ฐธ๊ณ ํ๊ธฐ ์ซ์ ๋ฐฉ๋ฒ๋ฐ์ ์์๋ค. ๊ทธ๋์ ์ด์ฌํ ๊ณ ๋ฏผ์ ํด๋ณด์์.
Calender.tsx
const Calender = () => {
const [selectedDay, setSelectedDay] = useState<string>(
dayjs().format('MM/DD/YY'),
);
const handleSelectDate = (v: string) => {
setSelectedDay(v);
};
const board = renderCalenderBoard(selectedDay, handleSelectDate);
// ... ์๋ต
return (
<Wrapper>
{/* ์๋ต */}
<Board>{board}</Board>
</Wrapper>
);
};
export default Calender;
์ฒซ ๋ ๋๋ง ์ ์ค๋ ๋ ์ง๋ก ์ ํ๋ ๋ ์ง ์ํ๋ฅผ ์ด๊ธฐํํ๋ค. board
๋ ๋ค๋ ฅ์ ๋ด์ฉ ์์๋ค์ธ๋ฐ, ์ฝ๋๊ฐ ๊ธธ์ด์ ธ์ ๋ณ๋์ ํจ์๋ก ๋ถ๋ฆฌํ๋ค.
renderCalenderBoard.tsx
const renderCalenderBoard = (
selectedDay: string,
handleSelectDate: (v: string) => void,
) => {
const initArr = (firstDay: number, daysInMonth: number) => {
return Array.from({ length: firstDay + daysInMonth }, (v, i) =>
i < firstDay
? null
: dayjs(selectedDay)
.startOf('month')
.set('date', i - firstDay + 1)
.format('MM/DD/YY'),
);
};
const [arr, setArr] = useState<(string | null)[]>([null]);
useEffect(() => {
const firstDay = dayjs(selectedDay).startOf('month').day();
const daysInMonth = dayjs(selectedDay).daysInMonth();
setArr(initArr(firstDay, daysInMonth));
}, [selectedDay]);
const content = arr.map((v, i) => (
<Item key={v ? v.toString() : `${v}${i}`} isSelected={selectedDay === v}>
{v && ( //TODO
<div onClick={() => handleSelectDate(v)}>
<TodoCheck fill="#DBDDDF" />
<span>{dayjs(v).date()}</span>
</div>
)}
</Item>
));
return content;
};
์ ์ฒด์ ์ธ ์์ด๋์ด๋ ์ด๋ ๋ค.
- ๊ฐ ์นธ์ ๋ชจ๋ ๋ด๋ ๋ฐฐ์ด์ ํ๋ ๋ง๋ค๊ณ , grid๋ฅผ ์ด์ฉํด์ 7๊ฐ์ฉ ๊ฐ๋ก๋ก ๋์ดํ๋ค.
- ํด๋น ์ ์ฒซ์งธ๋ ์ ์์ผ์ ๋ฐ๊ณ , ๊ทธ ์์ผ๊ฐ ๋ณด๋ค ์์ ์ธ๋ฑ์ค์ผ ๋๋ null์ ๋ด๋๋ค. ์๋ ๋๋
'MM/DD/YY'
ํฌ๋งท์ ๋ฌธ์์ด์ ๋ด๋๋ค.set('date', i - firistDay + 1)
๋ฉ์๋๋ก ๊ฐ ์ธ๋ฑ์ค๋ง๋ค ๋ง๋ ๋ ์ง๊ฐ ๋ค์ด๊ฐ๋๋ก ๊ณ์ฐํ๋ค. - null์ด ์๋๋๋ง Item ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ฉด, ๋ฌ๋ ฅ์ฒ๋ผ ์ ๋์ฌ๊ฒ!!
dayjs์์ ์ ๊ณตํ๋ ๋ฉ์๋๋ค์ ์ ์ ํ ์ฌ์ฉํ๋ค. ๋ง ๋ณต์กํ๊ฑด ์๋๋ผ์ ์ด๋ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด๋ ์ถฉ๋ถํ ๊ตฌํํ ์ ์์ ๊ฒ ๊ฐ๋ค.
ํฌ๋๋ฉ์ดํธ์์ ์ด์ ๋ฌ๋ก ๊ฐ๋๋ ๋ง์ง๋ง ์ผ์ด, ๋ค์ ๋ฌ๋ก ๊ฐ๋ฉด ์ฒซ ๋ ์ด ์ ํ๋๋ค.
const handlePrevMonth = () => {
const newDate = dayjs(selectedDay)
.subtract(1, 'month')
.endOf('month')
.format('MM/DD/YY');
setSelectedDay(newDate);
};
const handleNextMonth = () => {
const newDate = dayjs(selectedDay)
.add(1, 'month')
.startOf('month')
.format('MM/DD/YY');
setSelectedDay(newDate);
};
endOf
์ startOf
๋ฉ์๋๋ค์ ์ ์ ํ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ๋ํ๋ผ ์ ์๋ค.
set(unit : dayjs.UnitType, value : number)
: ๋ ์ง ๊ฐ์ฒด์ ์ํ๋ ๊ฐ์ผ๋ก ์ค์ endOf(unit : OpUnitType)
: ์ธ์์ ํด๋นํ๋ ๋จ์์ ๋ง์ง๋ง ๊ฐ์ผ๋ก ์ค์ . endOf('month')๋ก ํด๋น ์์ ์ผ์๋ฅผ ์ ์ ์๋ค.startOf()
๋ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉadd(value : number, unit : ManipulateType)
: ๋ ์ง ๋ฐ ์๊ฐ์ ๋ํจ