React Scheduler с Next.js
Это рук оводство показывает, как создать простое приложение на Next.js и отобразить DHTMLX React Scheduler на странице.
Полный исходный код доступен на GitHub.
Требования
- Node.js (рекомендуется LTS)
- основы React + TypeScript
- основы Next.js (App Router, Server/Client Components). Если нужен повтор, см. документацию Next.js: https://nextjs.org/docs
Быс трая настройка — создание проекта
Чтобы сгенерировать каркас приложения Next.js, выполните:
npx create-next-app@latest
При запросе выберите:
- Название проекта: react-scheduler-nextjs-quick-start
- Использовать шаблон по умолчанию (TypeScript, ESLint, Tailwind CSS, App Router, Turbopack)
Next.js создаст структуру проекта и установит базовые зависимости.
После установки перейдите в директорию проекта:
cd react-scheduler-nextjs-quick-start
Установка React Scheduler
Установите React Scheduler, как описано в руководстве по установке React Scheduler.
В этом руководстве мы используем демонстрационный пакет:
npm install @dhtmlx/trial-react-scheduler
или
yarn add @dhtmlx/trial-react-scheduler
Если вы уже используете Professional пакет, замените @dhtmlx/trial-react-scheduler на @dhx/react-scheduler в командах и импортах.
Подготовка демонстрационных данных
Создайте папку data/ в корне проекта. Внутри нее добавьте файл demoData.ts, содержащий начальные данные для Scheduler:
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',
},
{
id: 4,
classname: 'green',
start_date: new Date('2025-12-09T11:30:00Z'),
end_date: new Date('2025-12-09T19:00:00Z'),
text: 'Sprint Review and Retreat',
},
{
id: 5,
classname: 'yellow',
start_date: new Date('2025-12-10T06:00:00Z'),
end_date: new Date('2025-12-10T08:00:00Z'),
text: 'Stakeholder Sunset Yoga Session',
},
];
Сопутствующая демо-версия включает дополнительные события для более богатой визуализации.
Создание компонента Scheduler
Next.js по умолчанию использует Server Components, но React Scheduler в большинстве практических случаев следует рендерить внутри Client Component.
Это требуется, когда вы:
- используете
refдля доступа к экземпляру Scheduler - передаете колбэки (events, templates, data handlers)
- используете ReactScheduler
hooks - предоставляете динамическую конфигурацию или элементы React
Поэтому наш компонент Scheduler будет начинаться с "use client".
Создайте новый файл по пути components/Scheduler/Scheduler.tsx:
'use client';
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';
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);
},
}}
/>
);
}
Этот компонент инициализирует Scheduler и предоставляет ему конфигурацию, начальные данные и ref для будущих вызовов API. Объект config управляет макетом временной шкалы, в то время как свойства events задают набор данных Scheduler. Мы также передаем activeView и activeDate как свойства, чтобы родительский компонент управлял тем, что отображает Scheduler.
Функция save, находящаяся внутри пропа data, используется для отслеживания изменений, внесённых в события внутри Scheduler. В этом руководстве мы добавляем простой обработчик-заглушку для отслеживания изменений. Если вы хотите отправлять обновления на бэкенд или связывать их со состоянием React, вы можете следовать официальному руководству по привязке данных guide.
Добавление стилей цвета событий
CSS-классы (.blue, .violet, .green, .yellow) применяются через шаблон event_class для настройки визуального вида событий. Добавьте следующее в app/globals.css:
.blue {
--dhx-scheduler-event-background: linear-gradient(180deg, #0e8af0 0%, #0ec1f0 100%);
}
.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 занимал всю страницу максимально чисто, удалите переменные темы по умолчанию для тёмного режима из app/globals.css и убедитесь, что у body нет лишних отступов (margin):
body {
margin: 0;
padding: 0;
}
Добавление Scheduler на страницу
Откройте app/page.tsx и отобразите Scheduler на главной странице:
import Scheduler from '../components/Scheduler/Scheduler';
import { events } from '../data/demoData';
export default function HomePage() {
return (
<div style={{ height: '100vh', width: '100vw' }}>
<Scheduler events={events} />
</div>
);
}
Теперь страница будет отображать полноэкранный Scheduler.