이런 모양의 달력을 라이브러리를 통해서 간단하게 만들 수 있다.
해당 라이브러리의 깃헙주소는 https://www.npmjs.com/package/fullcalendar 이다.
설치
해당 라이브러리를 시작하기 위해서는 우선 세 가지를 인스톨 해야한다.
npm install --save @fullcalendar/core @fullcalendar/react @fullcalendar/daygrid @fullcalendar/timegrid @fullcalendar/list
npm install --save @fullcalendar/interaction
npm install --save-dev css-loader
이후 프로젝트에서 사용하면 된다.
저는 프로젝트를 만든 이후 , component 폴더에 달력과 관련 css파일만 추가해서 실행하였습니다.
이제 코드를 보겠습니다.
import React, { useRef } from "react";
import FullCalendar from "@fullcalendar/react";
import dayGridPlugin from "@fullcalendar/daygrid";
import timeGridPlugin from "@fullcalendar/timegrid";
import listMonth from "@fullcalendar/list";
import interactionPlugin from "@fullcalendar/interaction";
import "./Calendar.css";
const Calendar = () => {
const calendarRef = useRef();
// event 추가
const onEventAdd = (e) => {
const api = calendarRef.current.getApi();
api.addEvent({
title: "이사장님과의 약속",
date: "2023-08-24 12:30",
constraint: "약속",
});
};
// 이벤트 클릭시
const eventCLick = (info) => {
// alert("eventClick");
// alert(JSON.stringify(info.event.start));
let date = new Date(info.event.start);
let year = date.getFullYear();
let month = date.getMonth();
let day = date.getDate();
let hour = date.getHours();
let minute = date.getMinutes();
let promise = `날짜 : ${year}년 ${month + 1}월 ${day}일 ${hour}시 ${minute}분
`;
promise += "제목 : " + info.event.title + "\n";
promise += "내용 : " + info.event.constraint;
alert(promise);
};
// 날짜를 클릭시
const handleDateClick = (args) => {
let date = new Date(args.dateStr);
let year = date.getFullYear();
let month = date.getMonth() + 1 + "";
if (month.length < 2) {
month = "0" + month;
}
let day = date.getDate() + "";
if (day.length < 2) {
day = "0" + day;
}
let selectDate = year + "-" + month + "-" + day;
alert(selectDate);
};
return (
<div className="calendar">
<FullCalendar
headerToolbar={{
left: "prev next today", // 좌측버튼
center: "title",
end: "dayGridMonth timeGridWeek timeGridDay listMonth",
}}
locale={"ko"} // 한국어
navLinks={true} // 오른쪽 상단의 day 클릭 대신 날짜를 클릭
businessHours={true} // 주말을 다른 색으로
plugins={[dayGridPlugin, timeGridPlugin, listMonth, interactionPlugin]}
initialView="dayGridMonth"
eventClick={eventCLick}
ref={calendarRef}
dateClick={handleDateClick}
events={[
{
title: "점심약속",
date: new Date(), //'2023-08-16
},
{
title: "미팅",
start: "2023-08-14", //'2023-08-16 까지 적으면 줄이 김
},
{
title: "미팅2",
start: "2023-08-14 12:30", //'2023-08-16 까지 적으면 줄이 김
},
{
title: "비지니스",
start: "2023-08-18 12:30:00",
constraint: "김사장과 복싱",
end: "2023-08-20 12:30",
},
{
title: "워크샵",
start: "2023-08-17 12:30:00",
constraint: "팔협지 또 일등이야",
end: "2023-08-22 12:30",
},
{
title: "데이트",
start: "2023-08-27 12:30:00",
constraint: "영화관람",
backgroundColor: "#ff0000",
},
]}
/>
<br />
<button onClick={onEventAdd} className="btn btn-primary">
일정추가
</button>
</div>
);
};
export default Calendar;
약식으로 만든 파일이기 때문에 위와 같이 작성을 하였습니다.
FullCalendar를 제외한 플러그인은 컴퍼넌트가 아니기에 소문자로 import 했고
FullCalendar는 대문자로 import해야합니다
그리고 현재는 서버와의 통신없이 코드를 작성하였기에 ,
const onEventAdd = (e) => {
const api = calendarRef.current.getApi();
api.addEvent({
title: "이사장님과의 약속",
date: "2023-08-24 12:30",
constraint: "약속",
});
};
에서 임의의 더미데이터를 넣어 작성하였지만, 서버와 연결을 할 거면 axios를 통해서 데이터를 전송하시면 됩니다.
이제 라이브러리에 대해 설명하겠습니다.
<FullCalendar
headerToolbar={{
left: "prev next today", // 좌측버튼
center: "title",
end: "dayGridMonth timeGridWeek timeGridDay listMonth",
}}
locale={"ko"} // 한국어
navLinks={true} // 오른쪽 상단의 day 클릭 대신 날짜를 클릭
businessHours={true} // 주말을 다른 색으로
plugins={[dayGridPlugin, timeGridPlugin, listMonth, interactionPlugin]}
initialView="dayGridMonth"
eventClick={eventCLick}
ref={calendarRef}
dateClick={handleDateClick}
events={[
{
title: "점심약속",
date: new Date(), //'2023-08-16
},
{
title: "미팅",
start: "2023-08-14", //'2023-08-16 까지 적으면 줄이 김
},
{
title: "미팅2",
start: "2023-08-14 12:30", //'2023-08-16 까지 적으면 줄이 김
},
{
title: "비지니스",
start: "2023-08-18 12:30:00",
constraint: "김사장과 복싱",
end: "2023-08-20 12:30",
},
{
title: "워크샵",
start: "2023-08-17 12:30:00",
constraint: "팔협지 또 일등이야",
end: "2023-08-22 12:30",
},
{
title: "데이트",
start: "2023-08-27 12:30:00",
constraint: "영화관람",
backgroundColor: "#ff0000",
},
]}
/>
headerToolbar 의 경우 헤더에 있는 버튼들을 정의해줍니다. 이때 prev 와 next 는 화살표 모양으로 달력이동, today는 현재 날짜로 돌아오게 합니다. left title right는 해당 버튼들의 위치를 정의하고, dayGridMonth timeGridWeek timeGridDay listMonth 는 각각 월 주 일 일정리스트별 정렬을 해줍니다.
locale은 언어 설정,
navlinks는 day대신 날짜 클릭 (false하는게 좋다고 생각합니다),
businessHours는 주말은 다른색,
plugins에 위에 import한 plugin들을 연결하고,
initial view는 시작시 보여줄 달력의 모양,
dateClick은 달력의 날짜 클릭시 효과,
eventClick은 일정 클릭시 효과입니다.
'프론트엔드' 카테고리의 다른 글
VITE 란? (0) | 2023.08.22 |
---|---|
React swiper 라이브러리 사용 (0) | 2023.08.21 |
리엑트 페이지네이션 라이브러리(react+ SpringBoot) (0) | 2023.08.11 |
React 프로젝트 생성 및 기초 (0) | 2023.08.08 |
form속에 버튼 자동으로 submit되는 거 막기 (0) | 2023.07.24 |