Zum Hauptinhalt springen

Datenbindung & Zustandsverwaltung im React Scheduler

Der React Scheduler unterstützt zwei Muster der Datenbindung:

  1. React-Zustand als Quelle der Wahrheit (empfohlen für die meisten React-Apps)
  2. Scheduler als Quelle der Wahrheit (nützlich für spezialisierte, Hochdurchsatz-Fälle)

Beide Modelle sind gültig. Wählen Sie pro Bildschirm ein Modell und halten Sie es konsistent.

Wenn Sie noch kein einfaches Diagramm gerendert haben, beginnen Sie mit dem Schneller Einstieg.

Datenmodelle​

React-Zustand als Quelle der Wahrheit (empfohlen)​

In diesem Modell:

  • speichern Sie events (und oft view / date) im React-Zustand oder in einem Zustand-Manager
  • übergeben Sie diesen Zustand als Props an <ReactScheduler />
  • Scheduler ruft data.save / data.batchSave auf, wenn Benutzer Daten bearbeiten
  • Sie aktualisieren den Zustand, und React rendert den Scheduler erneut mit den neuen Props

Verwenden Sie dies, wenn andere React-Komponenten mit Scheduler-Daten synchronisiert bleiben müssen.

Scheduler als Quelle der Wahrheit​

In diesem Modell:

  • Scheduler lädt und ändert Daten intern
  • Sie geben Bearbeitungen optional an Backend-Endpunkte weiter
  • React spiegelt nicht jedes Ereignis-Update im Zustand wider

Verwenden Sie dieses Modell, wenn React nicht jedes einzelne Scheduler-Update sofort widerspiegeln muss.

React-Zustand als Quelle der Wahrheit​

Minimalbeispiel​

import { useMemo, useState } from "react";
import ReactScheduler, { type Event } from "@dhtmlx/trial-react-scheduler";
import "@dhtmlx/trial-react-scheduler/dist/react-scheduler.css";

import { seedEvents } from "./seed/data";

export default function ReactStateScheduler() {
const [events, setEvents] = useState<Event[]>(seedEvents);

const data = useMemo(
() => ({
save: (entity: string, action: string, item: Event, id: string | number) => {
if (entity !== "event") return;

if (action === "create") {
setEvents((prev) => [...prev, item]);
return;
}

if (action === "update") {
setEvents((prev) => prev.map((e) => (e.id === id ? item : e)));
return;
}

if (action === "delete") {
setEvents((prev) => prev.filter((e) => e.id !== id));
}
},
}),
[]
);

return (
<div style={{ height: "100vh" }}>
<ReactScheduler events={events} data={data} />
</div>
);
}

Dieses Muster macht React zum zentralen Eigentümer der Ereignisdaten.

Behandlung von Aktualisierungen mit data.save​

data.save wird bei jeder Benutzeränderung aufgerufen:

(entity: string, action: string, item: any, id: string | number) => void | Promise<any>

Für Scheduler-Ereignis-CRUD:

  • entity ist "event"
  • action ist "create" | "update" | "delete"
  • item ist das erstellte/aktualisierte/gelöschte Ereignis
  • id ist die betroffene Ereignis-ID

Backend-orientiertes Beispiel​

const data = {
save: async (entity: string, action: string, item: any, id: string | number) => {
if (entity !== "event") return;

if (action === "create") {
const response = await fetch("/api/events", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(item),
});

const created = await response.json();
return { id: created.id };
}

if (action === "update") {
await fetch(`/api/events/${id}`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(item),
});
return;
}

if (action === "delete") {
await fetch(`/api/events/${id}`, { method: "DELETE" });
}
},
};

Wenn Ihr Backend temporäre IDs bei der Erstellung ersetzt, geben Sie { id: realId } zurück, damit Scheduler Client- und Server-IDs abgleichen kann.

Massenaktualisierungen mit data.batchSave​

data.batchSave ist sinnvoll, wenn viele Änderungen in kurzer Zeit auftreten (zum Beispiel bei dichten Bearbeitungssitzungen).

Verwenden Sie es, wenn Sie möchten:

  • Anfragenanzahl reduzieren, indem gruppierte Änderungen gesendet werden
  • Aktualisierungen in einer einzigen Reduzer-/Store-Transaktion verarbeiten
<ReactScheduler
events={events}
data={{
batchSave: async (changes) => {
await fetch("/api/events/batch", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(changes),
});
},
}}
/>

Verwenden Sie save für einfache Änderungslogik pro Änderung und batchSave für gruppierte Synchronisierung.

Laden von Daten in den React-Zustand​

Im vom React getriebenen Modell bezieht Scheduler Daten aus dem React-Zustand. Häufige Quellen:

  • lokaler Komponenten-Zustand
  • globaler Zustand-Manager (Redux Toolkit, Zustand, MobX, XState, Jotai, Valtio)
  • API-Aufrufe

Lokaler Zustandsquelle​

import { useState } from "react";
import ReactScheduler, { type Event } from "@dhtmlx/trial-react-scheduler";
import { seedEvents, seedView, seedDate } from "./seed/data";

export default function LocalStateExample() {
const [events] = useState<Event[]>(seedEvents);

return (
<ReactScheduler
events={events}
view={seedView}
date={seedDate}
/>
);
}

Zustand-Manager-Quelle​

Jede Bibliothek folgt dem gleichen Ablauf:

  • Selektor/Hook liest den Zustand
  • Props füttern den Scheduler
  • data.save löst Aktionen/Store-Mutationen aus
const events = useSchedulerStore((s) => s.events);
const onSave = useSchedulerStore((s) => s.handleSave);

<ReactScheduler events={events} data={{ save: onSave }} />;

Zustand-Manager-Tutorials:

API-Ladequelle​

import { useEffect, useState } from "react";
import ReactScheduler, { type Event } from "@dhtmlx/trial-react-scheduler";

export default function SchedulerWithApi() {
const [events, setEvents] = useState<Event[] | null>(null);

useEffect(() => {
let disposed = false;

(async () => {
const response = await fetch("/api/events");
const payload = await response.json();
if (!disposed) setEvents(payload.events || []);
})();

return () => {
disposed = true;
};
}, []);

if (!events) return <div>Loading Scheduler...</div>;

return <ReactScheduler events={events} />;
}

Scheduler als Quelle der Wahrheit​

In diesem Modus rendert React die Komponente, hält jedoch keinen kanonischen Ereigniszustand.

URL-Transportbeispiel​

<ReactScheduler
data={{
load: "/api/scheduler/load",
save: "/api/scheduler/save",
}}
/>

Callback-Transportbeispiel​

<ReactScheduler
data={{
load: async () => {
const response = await fetch("/api/scheduler/load");
return response.json();
},
save: async (entity, action, item, id) => {
await fetch("/api/scheduler/save", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ entity, action, item, id }),
});
},
}}
/>

Verwenden Sie diesen Ansatz, wenn Scheduler den primären Laufzeitspeicher bleiben kann und React nicht jedes einzelne Update rendern muss.

Das richtige Modell auswählen​

Verwenden Sie das von React getriebene Modell, wenn:

  • mehrere React-Komponenten von Scheduler-Daten abhängen
  • Sie eine vorhersehbare globale Zustandsintegration benötigen
  • Sie eine klare Undo/Redo-Funktion im App-Zustand wünschen

Verwenden Sie das vom Scheduler getriebene Modell, wenn:

  • React größtenteils als Shell/Layout fungiert
  • Sie bevorzugen Scheduler-gesteuerte Laufzeitmutationen
  • der Server-Transport der primäre Synchronisationsmechanismus ist

Was kommt als Nächstes​

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.