Skip to main content

Vue Scheduler Overview

Vue Scheduler is the official Vue wrapper for DHTMLX Scheduler. It combines Vue-friendly composition patterns with full access to the underlying Scheduler engine.

If you need setup instructions first, start with Quick Start with Vue Scheduler.

How the Wrapper Works​

Vue Scheduler is a wrapper around the DHTMLX Scheduler engine. The wrapper gives you a Vue component API, but the underlying engine is still the source of scheduler behavior and low-level methods.

The wrapper layer handles three things:

  • initializes and destroys the Scheduler instance with Vue lifecycle
  • syncs selected Vue props into the current Scheduler instance
  • exposes wrapper-specific extension points (on<EventName> listeners, @ready, customLightbox, eventBoxRenderer, composables)

That means you can stay declarative for most integration work and still drop down to instance when needed.

Core Capabilities​

The wrapper covers both basic and advanced integration scenarios:

  • Declarative setup with props (events, date, view, config, templates, plugins, theme, locale)
  • Controlled event synchronization through events
  • Scheduler-owned loading through data.load when events is omitted
  • Change handling through data.save and data.batchSave
  • Callback wiring through Vue on<EventName> listeners and useSchedulerEvent
  • One-time lifecycle hook through @ready
  • Vue-based customization hooks (customLightbox, eventBoxRenderer, modals)
  • Typed helpers and composables for reusable patterns

Scenario: Basic Wrapper Setup​

Use props for calendar data, configuration, and template customization.

<script setup lang="ts">
import {
VueScheduler,
defineSchedulerConfig,
defineSchedulerTemplates,
type Event
} from "@dhtmlx/trial-vue-scheduler";
import "@dhtmlx/trial-vue-scheduler/dist/vue-scheduler.css";

const events: Event[] = [
{
id: 1,
text: "Planning",
start_date: new Date("2026-05-18T09:00:00"),
end_date: new Date("2026-05-18T10:30:00"),
classname: "event-planning"
}
];

const config = defineSchedulerConfig({
first_hour: 8,
last_hour: 20,
time_step: 30
});

const templates = defineSchedulerTemplates({
event_class: (_start, _end, event) => event.classname || ""
});
</script>

<template>
<div :style="{ height: 600px; }">
<VueScheduler
:events="events"
:date="new Date('2026-05-18T00:00:00')"
view="week"
:config="config"
:templates="templates"
/>
</div>
</template>

For the full prop list, use Configuration Reference.

Choose A Data Ownership Model​

The wrapper supports two main data ownership models.

  • Vue state/store as source of truth: pass events, handle edits through data.save or data.batchSave, and update Vue state.
  • Scheduler as source of truth: omit events, load data through data.load, and let Scheduler and your backend own the data lifecycle.

When Vue owns the data, prefer typed SerializedEvent[] state so other Vue components can react to Scheduler changes.

Use Data Binding and State Management Basics for the tradeoffs and callback contracts.

Handle Events And Startup Logic​

Use Vue on<Eventname> listeners for Scheduler callbacks and @ready for one-time setup after initialization.

<script setup lang="ts">
import type { SchedulerStatic } from "@dhtmlx/trial-vue-scheduler";

function beforeLightbox(eventId: string | number) {
console.log("before lightbox", eventId);
return true;
}

function onReady(instance: SchedulerStatic) {
console.log("ready", instance);
}
</script>

<template>
<VueScheduler :onBeforeLightbox="beforeLightbox" @ready="onReady" />
</template>

Use listeners for interaction behavior. Use @ready for initialization logic that needs a live instance.

Cross The Imperative Boundary​

Use a component ref when you need methods that are not practical to model through props.

<script setup lang="ts">
import { onMounted, ref } from "vue";
import { VueScheduler, type VueSchedulerRef } from "@dhtmlx/trial-vue-scheduler";

const schedulerRef = ref<VueSchedulerRef | null>(null);

onMounted(() => {
const scheduler = schedulerRef.value?.instance;
schedulerRef.message({
text:"Scheduler is mounted"
});
});
</script>

<template>
<VueScheduler ref="schedulerRef" />
</template>

If you mutate event data through instance, keep external state in sync. Otherwise the next controlled listener can overwrite those changes.

Advanced Extension Points​

Custom lightbox component​

Replace the built-in event form with a Vue component:

<VueScheduler :events="events" :customLightbox="CustomLightbox" :data="data" />

Custom event box rendering​

Render Scheduler event boxes yourself with eventBoxRenderer:

const eventBoxRenderer = ({ event }) => `#${event.id}: ${event.text}`;

Custom delete and recurrence confirmation flow​

Override confirmations with modals:

const modals = {
onBeforeEventDelete: ({ event, callback }) => {
if (window.confirm(`Delete ${event.text}?`)) callback();
}
};

Extra Scheduler views​

Use views to configure Timeline, Units, or Grid views and enable required plugins through plugins if needed.

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.