본문으로 건너뛰기

React와의 통합

DHTMLX Booking은 ref가 지정된 컨테이너 안에 위젯을 마운트하는 래퍼 컴포넌트를 통해 React와 통합됩니다. 이 가이드에서는 React 프로젝트를 생성하고, Booking을 설치하며, 데이터와 이벤트로 위젯을 렌더링하는 전 과정을 안내합니다. 완전한 참조 구현은 GitHub의 React 예제를 참조하십시오.

팁

이 가이드는 React의 핵심 개념에 대한 사전 지식을 전제로 합니다. 소개가 필요하다면 React 공식 문서를 참조하십시오.

프로젝트 생성​

Booking 통합을 추가하기 전에 React 앱을 먼저 생성하십시오. Create React App 또는 Vite를 사용할 수 있습니다.

정보

시작하기 전에 Vite (선택 사항)와 Node.js를 설치하십시오.

다음 명령어는 Create React App으로 새 my-react-booking-app 프로젝트를 생성합니다:

npx create-react-app my-react-booking-app

의존성 설치​

프로젝트 디렉토리로 이동하십시오.

다음 명령어는 새로 생성된 앱 폴더를 엽니다:

cd my-react-booking-app

패키지 매니저를 사용하여 의존성을 설치하고 개발 서버를 시작하십시오.

다음 명령어는 yarn을 사용합니다:

yarn
yarn start

다음 명령어는 npm을 사용합니다:

npm install
npm start

앱은 로컬호스트에서 실행됩니다(예: http://localhost:3000).

앱에 Booking 추가하기​

Booking 패키지를 설치하기 전에 개발 서버를 중지한 뒤, 위젯을 감싸는 React 컴포넌트를 생성하십시오.

1단계. 패키지 설치​

Booking 체험판 패키지를 다운로드하고 패키지 README의 단계를 따르십시오. 체험판은 30일 동안 유효합니다.

2단계. Booking 컴포넌트 생성​

src/ 디렉토리에 Booking.jsx 파일을 생성하고, 아래 단계를 완료하여 위젯을 연결하십시오.

소스 파일 가져오기​

배포 방식에 맞는 경로로 Booking 클래스와 스타일시트를 가져오십시오:

  • dhx-booking-package — 로컬 폴더에서 설치된 PRO 버전
  • @dhx/trial-booking — 체험판 버전

다음 코드 스니펫은 PRO 패키지에서 Booking을 가져옵니다:

Booking.jsx
import { Booking } from 'dhx-booking-package';
import 'dhx-booking-package/dist/booking.css';

PRO 패키지에 축소된 에셋이 포함된 경우 CSS 파일을 booking.min.css로 가져오십시오.

다음 코드 스니펫은 체험판 패키지에서 Booking을 가져옵니다:

Booking.jsx
import { Booking } from '@dhx/trial-booking';
import "@dhx/trial-booking/dist/booking.css";
정보

이 튜토리얼은 Booking 체험판을 사용합니다.

컨테이너 설정 및 Booking 초기화​

호스트 컨테이너에 ref를 선언하고, useEffect() 안에서 Booking 인스턴스를 생성하십시오. React가 컴포넌트를 언마운트할 때 위젯을 제거하는 정리 함수를 반환하여 destructor()를 호출하십시오.

다음 코드 스니펫은 ref가 지정된 컨테이너와 생명주기 정리를 포함한 Booking 컴포넌트를 선언합니다:

Booking.jsx
import { useEffect, useRef } from "react";
import { Booking } from "@dhx/trial-booking";
import "@dhx/trial-booking/dist/booking.css"; // Booking 스타일 가져오기

export default function BookingComponent(props) {
let container = useRef(); // Booking의 호스트 컨테이너

useEffect(() => {
// Booking 인스턴스 생성
const booking = new Booking(container.current, {});

return () => {
booking.destructor(); // Booking 언마운트
};
}, []);

return <div ref={container} className="widget"></div>;
}

스타일 추가​

Booking은 위젯 스타일시트(위에서 가져옴)와 크기가 지정된 컨테이너 두 가지가 모두 필요합니다. 프로젝트의 메인 CSS 파일에서 페이지와 위젯 컨테이너에 전체 높이를 설정하십시오.

다음 코드 스니펫은 페이지와 Booking 컨테이너에 전체 높이를 설정합니다:

index.css
/* 페이지 스타일 */
html,
body,
#root {
height: 100%;
padding: 0;
margin: 0;
}

/* Booking 컨테이너 */
.widget {
height: 100%;
}

데이터 로드​

Booking에 카드 데이터를 로드하려면 data 속성에 맞는 데이터셋을 준비하십시오. 전체 데이터 형식과 로딩 시나리오는 데이터 로딩 가이드를 참조하십시오.

src/ 디렉토리에 data.js 파일을 생성하십시오.

다음 코드 스니펫은 샘플 데이터셋을 반환하는 getData() 헬퍼를 정의합니다:

data.js
export function getData() {
function getDate(addDays, hoursValue = 0, minutesValue = 0) {
const date = new Date();
const secondsValue = 0; // 분 단위로 반올림
const msValue = 0;

date.setDate(date.getDate() + addDays);
date.setHours(hoursValue, minutesValue, secondsValue, msValue);

return date.getTime();
}

return [
{
id: "ee828b5d-a034-420c-889b-978840015d6a",
title: "Natalie Tyson",
category: "Therapist",
subtitle: "2 years of experience",
details: "Cleveland Clinic\n9500 Euclid Ave",
preview: "https://snippet.dhtmlx.com/codebase/data/booking/01/img/01.jpg",
price: "$35",
review: {
stars: 4,
count: 120
},
slots: [
{
from: 9,
to: 20,
days: [1, 2, 3, 4, 5]
},
{
from: 10,
to: 18,
days: [6, 0]
}
]
},
{
id: "9b037564-77be-429f-b719-eebbe499027a",
title: "Emma Johnson",
category: "Cardiologist",
subtitle: "2 years of experience",
details: "Stanford Health Care\n1468 Madison Ave",
preview: "https://snippet.dhtmlx.com/codebase/data/booking/01/img/03.jpg",
price: "$25",
review: {
stars: 5,
count: 10
},
slots: [
{
from: 14,
to: 17,
size: 30,
gap: 10
},
{
from: 12,
to: 19,
size: 50,
gap: 20,
days: [2],
dates: [getDate(0)]
},
{
from: "18:30",
to: 20,
size: 20,
gap: 20,
days: [3, 4, 5]
}
],
usedSlots: [getDate(0, 12), getDate(0, 18)]
},
// ...
];
}

App.js를 열고, 데이터셋을 가져온 뒤 <Booking/> 컴포넌트에 prop으로 전달하십시오.

다음 코드 스니펫은 data prop을 가진 Booking 컴포넌트를 렌더링합니다:

App.js
import Booking from "./Booking";
import { getData } from "./data";

function App() {
const dataset = getData();
return <Booking data={dataset} />;
}

export default App;

Booking.jsx를 열고, data prop을 Booking 설정에 전달하십시오.

다음 코드 스니펫은 prop을 Booking 생성자에 연결합니다:

Booking.jsx
import { useEffect, useRef } from "react";
import { Booking } from "@dhx/trial-booking";
import "@dhx/trial-booking/dist/booking.css";

export default function BookingComponent(props) {
let container = useRef();

useEffect(() => {
const booking = new Booking(container.current, {
data: props.data
// 기타 구성 속성
});

return () => {
booking.destructor();
}
}, []);

return <div ref={container} className="widget"></div>;
}

이제 Booking 컴포넌트가 로드된 데이터와 함께 렌더링됩니다. 위젯을 더 커스터마이즈하려면 추가 구성 속성을 전달하십시오. 전체 목록은 속성 개요를 참조하십시오.

이벤트 처리​

위젯에서 사용자가 동작을 수행하면 이벤트가 발생합니다. booking.api.on(eventName, handler)으로 이벤트를 구독하여 동작에 반응하십시오. 이벤트 전체 목록은 이벤트 개요를 참조하십시오.

Booking.jsx를 열고, useEffect()에 이벤트 구독을 추가하십시오.

다음 코드 스니펫은 사용자가 슬롯을 선택할 때 슬롯 ID를 로그에 기록합니다:

Booking.jsx
// ...
useEffect(() => {
const booking = new Booking(container.current, {});

// 선택된 슬롯 id 로그 기록
booking.api.on("select-slot", (obj) => {
console.log(obj.id);
});

return () => {
booking.destructor();
}
}, []);
// ...

앱을 시작하면 페이지에 데이터가 로드된 Booking을 확인할 수 있습니다.

React 애플리케이션에서 데이터가 로드된 DHTMLX Booking 위젯

프로젝트 요구 사항에 맞게 코드를 커스터마이즈하십시오. 완전한 참조 구현은 GitHub에서 확인할 수 있습니다.