1
resposta

Imagem dos pratos não aparecem na lista de restaurantes

em: http://localhost:3000/restaurantes

os pratos não estão exibindo na lista dos restaurantes

Lista de restaurantes sem exibir os pratos

ListaRestaurante.tsx

import { useEffect, useState } from 'react';
import IRestaurante from '../../interfaces/IRestaurante';
import style from './ListaRestaurantes.module.scss';
import Restaurante from './Restaurante';
import axios from 'axios';
import { IPaginacao } from '../../interfaces/IPaginacao';

const ListaRestaurantes = () => {

  const [restaurantes, setRestaurantes] = useState<IRestaurante[]>([])
  const [proximaPagina, setProximaPagina] = useState('')
  const [busca, setBusca] = useState('')

  const verMais = () => {
    axios.get<IPaginacao<IRestaurante>>(proximaPagina)
      .then((resposta) => {
        setRestaurantes([...restaurantes, ...resposta.data.results])
        setProximaPagina(resposta.data.next)
      }).catch((erro) => {
        console.log(erro)
      });
  }

  useEffect(() => {
    axios.get<IPaginacao<IRestaurante>>('http://localhost:8000/api/v1/restaurantes/', {
      params: {
        search: busca
      }
    })
      .then((resposta) => {
        setRestaurantes(resposta.data.results)
        setProximaPagina(resposta.data.next)
      }).catch((erro) => {
        console.log(erro)
      });
  }, [busca])

  return (
    <section className={style.ListaRestaurantes}>
      <h1>Os restaurantes mais <em>bacanas</em>!</h1>
      <form>
        <label>Pesquisar Restaurantes</label>
        <input value={busca} onChange={evento => setBusca(evento.target.value)} type='search' />
      </form>
      {restaurantes?.map(item => <Restaurante restaurante={item} key={item.id} />)}
      {proximaPagina && <button onClick={verMais}>Ver mais</button>}
    </section>
  )
}

export default ListaRestaurantes

Restaurante.tsx

import IRestaurante from '../../../interfaces/IRestaurante';
import Prato from '../Prato';
import estilos from './Restaurante.module.scss';

interface RestauranteProps {
  restaurante: IRestaurante
}

const Restaurante = ({ restaurante }: RestauranteProps) => {

  return (<section className={estilos.Restaurante}>
    <div className={estilos.Titulo}>
      <h2>{restaurante.nome}</h2>
    </div>
    <div>
      {restaurante.pratos?.map(item => <Prato prato={item} key={item.id} />)}
    </div>
  </section>)
}

export default Restaurante

não consigo encontrar onde estou errando para não exibir os pratos. não aparece nenhum erro no console

1 resposta

Oi, Vitor! Tudo certo?

O problema ocorre porque os pratos do restaurante não estão sendo carregados corretamente no objeto restaurante passado para o componente. Voce pode buscar os pratos separadamente ao renderizar o componente.

No seu arquivo indext do componente restaurante, você pode utilizar o useEffect junto com o axios para fazer a requisição e garantir que os dados sejam carregados.

import axios from 'axios';
import { useState, useEffect } from 'react';
import IPrato from '../../../interfaces/IPrato';
import IRestaurante from '../../../interfaces/IRestaurante';
import Prato from '../Prato';
import estilos from './Restaurante.module.scss';

interface RestauranteProps {
  restaurante: IRestaurante
}

const Restaurante = ({ restaurante }: RestauranteProps) => {
  const [pratos, setPratos] = useState<IPrato[]>([]);

  useEffect(() => {
  
    axios.get<IPrato[]>(`http://localhost:8000/api/v1/restaurantes/${restaurante.id}/pratos/`)
      .then(resposta => {
        setPratos(resposta.data);
      })
      .catch(erro => {
        console.error("Erro ao buscar pratos:", erro);
      });
  }, [restaurante.id]);

  return (
    <section className={estilos.Restaurante}>
      <div className={estilos.Titulo}>
        <h2>{restaurante.nome}</h2>
      </div>
      <div>
        {pratos.map(item => <Prato prato={item} key={item.id} />)}
      </div>
    </section>
  );
}

export default Restaurante;

Com useState, adicionei um estado local pratos para armazenar os dados retornados da API, fazendo a requisição para buscar os pratos do restaurante pelo id no objeto restaurante.

Espero ter ajudado! Bons estudos!

Sucesso

Um grande abraço e até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!