⊗jsrxPmATRS 50 of 57 menu

Aplicação do status da requisição no Redux

Nas lições anteriores, usamos redutores adicionais para descrever o que nossa aplicação deve fazer se fetchProducts despacha as ações pending, fulfilled e rejected durante uma requisição. Agora podemos mostrar ao usuário em qual estágio a carga de dados está no momento.

Vamos abrir nossa aplicação de produtos, e nela o arquivo ProductsList.jsx. A primeira coisa que faremos é criar um componente separado para o cartão do produto ProductCard. Faremos isso logo após as linhas de importação, antes da função ProductsList. Passaremos product para ele como prop:

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

E agora, nos parênteses vazios do return transferiremos todo o código para exibir os dados do produto de 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> ) }

E removeremos em ProductsList a linha de código restante. Ela não é mais necessária:

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

E agora, no início do código da função ProductsList criaremos mais algumas variáveis, error e content. A primeira será para o erro, na segunda registraremos um ou outro conteúdo dependendo do status da requisição. Faremos isso antes de const dataFetch = useRef(false):

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

Agora, antes do comando return do componente ProductsList, escreveremos um bloco de código com condições sob as quais em content será registrado um ou outro conteúdo dependendo do status. Primeiro, descreveremos o status 'in progress' - quando nossa requisição é enviada. Neste caso, informaremos ao usuário que os dados estão sendo carregados:

if (productStatus === 'in progress') { content = <p>Carregando lista de produtos ...</p> }

Se nosso carregamento for bem-sucedido (denotamos isso como 'success'), então precisamos exibir a lista de produtos obtidos. Vamos exibi-la no map usando o componente ProductCard, ao qual passaremos product como prop:

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

E o último status que temos - é 'fail'. Vamos adicioná-lo também. Usaremos aqui a variável error, na qual registramos anteriormente o erro do estado:

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

E como último passo, no bloco de código para return substituiremos o antigo {dispProducts} por {content}.

Vamos executar nossa aplicação, clicar no menu em 'Products'. Tudo funciona. Vemos que por aproximadamente 2 segundos (como configuramos no servidor) temos a mensagem 'Products list loading ...' pendurada sob o formulário de adição de produto, e depois a lista de produtos aparece.

Abra sua aplicação de estudantes. Abra nela o arquivo StudentsList.jsx. Crie nele um novo componente StudentCard. Transfira para ele o código de dispStudents, como mostrado na lição.

Crie na função StudentsList as variáveis error e content. Atribua à variável content o conteúdo dependendo do status da requisição. Não se esqueça de substituir no retorno do JSX o antigo dispStudents por content.

Português
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Nós usamos cookies para o funcionamento do site, análises e personalização. O processamento de dados é realizado de acordo com a Política de Privacidade.
aceitar todas configurar rejeitar