<aside> <img src="/icons/arrow-northeast_gray.svg" alt="/icons/arrow-northeast_gray.svg" width="40px" />

Índice

</aside>

<aside> <img src="/icons/notion_green.svg" alt="/icons/notion_green.svg" width="40px" />

Conteúdos

Introdução

Introdução ao Vue.js

Anatomia de um componente .vue

Interpolação e reatividade com ref e computed

Diretivas: v-bind, v-on, v-if, v-for e v-model

Componentes e props

Slots, emits e ciclo de vida

Introdução ao Nuxt.js

Criando o projeto Gumball Verse

Primeira requisição com useFetch

Rotas a partir de arquivos

Layout, base do projeto e nuxt.config.ts

Consumindo a API nas listagens

Páginas de detalhes com rotas dinâmicas

Tratando o erro 404 com createError

Títulos das páginas com useHead

Filtros, paginação e busca com debounce

Desafio: título e favicon dinâmicos

Conclusão e próximos passos

</aside>

Bem-vindo à Parte 3, a integração com a API! Vamos começar pelas seções de destaque da página inicial: a listagem de personagens e a listagem de lugares. Ambas já existem na interface base, mas ainda não buscam nenhum dado. Vamos resolver isso, entendendo bem o que cada trecho significa.


Listagem de personagens

Abra o componente app/components/CharactersListing/index.vue e deixe-o assim:

<script setup>
const { data, error } = await useFetch('https://gumball-api-server.vercel.app/characters', {
    query: { limit: 8 },
});
</script>

<template>
    <section class="section">
        <div class="container">
            <SectionHeader
                eyebrow="Seção 01 · Elenco"
                lead="Da família Watterson aos colegas da Elmore Junior High, cada um mais imprevisível que o outro."
                see-all-url="/characters"
            >
                Os moradores mais <em>esquisitos</em> de Elmore
            </SectionHeader>

            <StateMessage v-if="error">
                Não foi possível carregar os personagens. Tente novamente mais tarde.
            </StateMessage>

            <div v-else class="grid grid--characters">
                <CharacterCard
                    v-for="currentCharacter in data?.data"
                    :key="currentCharacter.id"
                    :id="currentCharacter.id"
                    :name="currentCharacter.name"
                    :image="currentCharacter.image"
                    :species="currentCharacter.species"
                    :occupation="currentCharacter.occupation"
                    :role="currentCharacter.role"
                    :color="getCharacterColor(currentCharacter.colors)"
                />
            </div>
        </div>
    </section>
</template>

Entendendo o código

<aside> 🔎 Dica: para entender o formato da resposta, adicione console.log(data.value) logo depois do useFetch e veja o resultado no terminal. Lembre-se: no script usamos .value, no template não.

</aside>

O v-for, a :key e as props

Tratando o erro

Com o v-if="error", se a API falhar, mostramos uma mensagem amigável com o componente StateMessage em vez de quebrar a página. O v-else garante que a grade de personagens só aparece quando não há erro.