<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
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
Criando o projeto Gumball Verse
Primeira requisição com useFetch
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
</aside>
Agora que você conhece a estrutura de um arquivo .vue, chegou a hora de colocar dados na tela. Nesta página vamos ver a interpolação com {{ }} e os dois pilares da reatividade no Vue: o ref e o computed.
Tudo o que você cria no <script setup> pode ser exibido no template usando chaves duplas:
<script setup>
const name = 'Gumball';
const age = 12;
</script>
<template>
<p>{{ name }} tem {{ age }} anos.</p>
</template>
Dentro de {{ }} cabe qualquer expressão JavaScript:
<script setup>
const firstName = 'Gumball';
const lastName = 'Watterson';
const age = 12;
</script>
<template>
<p>{{ firstName + ' ' + lastName }}</p>
<p>{{ `${firstName} ${lastName}` }}</p>
<p>{{ firstName.toUpperCase() }}</p>
<p>Daqui a 5 anos terá {{ age + 5 }} anos.</p>
<p>{{ age >= 18 ? 'Adulto' : 'Criança' }}</p>
</template>
<aside>
⚠️ Dentro de {{ }} só cabem expressões. Comandos como if e for não funcionam. Para isso existem as diretivas v-if e v-for, que veremos na próxima página.
</aside>
Uma variável comum não atualiza a tela quando muda. Se você fizer let count = 0 e depois count++, o valor muda na memória, mas o Vue não fica sabendo e o HTML continua igual. Para isso existe o ref, que cria um valor reativo. Crie um arquivo Counter.vue:
<script setup>
import { ref } from 'vue';
const count = ref(0);
function increment() {
count.value++;
}
</script>
<template>
<p>Cliques: {{ count }}</p>
<button @click="increment">Clicar</button>
</template>
Cada clique no botão chama a função increment, que altera o count. Como ele é reativo, o Vue atualiza o parágrafo automaticamente.
Existem duas regras importantes sobre o ref:
count.value++;{{ count }}.<aside>
💡 No Vue puro, é preciso importar: import { ref } from 'vue'. No Nuxt, ref, computed e outras funções do Vue são importadas automaticamente, então você não precisa escrever esse import.
</aside>