⊗jsrxPmATRS 50 of 57 menu

Pyyntötilan käyttö Reduxissa

Aikaisemmissa oppitunneissa kuvasimme lisäreduce­reiden avulla, mitä sovelluksemme tekee, jos fetchProducts lähettää pyynnön yhteydessä actionit pending, fulfilled ja rejected. Nyt voimme näyttää käyttäjälle, millä vaiheessa tietojen lataus tällä hetkellä on.

Avataan tuotesovelluksemme ja sen tiedosto ProductsList.jsx. Ensimmäiseksi luomme erillisen komponentin tuotekortille ProductCard. Teemme tämän heti import-rivien jälkeen ennen funktiota ProductsList. Annamme sille propsina product:

const ProductCard = ({ product }) => { return () }

Ja nyt siirrämme tyhjiin pyöreisiin sulkeisiin return kaiken tuotetietojen näyttämiseen tarkoitetun koodin kohteesta dispProducts:

const ProductCard = ({ product }) => { return ( <div key={product.id} className="product-excerpt"> <h3>{product.name}</h3> <SellerOfProd sellerId={product.seller} /> <p>{product.desc.substring(0, 100)}</p> <UserReactions product={product} /> <Link to={`/products/${product.id}`} className="link-btn"> view </Link> </div> ) }

Ja poistamme ProductsList:stä jäljelle jääneen koodirivin. Sitä ei enää tarvita:

const dispProducts = products.map((product) => ())

Ja nyt funktion ProductsList koodin alussa luomme muutaman muuttujan, error ja content. Ensimmäinen on virhettä varten, toiseen tallennamme eri sisältöä pyynnön tilasta riippuen. Teemme tämän ennen const dataFetch = useRef(false):

const error = useSelector((state) => state.products.error) let content

Nyt ennen komponentin ProductsList return -komentoa kirjoitetaan koodilohko ehdoilla, joilla content:iin tallennetaan erilaista sisältöä tilasta riippuen. Ensimmäisenä kuvailemme tilan 'in progress' - kun pyyntömme on lähetetty. Tässä tapauksessa ilmoitamme käyttäjälle, että tietoja ladataan:

if (productStatus === 'in progress') { content = <p>Tuotelistaa ladataan ...</p> }

Jos lataus onnistui (merkitsimme sitä 'success':ina), meidän on näytettävä haettujen tuotteiden lista. Näytämme sen map:lla käyttäen ProductCard -komponenttia, jolle annamme propksena product:

if (productStatus === 'in progress') { content = <p>Tuotelistaa ladataan ...</p> } else if (productStatus === 'success') { content = products.map((product) => ( <ProductCard key={product.id} product={product} /> )) }

Ja viimeinen tila, joka meillä on - se on 'fail'. Lisätään se myös. Käytetään tässä muttujaa error, johon yllä kirjoitimme virheen statesta:

if (productStatus === 'in progress') { content = <p>Tuotelistaa ladataan ...</p> } else if (productStatus === 'success') { content = products.map((product) => ( <ProductCard key={product.id} product={product} /> )) } else if (productStatus === 'fail') { content = <div>{error}</div> }

Ja viimeisenä vaiheena return:ia varten olevassa koodilohkossa korvaamme vanhan {dispProducts} kohteella {content}.

Käynnistetään sovelluksemme, klikataan valikossa kohtea 'Products'. Kaikki toimii. Näemme, että noin 2 sekunnin ajan (kuten palvelimella asetimme) lomakkeen alla on teksti 'Tuotelistaa ladataan ...', jonka jälkeen tuotelista ilmestyy.

Avaa opiskelijasovelluksesi. Avaa sen tiedosto StudentsList.jsx. Luo siihen uusi komponentti StudentCard. Siirrä siihen koodi kohteesta dispStudents, kuten oppitunnilla näytetään.

Luo funktiossa StudentsList muttujat error ja content. Anna muttujalle content sisältöä pyynnön tilasta riippuen. Älä unohda korvata palautetussa merkinnässä vanha dispStudents kohteella content.

Suomi
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Käytämme evästeitä verkkosivuston toiminnalle, analytiikalle ja personoinnille. Tietojen käsittely tapahtuu Tietosuojakäytännön mukaisesti.
hyväksy kaikki mukauta hylkää