react-big-calendar
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ปค์คํ
ํ๊ธฐ ์ํด ๋ฌ๋ ฅ์ 4๊ฐ ์ปดํฌ๋ํธ๋ก ์ชผ๊ฐฐ๋ค.
AccountCalendar.js - ๋ฌ๋ ฅ ์ต์์ ์ปดํฌ๋ํธ
ToolBar.js - ์ด์ ๋ฌ, ๋ค์ ๋ฌ ๋ฒํผ ๋ฌ๋ ฅ ํค๋ ์ปดํฌ๋ํธ
Day.js - ๋ ์ง ์ปดํฌ๋ํธ
Event.js - ๋ฑ๋ก๋ ์์ , ์ง์ถ ๋ด์ญ style์ ์ปค์คํ ํ๋ ์ปดํฌ๋ํธ
ToolBar ์์ ์ปดํฌ๋ํธ์์ ๋ค์ ๋ฌ ํน์ ์ด์ ๋ฌ ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋,
์ด๋ป๊ฒํ๋ฉด ๋ฌ๋ ฅ ์ต์์ ์ปดํฌ๋ํธ์์ ์๋ณ ๋ด์ญ์ ์๋ก ์์ฒญํ ์ ์์๊น?
react-big-calendar
์ ๊ฒฝ์ฐ ์ชผ๊ฐ์ง ์ปดํฌ๋ํธ๋ฅผ ์๋์ ๊ฐ์ ํํ๋ก ์ฝ์
ํ๊ธฐ ๋๋ฌธ์
์์์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ์ธ์๋ก ๋๊ฒจ์ค ์ ์๋ค.
<Calendar
components={{
toolbar: ToolBar,
month: {
dateHeader: Day,
},
}}
/>
ToolBar ์ปดํฌ๋ํธ์์ ์ด์ ๋ฌ, ๋ค์๋ฌ ํด๋ฆญ ์ ๋์ํ๋ ๋ด์ฅํจ์ navigate.bind(null, "PREV")
๋ onClick์ ํ์ดํํจ์ ํํ๋ก ๋ฐ๊ฟ ๊ฒฝ์ฐ ๋์ํ์ง ์์ onClick
์์ month state๋ฅผ setํ๋ ํจ์๋ฅผ ๋ฃ์ ์ ์๋ค.
// ์ด์ ๋ฌ ๋ฒํผ
<Btn type="button" onClick={navigate.bind(null, "PREV")}>
// ๋ค์ ๋ฌ ๋ฒํผ
<Btn type="button" onClick={navigate.bind(null, "NEXT")}>
1๏ธโฃย ToolBar ์ด์ ๋ฌ, ๋ค์๋ฌ onClick navigate.bind(null, "PREV")
ํจ์๋ฅผ ๋ฐ์ผ๋ก ๊บผ๋ด click event ์ํ๊ด๋ฆฌํ๊ธฐ
// ToolBar.js
const [click, setClick] = useState(false);
const navigate = (action) => {
props.onNavigate(action);
if (!click) setClick(true);
else setClick(false);
};
2๏ธโฃย ToolBar.js์์ useEffect
ํ
dependency array
์ click ๊ฐ ๋ฃ๊ณ , ์ด์ ๋ฌ, ๋ค์ ๋ฌ ๋ฒํผ ํด๋ฆญ ์ ๋ง๋ค yearMonth ๊ฐ redux
๋ก dispatch
// ToolBar.js
const month = moment(date).format("MM");
const year = moment(date).format("YYYY");
const YYMM = { month: month, year: year };
useEffect(() => {
dispatch(getYearMonthDB(YYMM));
}, [click]);
3๏ธโฃย ๋ฌ๋ ฅ ์ต์์ ์ปดํฌ๋ํธ์์ redux
์ ์ ์ฅ๋ yearMonth ๊ฐ useSelector
๋ก ๋ถ๋ฌ์จ ํ yearMonth ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์๋ณ ๋ด์ญ ์๋ก ์์ฒญ
// AccountCalendar.js
const yearMonth = useSelector((state) => state.account.yearMonth);
useEffect(() => {
dispatch(getYearMonthDB(YYMM));
}, [click]);
4๏ธโฃย ๋ฌ๋ ฅ ์ต์์ ์ปดํฌ๋ํธ์์ ์๋ก ์กฐํํ ์๋ณ ๋ด์ญ์ useSelector
๋ก ๋ถ๋ฌ์จ ํ events ์ data ์ ๋ฌ
// AccountCalendar.js
const accountList = useSelector((state) => state.account.accountList);
return (
<Calendar
events={convertCalendarData(accountList)}
localizer={localizer}
style={{ height: 100 + "%", width: 100 + "%" }}
components={{
toolbar: ToolBar,
month: {
dateHeader: Day,
},
}}
onSelectEvent={(eventInfo) => {
setEventInfo(eventInfo);
toggleModal();
}}
eventPropGetter={Event}
/>
)
์ด๋ฅผ ํตํด ์ต์ข ์ ์ผ๋ก ๋ฌ๋ ฅ ์ต์์์ปดํฌ๋ํธ์์ ๋ฑ ํ๋ฒ ํ์ฌ ์๋ณ ๋ด์ญ api์์ฒญ์ ํ ์ ์๊ฒ ๋์๋ค!
๐งโ๐ป react-use-effect-ํ
-์ดํํธ-ํจ์-ํด๋ฆฐ์
-ํจ์
๐งโ๐ป react-big-calendar Toolbar ์ปค์คํ
ํ๊ธฐ