Datenübertragung mit RTK-Abfrage: Ein Praxisleitfaden zu Mutationen
Erfahren Sie, wie Sie builder.mutation() in RTK Query verwenden können, um POST-Anfragen zu senden, Lade- und Fehlerzustände zu verwalten sowie ein funktionsfähiges Formularkomponente zu erstellen.
Einführung
Zuvor haben wir erklärt, wie man Redux Toolkit Query (RTK Query) einrichtet und Leseoperationen mit builder.query() ausführt. Dadurch konnten wir Daten von einer API abrufen und sie in einer React-App anzeigen, ohne selbst useEffect(), useState() oder eigene Fetch-Logik schreiben zu müssen.
Das Lesen von Daten ist jedoch nur die halbe Miete bei der Arbeit mit APIs. Die meisten Anwendungen benötigen außerdem Möglichkeiten, Aufzeichnungen auf dem Server hinzuzufügen, zu ändern oder zu löschen.
Betrachten wir einige gängige Szenarien:
- Ein Registrierungsformular sendet neue Kontodaten.
- Eine Anmeldeseite übermittelt Zugangsdaten zur Überprüfung.
- Eine Blog-Plattform veröffentlicht neue Artikel.
- Ein Online-Shop platziert neue Bestellungen.
- Eine To-Do-App speichert neu hinzugefügte Aufgaben.
Jede dieser Aktionen überträgt Informationen vom Client zum Server, und das geschieht in der Regel über eine HTTP POST-Anfrage.
RTK Query betrachtet POST-Aufrufe nicht als Abfragen – es behandelt sie als Mutationen.
In diesem Artikel wird Schritt für Schritt gezeigt, wie Daten mit builder.mutation() gesendet werden. Wir zerlegen jeden Codeabschnitt sowie jede Konfigurationseinstellung, damit Sie nicht nur verstehen, was eingegeben werden muss, sondern auch warum jeder Teil wichtig ist.
Verständnis der HTTP-Methoden
Bevor man sich dem Code widmet, ist es hilfreich, die verschiedenen HTTP-Verben und deren Zweck zu überprüfen.
Eine typische REST API stellt mehrere Operationen zur Verfügung:
| Method | Zweck | Beispiel |
|---|---|---|
| GET | Daten lesen | Sämtliche Benutzer abrufen |
| POST | Neuere Daten hinzufügen |
Dieser Leitfaden konzentriert sich auf POST, die Methode zur Erstellung neuer Ressourcen auf einem Server.
Warum verwendet POST nicht builder.query()?
Das ist ein häufiger Punkt der Verwirrung für Anfänger.
Wenn builder.query() Daten abrufen kann, warum kann dieselbe Funktion keine Daten an den Server senden?
Der Grund liegt darin, wofür jedes Werkzeug konzipiert ist.
Abfragen
Abfragen dienen dazu, Informationen abzurufen.
Typische Beispiele:
- Benutzer abrufen
- Produkte abrufen
- Bestellungen abrufen
- Beiträge abrufen
Weil dieselben Daten möglicherweise wiederholt angefordert werden, speichern Abfragen ihre Ergebnisse automatisch im Cache.
Mutationen
Mutationen dienen dazu, Daten zu ändern.
Typische Beispiele:
- Nutzer erstellen
- Nutzer aktualisieren
- Nutzer löschen
- Einloggen
- Sich registrieren
Eine Mutation signalisiert dem Server, dass sich etwas ändern muss.
Genau aus diesem Grund behandelt RTK Query Mutationen getrennt von normalen Abfragen.
Was wir bauen werden
Wir werden ein einfaches Formular erstellen, das einen neuen Benutzer an den Server sendet.
Die Ziel-Endpunkt-Adresse lautet:
https://jsonplaceholder.typicode.com/users
Und die im Anfragekörper gesendete Payload wird wie folgt aussehen:
{
"name": "John Doe",
"email": "john@example.com"
}
Projektstruktur
src
│
├── app
│ └── store.js
│
├── services
│ └── api.js
│
├── components
│ └── AddUser.jsx
│
├── App.jsx
│
└── main.jsx
Die Konfiguration des Redux-Stores bleibt unverändert wie zuvor. Alles, was wir hinzufügen müssen, ist ein Mutation-Endpunkt sowie eine Komponente, die die Formulareingaben verarbeitet.
Schritt 1 – Einen Mutation-Endpunkt erstellen
Öffnen Sie die Datei des API-Dienstes:
src/services/api.js
Fügen Sie anschließend die neue Endpunktdefinition innerhalb des endpoints-Objekts hinzu.
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
export const api = createApi({
reducerPath: "api", baseQuery: fetchBaseQuery({
baseUrl: "https://jsonplaceholder.typicode.com/",
}), endpoints: (builder) => ({ addUser: builder.mutation({ query: (newUser) => ({
url: "users",
method: "POST",
body: newUser,
}), }), }),});export const {
useAddUserMutation,
} = api;
Lassen Sie uns dies Zeile für Zeile durchgehen.
Verständnis von builder.mutation()
addUser: builder.mutation({
Während builder.query() zum Abrufen von Daten dient, wird builder.mutation() verwendet, wenn Sie etwas auf dem Server ändern müssen.
Häufige Anwendungsfälle:
- Anlegen von Benutzern
- Registrierung von Konten
- Anmelden
- Aktualisierung von Produkten
- Löschung von Beiträgen
Jedes Mal, wenn Ihre Anwendung Daten im Backend schreibt oder ändert, ist eine Mutation das richtige Werkzeug.
Verständnis von query()
query: (newUser) => ({
Diese Funktion erhält alle Daten, die Sie aus Ihrem React-Code an sie übergeben.
Zum Beispiel, wenn Sie folgendes senden:
addUser({
name: "John",
email: "john@example.com",
});
dann enthält der Parameter mit dem Namen
newUser
folgende Inhalte:
{
name: "John",
email: "john@example.com"
}
Dieses Objekt wird als Anfragekörper gesendet.
Verständnis der URL
url: "users",
Da die Basis-URL wie folgt konfiguriert ist:
https://jsonplaceholder.typicode.com/
RTK Query kombiniert sie automatisch zu:
https://jsonplaceholder.typicode.com/users
so müssen Sie die vollständige Adresse nie selbst eingeben.
Verständnis der Methode
method: "POST",
Diese Zeile weist RTK Query ausdrücklich an, eine POST-Anfrage zu senden. Wenn Sie sie weglassen, verwendet die Anfrage standardmäßig GET.
Verständnis des Körpers
body: newUser,
Alles, was in newUser gespeichert ist, wird als Anfrage-Payload weitergeleitet, zum Beispiel:
{
"name": "John",
"email": "john@example.com"
}
Der Server erhält dieses Objekt genau in dem Zustand, in dem es konstruiert wurde.
Schritt 2 – Exportieren des generierten Hooks
export const {
useAddUserMutation,
} = api;
Genauso wie Abfragen einen automatisch generierten Hook liefern
useGetUsersQuery()
erzeugen Mutationen automatisch ihren eigenen Hook:
useAddUserMutation()
Man schreibt diesen Hook niemals manuell – RTK Query erstellt ihn für einen auf der Grundlage des Endpunktnamens.
Schritt 3 – Erstellen der React-Komponente
Erstellen Sie eine neue Datei:
src/components/AddUser.jsx
und fügen Sie diesen Code hinzu:
import { useState } from "react";
import { useAddUserMutation } from "../services/api";const AddUser = () => { const [name, setName] = useState("");
const [email, setEmail] = useState(""); const [
addUser,
{
isLoading,
isSuccess,
error,
},
] = useAddUserMutation(); const handleSubmit = async (e) => { e.preventDefault(); await addUser({
name,
email,
}); setName("");
setEmail(""); }; return (
<form onSubmit={handleSubmit}> <input
type="text"
placeholder="Enter Name"
value={name}
onChange={(e) => setName(e.target.value)}
/> <input
type="email"
placeholder="Enter Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/> <button type="submit">
Add User
</button> {isLoading && <p>Saving...</p>} {isSuccess && <p>User Added Successfully.</p>} {error && <p>Something went wrong.</p>} </form>
);};export default AddUser;
Lassen Sie uns aufschlüsseln, was hier vor sich geht.
Verständnis von useAddUserMutation()
const [
addUser,
{
isLoading,
isSuccess,
error,
},
] = useAddUserMutation();
Im Gegensatz zu Abfruchooks liefern Mutationchooks ein Array anstelle eines Objekts. Das erste Element:
addUser
Es handelt sich um die Funktion, die aufgerufen wird, um die Anfrage auszulösen, während das zweite Element ein Objekt ist, das nützliche Statusinformationen zu dieser Anfrage enthält.
Verständnis von addUser()
await addUser({
name,
email,
});
Durch Aufruf dieser Funktion wird eine Anfrage wie folgt gesendet:
POST /users
mit einem JSON-Payload in dieser Form:
{
"name": "John",
"email": "john@example.com"
}
Auf der Backend-Seite wird dieser Payload verwendet, um ein völlig neues Benutzerkonto zu erstellen.
Verständnis der Mutationszustände
Neben der Auslösefunktion stellt RTK Query eine Reihe von Statusflaggen zur Verfügung, die beschreiben, was mit der Anfrage geschieht.
isLoading
isLoading
Diese Flagge wird auf true gesetzt, solange die Mutation noch ausgelöst wird, was sie ideal dafür macht, einen Absenden-Button zu deaktivieren oder einen Ladeindikator anzuzeigen, bis die Antwort zurückkommt.
isSuccess
isSuccess
Sobald die Anfrage fehlerfrei abgeschlossen ist, wird dieser Wert auf true gesetzt, was ein klares Signal dafür ist, eine Bestätigungsanzeige anzuzeigen oder den Benutzer an einen anderen Ort zu leiten.
error
error
Falls der Server mit einem Fehler antwortet, werden die Details hier angezeigt, sodass Sie einen lesbaren Fehler anzeigen können anstelle einer fehlerhaften Benutzeroberfläche.
Schritt 4 – Komponente rendern
Öffnen Sie die Hauptanwendungsdatei:
src/App.jsx
und ersetzen Sie ihren Inhalt durch Folgendes:
import AddUser from "./components/AddUser";
function App() {
return <AddUser />;
}export default App;
Dann starten Sie den Entwicklungsserver:
npm run dev
Füllen Sie die Formfelder aus und klicken Sie auf Add User – RTK Query kümmert sich darum, die POST-Anfrage für Sie abzusenden.
Vollständiger Anfragenfluss
Hier ist eine Zusammenfassung dessen, was im Hintergrund abläuft, von der Formulareingabe bis zur Aktualisierung des Zustands:
User Fills Form
│
▼
Clicks Submit
│
▼
addUser()
│
▼
Generated Mutation Hook
│
▼
RTK Query
│
▼
fetchBaseQuery()
│
▼
POST Request
│
▼
Server Response
│
▼
Mutation State Updates
│
▼
React Re-renders
Achten Sie auf alles, was in diesem Ablauf fehlt:
fetch()axios.post()useEffect()- Manuell verfolgter Ladezustand
- Manuell verfolgter Fehlerzustand
RTK Query kümmert sich im Hintergrund um all diese Aspekte.
builder.query() vs builder.mutation()
Es ist sehr wichtig zu wissen, wann man welche dieser Builder-Methoden verwenden sollte.
builder.query() dient dazu, Daten abzurufen – in der Regel über GET-Anfragen – und erzeugt Hooks wie useGetUsersQuery(), die automatisch ausgeführt werden, sobald das Komponente gerendert wird. builder.mutation() hingegen dient dazu, Daten mithilfe von Methoden wie POST, PUT, PATCH oder DELETE zu ändern. Er erzeugt Hooks wie useAddUserMutation(), die nur dann ausgeführt werden, wenn Sie explizit die Auslösfunktion aufrufen, anstatt beim Renderen. Kurz gesagt: Queries dienen dem Lesen, Mutationen dem Erstellen, Aktualisieren oder Löschen.
Das richtige Werkzeug für jede Aufgabe zu wählen, sorgt dafür, dass Ihre API-Logik konsistent bleibt und leicht verständlich ist.
Best Practices
Halten Sie diese Richtlinien stets im Hinterkopf, wenn Sie mit RTK Query POST-Funktionalität entwickeln:
- wählen Sie
builder.mutation(), wenn eine Operation Daten auf dem Server ändert.
isLoading, isSuccess und error, damit die Benutzeroberfläche reaktiv und informativ wirkt.addUser, createPost oder registerUser.unwrap(), falls Sie Erfolge und Fehler lieber mit einem try...catch-Block in Ihren Komponenten handhaben möchten.Kernpunkte
Durch das Durchgehen dieses Leitfadens haben Sie gelernt, wie man:
- eine Mutation mit
builder.mutation()einrichtet. - einen POST-Endpunkt innerhalb einer API-Slice verbindet.
- JSON-Daten an einen Backend-Service sendet.
useAddUserMutation().Dieses Muster kommt in Produktivanwendungen ständig vor – bei Registrierungsprozessen, Authentifizierung, Veröffentlichung von Blogbeiträgen, Bestellungen und unzähligen weiteren Szenarien zur Erstellung von Daten.
Was kommt als Nächstes?
Sobald Sie mit POST-Anfragen vertraut sind, ist der natürliche nächste Schritt das Erlernen, wie man bestehende Datensätze aktualisiert und löscht.
Der kommende Leitfaden behandelt:
- Die Aktualisierung von Datensätzen mit PUT- und PATCH-Anfragen.
- Das Löschen von Datensätzen über DELETE-Anfragen.
- Übermittlung dynamischer IDs an Mutation-Endpunkte.
- Außer Kraft Setzen von im Cache gespeicherten Daten, damit die Benutzeroberfläche automatisch aktualisiert wird.
- Nutzung von Tags –
providesTagsundinvalidatesTags– um alles synchron zu halten, ohne manuelles Nachladen.
Sobald Sie diesen Leitfaden beendet haben, sind Sie in der Lage, eine vollständige CRUD-Anwendung mithilfe von für die Produktion geeigneten RTK Query-Mustern zu erstellen.
Verwandte Artikel
- TypeScript 6.0’s Breaking Defaults: A Practical Migration Guide – Erfahren Sie, welche neun Compiler-Standardwerte in TypeScript 6.0 geändert wurden, wie Sie tsconfig für das Jahr 2026 konfigurieren und wie Sie Codebasen auf den auf Go basierenden TypeScript 7 vorbereiten.
- Die Standardeinstellungen für Full-Stack JavaScript im Jahr 2026: TypeScript, RSC und mehr — Erklärt, warum TypeScript, React Server Components sowie ein effizienterer Ansatz zur Zustandsverwaltung 2026 zum Standard für JavaScript-Entwicklerteams in der Produktion geworden sind.