Zum Hauptinhalt springen

dhtmlxGantt mit Vue.js

Hinweis

Dieses Tutorial zeigt, wie man das JS DHTMLX Gantt-Paket direkt in einer Vue-Anwendung ohne den offiziellen Wrapper verwendet.

Wenn du Vue-Props/Ereignisse, wrapper-verwaltete Synchronisation und wrapper-Komposables brauchst, benutze stattdessen Vue Gantt.

Diese Seite behandelt die Integration auf niedriger Ebene. Du initialisierst und verwaltest die Gantt-Instanz selbst.

Voraussetzungen​

  • Node.js installiert
  • Grundkenntnisse von Vue 3 (Komponenten, Refs, Lebenszyklus-Hooks)
  • Ein Vue 3-Projekt (dieses Tutorial zeigt, wie man eins mit Vite erstellt)

1. Erstelle ein Vue-Projekt​

Erstelle eine Vue 3-Anwendung mit Vite:

npm create vue@latest gantt-vue-app
cd gantt-vue-app

Installiere Abhängigkeiten und starte den Dev-Server einmal, um zu bestätigen, dass das Projekt funktioniert:

  • npm:
npm install
npm run dev
  • yarn:
yarn install
yarn dev

Die App sollte unter http://localhost:5173 erreichbar sein.

Gantt Vue app running

Beende den Dev-Server (Ctrl+C) vor dem nächsten Schritt.

2. Installiere das JS Gantt-Paket​

Professionelle Builds der JS Gantt-Bibliothek sind über private npm-Quellen verfügbar. Befolge die Installationsanleitung, um Zugriff zu erhalten.

Evaluations-Build (öffentliches Tutorial-Paket):

  • npm:
npm install @dhx/trial-gantt
  • yarn:
yarn add @dhx/trial-gantt

Professioneller Build (privates npm):

  • npm:
npm install @dhx/gantt
  • yarn:
yarn add @dhx/gantt

Du kannst Gantt auch aus einem lokalen Ordner installieren, weil das Paket als npm-Modul strukturiert ist.

3. Erstelle eine Gantt-Komponente​

Erstelle src/components/GanttView.vue und initialisiere Gantt in den Vue-Lifecycle-Hooks.

Falls du den Evaluations-Build installiert hast, verwende diese Importe:

src/components/GanttView.vue
<script setup lang="ts">
import { onBeforeUnmount, onMounted, ref } from "vue";
import { Gantt, type GanttStatic } from "@dhx/trial-gantt";
import "@dhx/trial-gantt/codebase/dhtmlxgantt.css";

const container = ref<HTMLElement | null>(null);
let gantt: GanttStatic | null = null;

onMounted(() => {
if (!container.value) return;

gantt = Gantt.getGanttInstance();
gantt.init(container.value);
});

onBeforeUnmount(() => {
gantt?.destructor();
gantt = null;
});
</script>

<template>
<div ref="container" className="gantt-host"></div>
</template>

<style>
.gantt-host {
width: 100%;
height: 600px;
}
</style>

Falls du den professionellen Build installiert hast, ersetze die Paket-Imports wie folgt:

import { Gantt, type GanttStatic } from "@dhx/gantt";
import "@dhx/gantt/codebase/dhtmlxgantt.css";

Wenn du Gantt aus einem lokalen Ordner-Paket installiert hast, sehen die Importe üblicherweise so aus:

import { Gantt, type GanttStatic } from "dhtmlx-gantt";
import "dhtmlx-gantt/codebase/dhtmlxgantt.css";

4. Die Gantt-Komponente in der App rendern​

Ersetze src/App.vue:

src/App.vue
<script setup lang="ts">
import GanttView from "./components/GanttView.vue";
</script>

<template>
<GanttView />
</template>

Damit die Grafik die Seitenhöhe nutzt, aktualisiere deine globalen Styles (zum Beispiel src/assets/main.css):

src/assets/main.css
html,
body,
#app {
width: 100%;
height: 100vh;
margin: 0;
padding: 0;
}

Starte die App erneut. Du solltest ein leeres Gantt-Diagramm sehen.

5. Daten bereitstellen​

Erstelle src/demo-data.ts:

src/demo-data.ts
export function getData() {
return {
data: [
{
id: 10,
text: "Project #1",
start_date: "2026-02-02 00:00",
duration: 6,
progress: 0.4,
open: true
},
{
id: 1,
text: "Task #1",
start_date: "2026-02-02 00:00",
duration: 2,
progress: 0.6,
parent: 10
},
{
id: 2,
text: "Task #2",
start_date: "2026-02-04 00:00",
duration: 3,
progress: 0.2,
parent: 10
}
],
links: [{ id: 1, source: 1, target: 2, type: "0" }]
};
}

Aktualisiere src/components/GanttView.vue und parse die Daten:

src/components/GanttView.vue
<script setup lang="ts">
import { onBeforeUnmount, onMounted, ref } from "vue";
import { Gantt, type GanttStatic } from "@dhx/trial-gantt";
import "@dhx/trial-gantt/codebase/dhtmlxgantt.css";
import { getData } from "../demo-data";

const container = ref<HTMLElement | null>(null);
let gantt: GanttStatic | null = null;

onMounted(() => {
if (!container.value) return;

gantt = Gantt.getGanttInstance();
gantt.config.date_format = "%Y-%m-%d %H:%i";
gantt.init(container.value);
gantt.parse(getData());
});

onBeforeUnmount(() => {
gantt?.destructor();
gantt = null;
});
</script>

<template>
<div ref="container" className="gantt-host"></div>
</template>

<style>
.gantt-host {
width: 100%;
height: 600px;
}
</style>

Lade die Seite neu. Du solltest ein Gantt-Diagramm mit Aufgaben und einer Abhängigkeitsverknüpfung sehen.

6. Änderungen erfassen und speichern​

Verwende einen dataProcessor, um Diagrammänderungen zu verarbeiten und an dein Backend zu senden.

Füge nach gantt.init(...) einen Handler hinzu:

gantt.createDataProcessor((entity, action, data, id) => {
console.log("[dp]", entity, action, data, id);
});

DHTMLX Gantt akzeptiert Promise-Antworten von dataProcessor-Handlern. Wenn dein Backend IDs beim Erstellen ändert, gib ein Objekt wie { id: newId } oder { tid: newId } zurück, damit Gantt den Datensatz neu abbilden kann.

Für vollständige Backend-Muster siehe server-side integration.

Ergebnis​

Du hast jetzt eine Vue-App mit direkter JS Gantt-Integration:

  • Vue besitzt den Komponentenlebenszyklus
  • dein Code initialisiert und zerstört die Gantt-Instanz
  • Daten werden mit gantt.parse(...) geladen
  • Änderungen können mit gantt.createDataProcessor(...) verarbeitet werden

Sicherheits-Hinweis​

Gantt schützt dein Backend nicht vor SQL-Injektion, XSS oder CSRF. Backend-Validierung, Autorisierung und Ausgabesäuberung bleiben deine Verantwortung.

Lies Application Security zu den wichtigsten Risikobereichen und Hinweisen zu deren Minderung.

Was Als Nächstes Zu Lesen Ist​

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.