⊗jsrxPmATTRC 55 of 57 menu

Visualizzazione dei risultati del thunk nel componente in Redux

Nella lezione precedente abbiamo inviato una richiesta POST utilizzando il thunk addProduct. Ora visualizziamo i suoi risultati nel componente.

Apriamo la nostra applicazione dei prodotti, e in essa il file NewProductForm.jsx, poiché questo componente è responsabile per l'aggiunta di un nuovo prodotto. Guardiamo le righe con gli import. Sostituiamo l'import dell'azione productAdded, con l'import del thunk addProduct:

import { addProduct } from './productsSlice'

Ora, poiché non tracciamo nello slice lo stato 'pending' della richiesta, facciamo in modo che l'utente possa cliccare sul pulsante di salvataggio prodotto solo una volta, dato che non vogliamo le stesse richieste ripetute. Per fare questo, creiamo un altro stato locale:

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

Successivamente, dopo i gestori di eventi e prima della funzione onSaveProductClick scriviamo il codice in cui controlliamo se tutti i campi del modulo sono compilati e se lo stato della richiesta è 'idle':

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

Poi modificheremo il codice per onSaveProductClick. Innanzitutto sarà una funzione asincrona e verrà eseguita se la condizione sopra è vera:

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

Nonostante nello slice non tracciamo lo stato 'rejected', possiamo comunque stampare in console l'errore, per farlo useremo la costruzione try-catch. Qui aggiungeremo anche finally, per dopo l'esecuzione della richiesta reimpostare lo stato locale a 'idle':

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

Con i blocchi catch e finally abbiamo sistemato, scriviamo il codice per il blocco try. Qui imposteremo lo stato locale a 'in progress', finché non riceviamo una risposta come risultato dell'operazione del thunk, poi invieremo il nostro thunk addProduct. Usare la costruzione try-catch in base al tipo di risposta ci aiuterà la funzione RTK unwrap, che aggiunge alla promise restituita. Poi, se la richiesta ha avuto successo, impostiamo gli stati locali ai loro stati iniziali. Il codice completo per onSaveProductClick sarà così:

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('errore salvataggio prodotto: ', err) } finally { setRequestStatus('idle') } } }

Avviamo la nostra applicazione e proviamo ad aggiungere un nuovo prodotto. Come puoi vedere, in caso di richiesta riuscita i campi si puliscono e il nuovo prodotto viene aggiunto alla lista dei prodotti. Dai anche un'occhiata nel browser in Redux DevTools e naviga tra le sue schede, guarda le azioni e come cambia il tuo stato.

Apri la tua applicazione con gli studenti. Apri in essa il file NewStudentForm.jsx. Aggiungi un altro stato locale requestStatus, e impostalo inizialmente a 'idle'. Dopo aver preso visione del materiale della lezione, crea la variabile canBeSaved, con la quale il pulsante di salvataggio dei nuovi dati dello studente funzionerà/non funzionerà, in base al valore di requestStatus e alla compilazione dei campi.

Scrivi il codice asincrono per onSaveStudentClick, che cambierà il valore di requestStatus a seconda della situazione, invierà il thunk addProduct con i dati del nuovo studente, pulirà i campi in caso di richiesta riuscita e stamperà in console l'errore in caso di fallimento, come mostrato nella lezione. Usa per questo la costruzione try-catch e la funzione RTK unwrap.

Avvia la tua applicazione, aggiungi un nuovo studente e assicurati che tutto funzioni.

Italiano
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesia日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Utilizziamo i cookie per il funzionamento del sito, l'analisi e la personalizzazione. I dati vengono elaborati in conformità con la Politica sulla privacy.
accetta tutto personalizza rifiuta