⊗jsrxPmATTRC 55 of 57 menu

Vertoon die resultate van thunk-werk in 'n komponent in Redux

In die vorige les het ons 'n POST-versoek gestuur met behulp van die thunk addProduct. Laat ons nou die resultate van sy werk in die komponent vertoon.

Maak ons toepassing met produkte oop, en daarin die lêer NewProductForm.jsx, aangesien hierdie komponent verantwoordelik is vir die byvoeging van 'n nuwe produk. Laat ons kyk na die reëls met die invoere. Vervang die invoer van die aksie productAdded, met die invoer van die thunk addProduct:

import { addProduct } from './productsSlice'

Nou, aangesien ons nie die status 'pending' van die versoek in die skyfie volg nie, laat ons dit so maak, sodat die gebruiker die knoppie met die bewaring van die produk net een keer kan druk, want ons het nie dieselfde herhalende versoeke nodig nie. Om dit te doen, skep ons nog 'n plaaslike staat:

const [requestStatus, setRequestStatus] = useState('idle')

Daarna, na die verwerkers en voor die funksie onSaveProductClick, skryf ons kode waarin ons sal kontroleer of alle velde van die vorm deur ons gevul is en of die versoekstatus in 'idle' is:

const canBeSaved = [name, desc, price, amount, sellerId].every(Boolean) && requestStatus === 'idle'

Dan sal ons die kode vir onSaveProductClick verander. Eerstens sal dit 'n asinchrone funksie wees en dit sal uitgevoer word, as die bogenoemde voorwaarde waar is:

const onSaveProductClick = async () => { if (canBeSaved) {} }

Ondanks die feit dat ons nie die status 'rejected' in die skyfie volg nie, kan ons steeds 'n fout in die konsole vertoon, vir dit sal ons gebruik maak van die konstruksie try-catch. Ook hier sal ons nog finally byvoeg, om na die uitvoering van die versoek weer die plaaslike staat op 'idle' te stel:

const onSaveProductClick = async () => { if (canBeSaved) { try { } catch (err) { console.error('save product error: ', err) } finally { setRequestStatus('idle') } } }

Met die catch en finally blokke het ons klaar, laat ons die kode vir die try blok skryf. Hier sal ons die plaaslike status op 'in progress' stel, totdat 'n antwoord aan ons terugbesorg word as gevolg van die thunk se werk, dan stuur ons ons thunk addProduct. Om die try-catch konstruksie te gebruik, afhangende van die tipe antwoord, sal die RTK funksie unwrap ons help, wat dit by die terugbesorgde belofte voeg. Dan, as die versoek suksesvol was, stel ons die plaaslike state in hul beginstate. Die volle kode vir onSaveProductClick sal so lyk:

const onSaveProductClick = async () => { if (canBeSaved) { try { setRequestStatus('in progress') await dispatch( addProduct({ name, desc, price, amount, seller: sellerId })).unwrap() setName('') setDesc('') setPrice(0) setAmount(0) setSellerId('') } catch (err) { console.error('save product error: ', err) } finally { setRequestStatus('idle') } } }

Laat ons ons toepassing begin en probeer om 'n nuwe produk by te voeg. Soos jy kan sien, in die geval van 'n suksesvolle versoek word die velde skoongemaak en die nuwe produk bygevoeg in die lys van produkte. Kyk ook in die blaaier in Redux DevTools en beweeg tussen sy oortjies, kyk na die aksies en hoe jou staat verander.

Maak jou toepassing met studente oop. Maak daarin die lêer NewStudentForm.jsx oop. Voeg nog 'n plaaslike staat requestStatus by, en stel dit aanvanklik op 'idle'. Deur die materiaal van die les te bestudeer, skep die veranderlike canBeSaved, waarmee die knoppie vir die bewaring van nuwe studentedata sal werk/nie werk nie, afhangende van die waarde van requestStatus en van die vul van die velde.

Skryf asinchrone kode vir onSaveStudentClick, wat die waarde van requestStatus sal verander volgens die situasie, die thunk addProduct sal stuur met die data van die nuwe student, die velde sal skoonmaak in die geval van 'n suksesvolle versoek en 'n fout in die konsole sal vertoon in die geval van mislukking, soos getoon in die les. Gebruik hiervoor die konstruksie try-catch en die RTK funksie unwrap.

Begin jou toepassing, voeg 'n nuwe student by en maak seker dat alles werk.

Afrikaans
AzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Ons gebruik koekies vir die werking van die webwerf, ontleding en personalisering. Die verwerking van data geskied volgens die Privaatheidsbeleid.
aanvaar alles instel verwerp