跳到主要内容

Using DHTMLX Gantt Properties in VueGantt

This page documents the public Vue wrapper surface for @dhtmlx/trial-vue-gantt and @dhx/vue-gantt.

Use it as a reference after Overview or Quick Start.

Available Props

PropTypeDescription
tasksTask[]Task collection rendered in the chart/grid.
linksLink[]Dependency collection.
resourcesany[] | nullResource dataset for resource layouts and resource-related API methods.
resourceAssignmentsany[] | nullResource assignment dataset.
baselinesany[] | nullBaseline dataset.
markersMarker[] | nullVertical timeline markers.
calendars(WrapperCalendar | CalendarConfig)[] | nullWorking calendar definitions (wrapper format or native Gantt config).
dataVueGanttDataConfig | nullData transport callbacks: load, save, batchSave.
configPartial<GanttConfigOptions>Merged into gantt.config.
pluginsGanttPluginsGantt extensions to activate (for example auto_scheduling, critical_path).
templatesPartial<GanttTemplates>Merged into gantt.templates.
localestring | Record<string, any>Locale name or locale object.
themestringSkin name.
filter((task: Task) => boolean) | nullTask filter predicate.
resourceFilter((resource: any) => boolean) | nullResource filter predicate.
modalsGanttModals | nullOverrides built-in delete confirmation dialogs.
groupTasksanyGrouping config passed to gantt.groupBy.
inlineEditorsRecord<string, Component>Maps inline editor type names to Vue components.
customLightboxComponent | nullCustom Vue task editor component.
eventsVueGanttEventsEvent-name to handler map.

Data Collections And Synchronization

Use these props when Vue state is your source of truth:

  • tasks, links
  • optional advanced datasets: resources, resourceAssignments, baselines
<VueGantt
:tasks="tasks"
:links="links"
:resources="resources"
:resourceAssignments="resourceAssignments"
:baselines="baselines"
/>

Sync behavior summary:

  • task/link updates are usually diff-based
  • the wrapper can switch to reset/re-parse for large changes
  • advanced datasets are re-parsed through their datastores

For model selection and callback strategy, see Data Binding and State Management Basics.

Config, Templates, Plugins, Theme, Locale

Use these props for day-to-day chart setup without imperative API calls.

<script setup lang="ts">
const config = {
scales: [
{ unit: "year", step: 1, format: "%Y" },
{ unit: "month", step: 1, format: "%F" }
],
columns: [
{ name: "text", tree: true, width: "*" },
{ name: "start_date", align: "center" },
{ name: "duration", align: "center" },
{ name: "add", width: 44 }
]
};

const templates = {
task_text: (_start, _end, task) => `#${task.id}: ${task.text}`
};
</script>

<template>
<VueGantt
:config="config"
:templates="templates"
:plugins="{ auto_scheduling: true }"
theme="terrace"
locale="en"
/>
</template>

Events, Lifecycle, And Instance Access

events

Use one events map instead of wrapper-specific props for each Gantt event:

const events = {
onTaskCreated: task => {
console.log(task);
return true;
},
onBeforeLightbox: id => {
console.log(id);
return true;
}
};

The map is typed as VueGanttEvents. The wrapper declares the following known events with full type signatures; any other Gantt event name is also accepted (custom events are typed as string-keyed handlers).

EventSignatureNotes
onBeforeLightbox(taskId: string | number) => boolean | voidReturn false to suppress the built-in lightbox (for example to route to an external editor).
onTaskCreated(task: Task) => boolean | voidReturn false to cancel task creation.
onAfterTaskAdd(id: string | number, task: Task) => voidFires after a task is added.
onAfterTaskUpdate(id: string | number, task: Task) => voidFires after a task is updated.
onAfterTaskDelete(id: string | number, task: Task) => voidFires after a task is deleted.
onAfterLinkAdd(id: string | number, link: Link) => voidFires after a dependency link is added.
onAfterLinkUpdate(id: string | number, link: Link) => voidFires after a dependency link is updated.
onAfterLinkDelete(id: string | number, link: Link) => voidFires after a dependency link is deleted.

For the full Gantt event list (including events not enumerated above), see the Gantt events overview. Use defineGanttEvents(...) to author the map with autocomplete on these known events.

@ready

ready(instance) fires once after initialization and the first sync:

<VueGantt :events="events" @ready="onReady" />

instance Via Component Ref

import { ref } from "vue";
import type { VueGanttRef } from "@dhtmlx/trial-vue-gantt";

const ganttRef = ref<VueGanttRef | null>(null);

function showToday() {
ganttRef.value?.instance?.showDate(new Date());
}

Use this for advanced operations that are not practical through props.

Data Transport: load, save, batchSave

data prop shape:

interface VueGanttDataConfig {
load?: string | ((gantt: GanttStatic) => DataSet | Promise<DataSet>);
save?: string | RouterFunction;
batchSave?: (changes: BatchChanges) => void;
}

load

  • URL string -> gantt.load(url)
  • Function -> returns a sync or async dataset

save

Per-change callback or router transport via dataProcessor.

batchSave

Grouped callback for high-volume updates:

  • tasks
  • links
  • resources
  • resourceAssignments
const data = {
batchSave: changes => {
if (changes.tasks?.length) {
console.log("task changes", changes.tasks);
}
}
};

Use batchSave when one chart action can trigger many updates (for example auto-scheduling or bulk edits).

Customization Hooks

customLightbox

Replace the built-in task form UI with a Vue component.

inlineEditors

Map Gantt inline editor type names to Vue components.

modals

Override delete confirmations and call callback() to confirm deletion.

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

For practical examples, see Customization Patterns.

Grouping, Filtering, Resources, Calendars, Markers

These props are often used together in advanced timeline views:

<VueGantt
:groupTasks="groupConfig"
:filter="taskFilter"
:resourceFilter="resourceFilter"
:calendars="calendars"
:markers="markers"
:resources="resources"
:resourceAssignments="resourceAssignments"
/>

Common usage:

  • groupTasks for grouped views
  • filter and resourceFilter for focused slices
  • calendars and markers for schedule rules and timeline highlighting

Exported Helpers And Composables

The package exports both a default VueGantt component export and named exports.

From @dhtmlx/trial-vue-gantt or @dhx/vue-gantt:

Type Exports

Import every type from the wrapper package itself (@dhx/vue-gantt or @dhtmlx/trial-vue-gantt). The wrapper bundles the underlying Gantt engine and re-exports its types alongside the Vue-specific ones - there is no separate @dhx/gantt package to install or import from.

Wrapper-owned types

ExportDescription
SerializedTaskUser-facing task shape with Date | string dates. Use for store state, initial data, and save/batchSave payloads.
SerializedLinkUser-facing link shape. Use alongside SerializedTask in store state and data definitions.
VueGanttRefType of the value exposed via component ref - { instance: GanttStatic | null }.
VueGanttDataConfigShape of the data prop (load, save, batchSave).
BatchChangesArgument passed to data.batchSave - grouped tasks/links/resources/resourceAssignments changes.
DataCallbackChangeIndividual change entry inside a BatchChanges bucket - { entity, action, data, id }.
MarkerShape of items in the markers prop.
WrapperCalendarWrapper-friendly calendar shape accepted by the calendars prop (alongside raw CalendarConfig).
GanttModalsShape of the modals prop - onBeforeTaskDelete and onBeforeLinkDelete callback signatures.
CustomLightboxPropsProps received by your customLightbox component (data, onSave, onCancel, onDelete, ganttInstance).
InlineEditorComponentPropsProps received by your inline editor components (initialValue, task, save, cancel, ganttInstance).
VueGanttEventsType of the events prop - known events plus string-keyed custom events.

Frequently used types from the Gantt engine

The wrapper re-exports every type from the underlying Gantt engine. The ones below come up most often in wrapper code - each row maps a core type to where it shows up in the Vue API.

ExportWhere it appears in wrapper code
Task, LinkRuntime task/link shapes (include $-prefixed properties). Used inside event handlers, template callbacks, and filter functions.
GanttStaticType of ganttRef.value?.instance and the @ready argument.
GanttConfigOptionsShape of the object passed to the config prop.
GanttTemplatesShape of the object passed to the templates prop.
GanttPluginsShape of the object passed to the plugins prop.
CalendarConfigRaw Gantt calendar shape - alternative to WrapperCalendar in the calendars prop.

Every other type from the Gantt engine is also exported from the wrapper - if you can import a name from @dhx/gantt in the standalone library, you can import it from @dhx/vue-gantt here.

Use SerializedTask and SerializedLink for data you own (Pinia state, ref<>, API responses, initial literals). Use Task and Link for data gantt owns (inside event handlers, template callbacks, filter functions), where runtime task objects include internal $-prefixed properties.

Helper Factories

  • defineGanttConfig(config) for typed config authoring
  • defineGanttTemplates(templates) for typed template maps
  • defineGanttEvents(events) for typed event map authoring
  • defineInlineEditors(inlineEditors) for typed inline editor maps

These are TypeScript-only identity helpers - at runtime, defineGanttTemplates(x) returns x unchanged. You can skip them entirely without any behavior change. Their value is type preservation on object literals: you get autocomplete on templates.task_text, config.scales[0].unit, events.onAfterTaskAdd, etc., without manually annotating the variable.

If you skip them in TypeScript, either annotate the variable yourself or pass the literal inline on the prop:

// Option 1: explicit type annotation
const templates: Partial<GanttTemplates> = {
task_text: (_s, _e, task) => task.text
};

// Option 2: helper for autocomplete on the literal
const templates = defineGanttTemplates({
task_text: (_s, _e, task) => task.text
});

// Option 3: inline literal - inference works through the prop type
<VueGantt :templates="{ task_text: (_s, _e, task) => task.text }" />

Composables

The wrapper exposes five composables that wrap common instance-side calls in a ref-aware, lifecycle-safe form. Each one takes a Ref<VueGanttRef | null> so it can wait for the instance to become available.

useGanttActions(ganttRef)

Returns wrapper-safe imperative actions:

MethodSignatureNotes
undo()() => voidRequires plugins: { undo: true }.
redo()() => voidRequires plugins: { undo: true }.
render()() => voidForces a redraw - pair with instance.eachTask(...) for bulk mutations.
exportToPDF()() => voidRequires plugins: { export_api: true }.
exportToPNG()() => voidRequires plugins: { export_api: true }.
exportToExcel(config?)(config?: object) => voidRequires plugins: { export_api: true }. Pass exporter options through config.
exportToMSProject()() => voidRequires plugins: { export_api: true }.
import { ref } from "vue";
import { useGanttActions, type VueGanttRef } from "@dhtmlx/trial-vue-gantt";

const ganttRef = ref<VueGanttRef | null>(null);
const actions = useGanttActions(ganttRef);

const exportPdf = () => actions.exportToPDF();
const exportExcel = () => actions.exportToExcel({ visual: "base-colors" });

useWorkTime(ganttRef)

Returns a computed wrapper around the Gantt work-time API. Useful in templates and constraint calculations.

MethodSignature
isWorkTime({ date, task?, unit? })(args) => boolean
calculateEndDate({ start, duration, unit?, task? })(args) => Date
calculateDuration({ start, end, task? })(args) => number
getClosestWorkTime({ date, task?, unit, dir? })(args) => Date
import { useWorkTime, type VueGanttRef } from "@dhtmlx/trial-vue-gantt";

const ganttRef = ref<VueGanttRef | null>(null);
const workTime = useWorkTime(ganttRef);

const templates = {
scale_cell_class: (date: Date) =>
workTime.value.isWorkTime({ date }) ? "" : "weekend"
};

useGanttDatastore<T>(ganttRef, storeName)

Returns a computed reader for any Gantt datastore (for example "task", "link", "resource").

MethodSignature
getItem(id)(id: string | number) => T | null
getItems()() => T[]
hasChild(id)(id: string | number) => boolean
getChildren(id)(id: string | number) => (string | number)[]
import type { Task } from "@dhtmlx/trial-vue-gantt";
import { useGanttDatastore } from "@dhtmlx/trial-vue-gantt";

const taskStore = useGanttDatastore<Task>(ganttRef, "task");

const rootTasks = computed(() => taskStore.value.getChildren(0));

useResourceAssignments(ganttRef)

Returns a computed reader for resource/task assignment data.

MethodSignature
getResourceAssignments(resourceId, taskId?)(resourceId: string | number, taskId?: string | number) => any[]
getTaskResources(taskId)(taskId: string | number) => any[]
import { useResourceAssignments } from "@dhtmlx/trial-vue-gantt";

const assignments = useResourceAssignments(ganttRef);

const showAssignments = (resourceId: string | number) => {
console.log(assignments.value.getResourceAssignments(resourceId));
};

useGanttEvent(ganttRef, eventName, handler)

Attaches a single Gantt event with a lifecycle-safe lifetime. The handler is detached automatically on component unmount and re-attached if ganttRef, eventName, or handler change. Returns { detach } for manual control.

import { useGanttEvent } from "@dhtmlx/trial-vue-gantt";

const { detach } = useGanttEvent(ganttRef, "onTaskDblClick", id => {
console.log("dbl-click", id);
});

// Optional: detach early
// detach();

Use this when one-off listeners do not fit cleanly into the events map (for example listeners that need to update or unsubscribe based on local state).

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.