React Gantt und Firebase-Integration
Dieses Tutorial beschreibt, wie man ein React Gantt Diagramm baut, das Aufgaben- und Verknüpfungsdaten über mehrere Clients in Echtzeit mit Firebase Firestore synchronisiert. Diese Funktion ist besonders nützlich für:
- Projektmanagement-Tools
- Team-Kollaborations-Apps
- Planungsplattformen, bei denen Multi-User-Synchronisation kritisch ist
Sie lernen, wie man:
- Firebase für Echtzeit-Updates einrichtet
- das Gantt-Diagramm initialisiert und rendert
- CRUD-Operationen (Erstellen, Lesen, Aktualisieren, Löschen) mit Live-Synchronisation durchführt
- Echtzeit-Änderungen im Gantt-Zustand effizient verarbeitet
Sie können das entsprechende Beispiel auf GitHub prüfen: DHTMLX React Gantt mit Firebase Firestore Demo.
Schritt 1: Projektsetup
Starten Sie damit, ein React + Vite-Projekt zu erstellen.
Um ein React-Projekt zu erstellen und in das Projektverzeichnis zu wechseln, führen Sie die folgenden Befehle aus:
npm create vite@latest react-gantt-firebase -- --template react-ts
cd react-gantt-firebase
Installieren Sie die erforderlichen Abhängigkeiten wie folgt:
npm install firebase
Installation von React Gantt
Installieren Sie React Gantt wie im React Gantt Installationsleitfaden.
In diesem Tutorial verwenden wir das Evaluierungspaket:
npm install @dhtmlx/trial-react-gantt
oder
yarn add @dhtmlx/trial-react-gantt
Wenn Sie bereits das Professional-Paket verwenden, ersetzen Sie @dhtmlx/trial-react-gantt durch @dhx/react-gantt in den Befehlen und Importen.
Schritt 2: Firebase konfigurieren
Erstellen Sie zunächst ein Firebase-Projekt, indem Sie die folgenden Schritte durchführen:
- Gehen Sie zur Firebase Console
- Klicken Sie auf Create a project
- Geben Sie den Projektnamen ein (z. B.
react-gantt-firebase) und folgen Sie den Anweisungen
Dann richten Sie Firestore ein, indem Sie die folgenden Schritte ausführen:
- Navigieren Sie zur Firestore Database im Dashboard Ihres Firebase-Projekts
- Klicken Sie auf Create database
- Wählen Sie Ihren bevorzugten Standort
- Starten Sie im test mode zur leichten Entwicklung (denken Sie daran, die Sicherheitsregeln vor der Produktion zu konfigurieren)
- Klicken Sie auf Create
Registrieren Sie anschließend Ihre Web-App wie folgt:
- Wählen Sie Project Overview in der linken Seitenleiste der Firebase Console
- Klicken Sie auf das Web-App-Symbol
</>, um eine neue Web-App zu registrieren - Geben Sie den App-Spitznamen ein (z. B.
react-gantt-firebase) - Aktivieren Sie Firebase Hosting
- Klicken Sie auf Register app
- Kopieren Sie die generierte Firebase-Konfiguration (Sie verwenden sie in Ihrem Projekt)
Schlussendlich konfigurieren Sie Firebase in Ihrem Projekt wie unten beschrieben:
- Fügen Sie Ihre Firebase-Konfiguration in die Datei
.envwie folgt ein:
VITE_FIREBASE_CONFIGURATION = {
"apiKey": "YOUR_API_KEY",
"authDomain":"react-gantt-firebase.firebaseapp.com",
"projectId": "react-gantt-firebase",
"storageBucket": "react-gantt-firebase.firebasestorage.app",
"messagingSenderId": "693536970600",
"appId": "1:693536970600:web:1b3fa4e4b032acaab368dd"
}
Ersetzen Sie den Platzhalter YOUR_API_KEY durch Ihre tatsächlichen Firebase-Projektdaten.
- Erstellen Sie eine neue Datei firebase.ts und initialisieren Sie Firebase und Firestore. Exportieren Sie außerdem Referenzen zu Sammlungen, wie unten gezeigt:
import { initializeApp } from "firebase/app";
import { getFirestore, collection, query } from "firebase/firestore";
const firebaseConfig = JSON.parse(import.meta.env.VITE_FIREBASE_CONFIGURATION);
initializeApp(firebaseConfig);
const db = getFirestore();
const tasksCollection = collection(db, "tasks");
const linksCollection = collection(db, "links");
const tasksQuery = query(tasksCollection);
const linksQuery = query(linksCollection);
export { db, tasksQuery, linksQuery, tasksCollection, linksCollection };
Schritt 3: Erstellung der Gantt-Komponente
Zu Beginn richten Sie die Kern-Gantt-Komponente mit React-State für Tasks und Links mit der folgenden Konfiguration ein:
const [tasks, setTasks] = useState<Task[]>([]);
const [links, setLinks] = useState<Link[]>([]);
const templates: GanttTemplates = {
parse_date: (date) => new Date(date),
format_date: (dateString) => dateString.toISOString(),
};
const config: GanttConfig = {
auto_scheduling: true,
};
Im obigen Snippet:
- Templates
Templates ermöglichen es uns, zu steuern, wie Daten in der Gantt-Komponente geparst und formatiert werden.
Da Firestore Daten als Strings speichert, müssen wir sie wieder in Date-Objekte konvertieren (parse_date) und korrekt für die Speicherung formatieren (format_date).
- Config
Die auto_scheduling-Option ermöglicht eine automatische Neuberechnung abhängiger Aufgaben, wenn eine übergeordnete Aufgabe verschoben oder geändert wird.
Dies ist nützlich für Szenarien im Projektmanagement.
Erstellen Sie nun State-Handler, um den internen Zustand der Gantt-Komponente wie folgt zu verwalten:
const createStateHandlers = <T extends { id: string | number }>(
setState: React.Dispatch<React.SetStateAction<T[]>>
): EntityHandler<T> => ({
added: (item) => setState((prev) => (prev.find((i) => i.id === item.id) ? prev : [...prev, item])),
modified: (item) => setState((prev) => prev.map((i) => (i.id === item.id ? { ...i, ...item } : i))),
removed: (item) => setState((prev) => prev.filter((i) => i.id !== item.id)),
});
const taskHandlers = createStateHandlers<Task>(setTasks);
const linkHandlers = createStateHandlers<Link>(setLinks);
Dies bietet eine einheitliche Methode, den lokalen Zustand zu aktualisieren, wenn Firebase-Daten sich ändern.
Da wir mit zwei Entitätstypen arbeiten – Tasks und Links – können wir eine einheitliche Konfigurationsstruktur erstellen, um beide zu handhaben, statt den Code zu duplizieren. Dieses Objekt ordnet jeden Entitätstyp seiner Firestore-Sammlung, dem API-Pfad und den State-Handlern zu. Unten sehen Sie den Codeausschnitt:
const entityConfig = {
task: {
collection: tasksCollection,
path: "tasks",
handlers: taskHandlers,
},
link: {
collection: linksCollection,
path: "links",
handlers: linkHandlers,
},
};
Projektstruktur-Übersicht
Sie können die Übersicht der resultierenden Projektstruktur in folgendem Scheme prüfen:
src/
├── App.tsx # Einstiegspunkt
├── App.css # Stile
├── components/
│ └── Gantt/
│ ├── Gantt.tsx # Hauptlogik