vue

09 out 2024

Por que evitar o uso do v-if e v-for no mesmo elemento dentro do Vue?

Dentro do Vue, uma prática que pode gerar problemas é usar a diretiva v-if com v-for no mesmo elemento. Mas por que isso não é recomendado?

O problema: quando v-if e v-for são usados juntos, o Vue avalia primeiro o v-if e depois o v-for. Isso significa que o loop pode não ser executado se a condição do v-if não for atendida, o que pode levar a comportamentos estranhos na renderização dos itens da lista. Pode ocorrer também a não realização do loop ou até mesmo, dependendo da implementação, o re-render de toda a lista, mesmo ela não aparecendo em tela.

A solução: uma forma de evitar esse problema é mover o v-if para uma tag acima da lista, como uma <div>, por exemplo, ou usar a tag <template> do Vue. Ela é uma tag coringa que não é renderizada no DOM, isso evita problemas de layout e código extra desnecessário. Aplicar o v-if ao <template> garante que o v-for seja executado sem erros, não havendo impactos de performance ou comportamentos estranhos do código.

<script setup lang="ts">
const items = [
  { id: 1, title: "First Item" },
  { id: 2, title: "Second Item" },
  { id: 3, title: "Third Item" },
]

const myCustomCondition = ref(true)
</script>

<template>
  <Container>
    <template v-if="myCustomCondition">
      <Card v-for="item in items" :key="item.id" :title="item.title" />
    </template>
  </Container>
</template>

Evitando v-if e v-for

Renderização de listas