1ํธ์์ ๋ฌ๋ ฅ์ ๊ทธ๋ ค๋ด๊ธฐ ์ํด ๊ณ ๋ฏผํ๋ ๋ถ๋ถ๊ณผ ๋ฌ๋ ฅ์ ๊ทธ๋ ค๋ด๋ ๊ณผ์ ์ ๋ํ ๋ด์ฉ๋ค์ ์ ์ด๋ณด์์ต๋๋ค.
2ํธ์์๋ ์ ์ด๋ํ๋ ๊ธฐ๋ฅ๊ณผ ๋ฐ์ดํฐ ์คํค๋ง ๋ฌธ์ ์ ๋ฐ๊ฒฌ์ผ๋ก ๋ฌ๋ ฅ์ ๋ค์ ๊ทธ๋ ค๋ ค๋ด๋ ๊ณผ์ ๊ณผ ์ ์ ์ผ๋ก ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝ ํ๋ ๊ฒ์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ด์ ํธ์์ 7์ ๋ฌ๋ ฅ์ ๋ง๋ค์ด๋ณด์์ต๋๋ค.
๋ฌ๋ ฅ ๋ก์ง์ด ์ ๋ง๋ค์ด์ก๋ค๋ฉด 8์์ด ๋์ด๋ 9์์ด ๋์ด๋ ๋ฌ๋ ฅ์ด ์ ๊ทธ๋ ค์ ธ์ผ ๊ฒ ์ฃ ?
์ด๋ฒ์๋ ์ ์ด๋ํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ ์ ์ด๋์ด ๋์ด๋ ๋ฌ๋ ฅ์ด ์ ๊ทธ๋ ค์ง๋ ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
์ ์ด๋ํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ํด ๊ตฌ์กฐ๋ฅผ ๋จผ์ ์ก๊ฒ ์ต๋๋ค.
ํญ์ ์ข์ ์ฝ๋๋ฅผ ์ง๊ธฐ ์ํด์๋ ๋ค์ด๋ฐ์ ๋ํ ๊ณ ๋ฏผ์ด ๋น ์ง ์ ์์ฃ .
์ด๋ฒ์๋ ์๋ ์์ด ๊ณ ๋ฏผํ ๋์ "MonthSwiper" ๊ฐ ํ์ํ๊ฒ ๋์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๊ฐ์ง๋ ๋ชปํ ๋๊ด์ ๋ถ๋ชํ์ต๋๋ค.
<, > ์ ๊ฐ์ ํน์๋ฌธ์๋ฅผ ์ด๋ป๊ฒ ํํํ ์ ์๋๊ฐ์ ๋ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๊ทธ๋์ ๋ ๊ตฌ๊ธ๋ง ์ฐฌ์ค๋ฅผ ์ผ๋ต๋๋ค:)
์ด๋ ๊ฒ ์ ๊ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ป์์ต๋๋ค.
์๋์ ๊ฐ์ด ๋ง๋ค์ด ๋ณด์์ต๋๋ค.
import { useSelector } from 'react-redux';
export default function MonthSwiperContainer() {
const { year, month } = useSelector((state) => ({
year: state.year,
month: state.month,
}));
return (
<>
<div>
<button
type="button"
>
<
</button>
</div>
<div>
<div>{year}</div>
<div>{month}์</div>
</div>
<div>
<button
type="button"
>
>
</button>
</div>
</>
);
}
์ด์ ์ ์ด๋ํ ์ ์๋๋ก ์ก์ ์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
์ด์ ๋ฌ์ด๋ ์ด๋ป๊ฒ ํํ๋์ด์ผ ํ๋์ง ์๊ฐ์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ธฐ์ค์ด 2021๋ 2์์ด๋ฉด ์ด์ ๋ฌ์ 2021๋ 1์์ด์ฌ์ผ ํฉ๋๋ค.
month - 1
๊ธฐ์ค์ด 2021๋ 1์์ด๋ฉด 2020๋ 12์์ด์ฌ์ผ ํฉ๋๋ค.
year - 1 & month + 11
์ด๋ ๊ฒ ์๊ฐํ ๋ ผ๋ฆฌ๋ฅผ ์ฝ๋์ ์ ์ฉํด์ ์๋์ ๊ฐ์ด ๋ง๋ค์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
setPreviousMonth(state, { payload: { month } }) {
if (month === 1) {
return {
...state,
year: state.year - 1,
month: state.month + 11,
};
}
return {
...state,
month: state.month - 1,
};
},
๋ง์ฐฌ๊ฐ์ง๋ก ๋ค์ ๋ฌ ์ด๋ ์ด๋ป๊ฒ ํํ๋์ด์ผ ํ๋์ง๋ ์๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
๊ธฐ์ค์ด 2021๋ 11์์ด๋ฉด ์ด์ ๋ฌ์ 2021๋ 12์์ด์ฌ์ผ ํฉ๋๋ค.
month + 1
๊ธฐ์ค์ด 2021๋ 12์์ด๋ฉด 2022๋ 1์์ด์ฌ์ผ ํฉ๋๋ค.
year + 1 & month - 11
๋ง์ฐฌ๊ฐ์ง๋ก ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
setNextMonth(state, { payload: { month } }) {
if (month === 12) {
return {
...state,
year: state.year + 1,
month: state.month - 11,
};
}
return {
...state,
month: state.month + 1,
};
},
์์์ ์ก์ ์ ๋ง๋ค์ด ์ฃผ์์ต๋๋ค. ์ก์ ์ ์ ๋ง๋ค์๋์ง ํ์ธํด๋ณผ๊น์?
<button>
ํ๊ทธ์ onClick ์ด๋ฒคํธ๋ฅผ ๋ฌ์์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ก์
์ ๋ฐ์์์ผ์ฃผ๋ฉด ๋๊ฒ ์ฃ ?
dispatch๋ก ์ก์ ์ ์ ๋ฌํด์ฃผ๊ฒ ์ต๋๋ค.
month๋ 1์๋ถํฐ 12์๊น์ง๋๊น ์๋ ์ฝ๋์ฒ๋ผ ์กฐ๊ฑด์ ์ถ๊ฐ ํด์ฃผ๊ฒ ์ต๋๋ค.
import { useDispatch, useSelector } from 'react-redux';
import {
setPreviousMonth,
setNextMonth,
} from '../slice';
export default function MonthSwiperContainer() {
const dispatch = useDispatch();
const { year, month } = useSelector((state) => ({
year: state.year,
month: state.month,
}));
// month : 1 ~ 12
// month์ ๋ํ ์กฐ๊ฑด์ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค.
const handleChangePreviousMonth = () => {
if (month > 0) {
dispatch(setPreviousMonth({ month }));
}
};
// ๋ง์ฐฌ๊ฐ์ง๋ก month์ ๋ํ ์กฐ๊ฑด์ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค.
const handleChangeNextMonth = () => {
if (month < 13) {
dispatch(setNextMonth({ month }));
}
};
return (
<>
<div>
<button
type="button"
onClick={handleChangePreviousMonth}
>
<
</button>
</div>
<div>
<div>{year}</div>
<div>{month}์</div>
</div>
<div>
<button
type="button"
onClick={handleChangeNextMonth}
>
>
</button>
</div>
</>
);
}
์๋์ ๊ฐ์ด ์ ์ด๋ ๊ธฐ๋ฅ๋ ์ ๋ง๋ค์ด์ก์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ค๋์ด 2022๋ 10์ 5์ผ์ด๋ผ๋ฉด 2022๋ 10์ ๋ฌ๋ ฅ์ ๋ ๋๋งํด์ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
์๋์ ๊ฐ์ด year๊ณผ month๋ฅผ 2021๋ 7์๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ธฐ ๋๋ฌธ์ ์ค๋์ด 2021๋ 8์์ด๋, 2022๋ 7์์ด์ฌ๋ ํญ์ 2021๋ 7์ ๋ฌ๋ ฅ์ ์ฒ์ ํ๋ฉด์ผ๋ก ๋ ๋๋ง ํด์ค ๊ฒ์ ๋๋ค.
๊ทธ๋์ ๋ฐ์ดํฐ ์ ์๋ฅผ ์์ ํด์ฃผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
Date๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ํ์ฌ ๋ ์ง๋ฅผ ์ ์ํด์ฃผ๊ณ ํ์ฌ year๊ณผ ํ์ฌ month๋ฅผ ์ ์ํด ์ฃผ๊ฒ ์ต๋๋ค.
์๋์ ๊ฐ์ด ์์ ํ๋ฉด ์ ์ ์ผ๋ก ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
์ค๋์ด 2021๋
8์ 23์ผ์ด๋๊น 8์ ๋ฌ๋ ฅ์ด ์ฒ์ ํ๋ฉด์ผ๋ก ๊ทธ๋ ค์ง๋ต๋๋ค.
import { createSlice } from '@reduxjs/toolkit';
const today = new Date();
const { actions, reducer } = createSlice({
name: 'application',
initialState: {
year: today.getFullYear(),
month: today.getMonth() + 1,
},
reducers: {},
});
export const {} = actions;
export default reducer;
์ด์ ์ ๋ง๋ค์๋ ๋ฌ๋ ฅ์ ๊ทธ๋ ค๋ด๋ ์ฝ๋๋ date(๋ ์ง)๊ฐ๋ง ๊ฐ์ง๊ณ ์๋ ์ํ์์ต๋๋ค. ( ์ด์ ํธ ๋งํฌ )
// ... ์๋ต
๋ฌ๋ ฅ์ ์ ๊ทธ๋ ค๋ด๊ธฐ๋ง ํ๋ฉด ๋๋ค๊ณ ์๊ฐํ๊ณ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ๋ ์ง ๊ฐ๋ง ์ฐพ์์ ๋ฐฐ์ด์ ๋ด์์ฃผ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋ง๋ค๋ ค๊ณ ํ๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํ์๊ณ , ๋ฐ์ดํฐ ์คํค๋ง๋ฅผ ์ฌ์ ์ ํด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
date๋ 1์ผ๋ถํฐ 30์ผ or 1์ผ๋ถํฐ 31์ผ or 1์ผ๋ถํฐ 28์ผ ์ด๋ ๊ฒ ์ซ์๋ก ํํ๋ฉ๋๋ค.
ํ์ง๋ง ์ด ๋ ์ง๊ฐ๋ค์ด 7์๋ฌ 1์ผ์ธ์ง 8์๋ฌ 1์ผ์ธ์ง์ ๋ํ ๊ตฌ๋ถ์ด ๋์ง ์์ต๋๋ค.
๊ทธ๋์ ๋ฐ์ดํฐ ์คํค๋ง๋ฅผ ์ฌ์ ์ ํ๊ณ , ์ถ๊ฐ๋ก ๋ฆฌํฉํ ๋ง๋ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋์ ๊ฐ์ด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ ์ ํด์ฃผ๊ฒ ์ต๋๋ค.
1๏ธโฃ lastOfPreviousMonth (์ด์ ๋ฌ ๋ง์ง๋ง year, month, date, day)
2๏ธโฃ lastOfThisMonth (์ด๋ฒ ๋ฌ ๋ง์ง๋ง year, month, date, day)
3๏ธโฃ startOfNextMonth (๋ค์ ๋ฌ ์์์ผ year, month, date, day)
์ด์ ์ ๋ง๋ค์๋ ์ฝ๋๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ณ ๋๊ตฐ๊ฐ ์ฝ๋๋ฅผ ๋ณด์์ ๋ ์ฃผ์์ด ์๋ค๋ฉด ์ดํดํ๋๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์ฝ๋์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋์ ํจ์๋ก ๋ง๋ค์ด์ ๊ฐ๋ ์ฑ์ ๋์ฌ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋ฉ๋๋ค.
export default function CalendarMonth({ year, month }) {
// ์๋ต
...
return getWeeks().map((week) => (
<div
key={week}
>
{
week.map((date) => (
<div
key={date}
>
{date}
</div>
))
}
</div>
));
}
โ๏ธ ํ ์์ผ, ์ผ์์ผ ์๊น ๊ตฌ๋ถํด์ฃผ๊ธฐ
โ๏ธ ์ค๋ ๋ ์ง ํ์ํด์ฃผ๊ธฐ
โ๏ธ ๋ณด์ฌ์ง๋ ๋ฌ๋ ฅ์์ ์ด์ ๋ฌ & ๋ค์ ๋ฌ ๋ ์ง ํ๋ฆฌ๊ฒ ํํํ๊ธฐ
์ฝ๋์จ ๊ฐ์ธํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ฐ์ ํผ๋๋ฐฑ
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด 2021๋ 8์ ๋ฌ๋ ฅ์ ๋ฌธ์ ๊ฐ ๋ณด์ด๋ ๊ฑธ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ถ๊ฐ๋ก ํด๊ฒฐํด์ผ ํ ๋ถ๋ถ์ ๋ํด์๋ ์ฐจ๊ทผ์ฐจ๊ทผ ํด๊ฒฐํด์ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌํ๋๋ก ํ๊ฒ ์ต๋๋ค.