Senden von Daten mit Thunk in Redux
In der letzten Lektion haben wir die Behandlung einer POST-Anfrage auf unserem Fake-Server besprochen. Lasst uns jetzt eine Thunk-Funktion schreiben, die die Anfrage an den Server sendet.
Wir öffnen unsere Produktanwendung und darin
die Datei productsSlice.js. Jetzt werden wir nach
dem Thunk fetchProducts mit Hilfe von
createAsyncThunk einen Thunk
addProduct erstellen:
export const addProduct = createAsyncThunk()
Als ersten Parameter übergeben wir an createAsyncThunk
'products/addProduct', und als zweiten einen asynchronen
Callback, der ein Objekt mit den Daten
des neuen Produkts entgegennimmt:
export const addProduct = createAsyncThunk(
'products/addProduct',
async (newProduct) => {}
)
Im Code dieses Callbacks rufen wir den Client auf, übergeben ihm als Parameter den Pfad und das Objekt mit dem Produkt, und geben dann die Antwortdaten zurück:
export const addProduct = createAsyncThunk(
'products/addProduct',
async (newProduct) => {
const response = await client.post('/fakeServer/products', newProduct)
return response.data
}
)
Schauen wir uns nun weiter unten im Code das Feld reducers
für productsSlice an. Früher haben wir ein
neues Produkt mit dem Reducer productAdded hinzugefügt,
in dem wir die Methoden reducer und prepare hatten. Jetzt generieren wir die
erforderlichen Daten auf dem Server und arbeiten
mit Thunk, daher entfernen wir hier vollständig
den Reducer productAdded aus dem Code. Und dann fügen wir am
Ende seines Codes in die Methode extraReducers einen weiteren
zusätzlichen Reducer hinzu, der im Falle
einer erfolgreichen Anfrage den Slice
products um ein neues Produkt direkt aus der payload
der Action erweitert (wir erinnern uns, dass solcher Code
nur dank des einzigartigen createSlice möglich ist):
.addCase(addProduct.fulfilled, (state, action) => {
state.products.push(action.payload)
})
Ja, übrigens, vergessen Sie nicht, nanoid aus
den Importzeilen zu entfernen, und productAdded aus dem Export
der Actions am Ende der Datei.
Öffnen Sie Ihre Studentenanwendung.
Öffnen Sie darin die Datei studentsSlice.js. Erstellen Sie
mit Hilfe von createAsyncThunk einen weiteren
Thunk addStudent, der eine
POST-Anfrage an den Server sendet, um einen neuen
Studenten hinzuzufügen, wie in der Lektion gezeigt.
Nehmen Sie anschließend unten Änderungen
für studentsSlice vor: Entfernen Sie vollständig
den Reducer studentAdded in der Eigenschaft reducers.
Und fügen Sie im Feld extraReducers einen zusätzlichen
Reducer hinzu, der im Falle einer erfolgreichen Anfrage
einen neuen Studenten in den Slice students aus der
payload der Action hinzufügt,
wie in der Lektion gezeigt.