Перейти к основному содержимому

Быстрый старт с React Scheduler

примечание

Этот туториал охватывает React-обёртку, входящую в выпуски DHTMLX Scheduler: Commercial, Enterprise и Ultimate. Если вы используете издания Individual или GPL, следуйте альтернативному руководству: Как начать работу с React.

Компонент React Scheduler — официальная обёртка для DHTMLX Scheduler. Это руководство проведёт вас через создание небольшого приложения на React и отображение базового Scheduler с использованием trial-пакета.

Если вы новичок в React, начните с официальной документации по React. Ознакомьтесь с полным рабочим проектом, соответствующим этому руководству, на GitHub.

Требования к версии

  • React 18 и выше

Создание нового проекта на React

Чтобы создать проект на React и перейти в директорию проекта, выполните следующие команды:

npm create vite@latest react-scheduler-quick-start -- --template react-ts
cd react-scheduler-quick-start

Установка React Scheduler

Установите React Scheduler, как описано в руководстве по установке React Scheduler.

В этом руководстве мы используем evaluатion-пакет:

npm install @dhtmlx/trial-react-scheduler

или

yarn add @dhtmlx/trial-react-scheduler

Если вы уже используете пакет Professional, замените @dhtmlx/trial-react-scheduler на @dhx/react-scheduler в командах и импортах.

Добавление демонстрационных данных

Для этого примера мы будем использовать статические данные. Создайте файл с именем src/demoData.ts:

import type { Event } from '@dhtmlx/trial-react-scheduler';

export const events: Event[] = [
{
id: 1,
classname: 'blue',
start_date: new Date('2025-12-08T02:00:00Z'),
end_date: new Date('2025-12-08T10:20:00Z'),
text: 'Product Strategy Hike',
},
{
id: 2,
classname: 'blue',
start_date: new Date('2025-12-08T12:00:00Z'),
end_date: new Date('2025-12-08T16:00:00Z'),
text: 'Agile Meditation and Release',
},
{
id: 3,
classname: 'violet',
start_date: new Date('2025-12-09T06:00:00Z'),
end_date: new Date('2025-12-09T11:00:00Z'),
text: 'Tranquil Tea Time',
},
// ....
];

Создание компонента Scheduler

Чтобы добавить компонент Scheduler, создайте файл src/components/Scheduler/Scheduler.tsx со следующим содержимым:

import { useMemo, useRef } from 'react';
import ReactScheduler, {
type ReactSchedulerRef,
type Event,
type SchedulerTemplates,
type SchedulerConfig,
} from '@dhtmlx/trial-react-scheduler';
import '@dhtmlx/trial-react-scheduler/dist/react-scheduler.css';
import './styles.css';

export interface ReactSchedulerProps {
events: Event[];
activeView?: string;
activeDate?: Date;
}

export default function Scheduler({
events,
activeView = 'week',
activeDate = new Date('2025-12-08T00:00:00Z'),
}: ReactSchedulerProps) {
const schedulerRef = useRef<ReactSchedulerRef>(null);

const templates: SchedulerTemplates = useMemo(
() => ({
event_class: (start: Date, end: Date, event: Event) => {
return event.classname || '';
},
}),
[]
);

const config: SchedulerConfig = useMemo(() => {
return {
first_hour: 6,
last_hour: 22,
hour_size_px: 60,
};
}, []);

return (
<ReactScheduler
ref={schedulerRef}
events={events}
view={activeView}
date={activeDate}
templates={templates}
config={config}
data={{
save: (entity: string, action: string, data: Event, id: string | number) => {
console.log(`${entity} - ${action} - ${id}`, data);
},
}}
/>
);
}

Наконец, CSS-классы (.violet, .green, .yellow) применяются через шаблон event_class для настройки внешнего вида событий:

.violet {
--dhx-scheduler-event-background: linear-gradient(180deg, #d071ef 0%, #ee71d5 100%);
}
.green {
--dhx-scheduler-event-background: linear-gradient(180deg, #12d979 0%, #1ecdeb 100%);
}
.yellow {
--dhx-scheduler-event-background: linear-gradient(180deg, #ffb725 0%, #ffbb25 31.25%, #faea27 100%);
}

Отображение Scheduler в приложении

Чтобы отобразить Scheduler, замените код в src/App.tsx на следующий:

import './App.css';
import Scheduler from './components/Scheduler/Scheduler';
import { events } from './demoData';

function App() {
return (
<div style={{ width: '100vw', height: '100vh' }}>
<Scheduler events={events} />
</div>
);
}

export default App;

После этого запустите приложение с помощью следующей команды:

npm run dev

На данный момент у вас полностью работающее приложение на React + DHTMLX Scheduler.

Эта конфигурация представляет собой минимальную настройку, необходимую для:

  • отрисовки Scheduler
  • отображения событий
  • применения базовой конфигурации масштаба
  • прикрепления экземпляра Scheduler через React ref
  • получения событий через обратный вызов data.save

Это тот же минимальный пример, используемый в демонстрационном проекте на GitHub.

Далее вы можете продолжать, добавляя более продвинутые функции:

  • синхронизацию данных с состоянием React
  • загрузку/сохранение данных с вашего бэкенда
  • добавление шаблонов и пользовательских рендереров
  • добавление фильтрации
  • замену Lightbox на собственный компонент

Следующие разделы поочерёдно вводят эти возможности.

Использование состояния React в качестве источника истины

(рекомендуется для большинства приложений на React)

В реальных приложениях события обычно поступают из состояния React. Ниже приведён полный пример, в котором Scheduler отправляет изменения обратно в React через обратный вызов data.save.

import { useState } from 'react';
import ReactScheduler, { Event } from '@dhtmlx/trial-react-scheduler';
import '@dhtmlx/trial-react-scheduler/dist/react-scheduler.css';
import { events as initialEvents } from './demoData';

export default function App() {
const [events, setEvents] = useState<Event[]>(initialEvents);

const data = {
save: (entity, action, item, id) => {
if (entity === 'event') {
if (action === 'create') setEvents((prev) => [...prev, item]);
if (action === 'update') setEvents((prev) => prev.map((x) => (x.id === id ? item : x)));
if (action === 'delete') setEvents((prev) => prev.filter((x) => x.id !== id));
}
},
};

return (
<div style={{ height: '100vh', width: '100vw' }}>
<ReactScheduler
events={events}
data={data}
// ...other props
/>
</div>
);
}

Почему стоит выбрать этот режим

  • React всегда видит те же данные, что и UI Scheduler
  • Работает безупречно с Redux / Zustand / Jotai / MobX
  • Легко синхронизировать с API бэкенда

Альтернативный режим: Scheduler — источник истины

(полезен для очень больших наборов данных)

В этом режиме React не владеет событиями.

<ReactScheduler
data={{
load: '/api/data', // scheduler loads initial events from here
save: '/api/data', // scheduler sends updates back here
}}
/>

Когда стоит предпочитать этот режим

  • Десятки тысяч событий
  • Частые взаимодействия пользователей и обновления
  • Вы хотите минимизировать накладные расходы на рендеринг React

Использование шаблонов

(возвращайте элементы React из функций шаблонов)

Шаблоны позволяют настраивать практически каждую часть планировщика.

import ReactScheduler, { SchedulerTemplates } from '@dhtmlx/trial-react-scheduler';
import { useMemo } from 'react';
import EventTextBox from './components/EventTextBox';

const templates: SchedulerTemplates = useMemo(
() => ({
event_class: (start, end, event) => {
return 'templates-' + event.classname || '';
},
event_text: (start, end, event) => {
return <EventTextBox event={event} />;
},
}),
[]
);

<ReactScheduler templates={templates} />;

Подробнее

См. полную секцию здесь: Документация по шаблонам React Scheduler.

Репозиторий демонстрации GitHub

Полностью рабочий проект, следующий за этим руководством, доступен на GitHub: https://github.com/dhtmlx/react-scheduler-quick-start

Следующие шаги

Need help?
Got a question about the documentation? Reach out to our technical support team for help and guidance. For custom component solutions, visit the Services page.