Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Extraindo o Card em um Componente

O JSX dentro do events.map está ficando grande. Vamos extrair o card em seu próprio componente. Crie src/EventCard.tsx:

Arquivo: web/src/EventCard.tsx
import { Event } from "./types";

function EventCard({ event }: { event: Event }) {
  return (
    <article className="event-card">
      <h2>{event.title}</h2>
      <time dateTime={event.date}>
        {new Date(event.date).toLocaleString("pt-BR", {
          dateStyle: "short",
          timeStyle: "short",
        })}
      </time>
      <p>{event.description}</p>
      <p>📍 {event.location}</p>
      <p>
        Vagas: {event.capacity} · Organizado por {event.organizer_name}
      </p>
    </article>
  );
}

export default EventCard;

Código 7-6: Componente do card de evento.

E simplifique o EventList:

{events.map((ev) => (
  <EventCard key={ev.id} event={ev} />
))}

O EventCard recebe um evento via props — parâmetros que o componente pai passa ao filho. Props são somente leitura: o EventCard lê event.title, mas nunca modifica o objeto event. Se os dados mudarem, o componente pai re-renderiza o EventCard com novos props, e a tela se atualiza.

Essa divisão não é só estética. Se amanhã precisarmos de um card com layout diferente (uma versão compacta para uma sidebar, por exemplo), basta criar outro componente que recebe os mesmos props. A lógica de fetch fica no EventList, o layout fica no card.