# Transições

As transições não servem apenas para adicionar um toque bonito ao seu aplicativo(juro). Uma boa transição pode ser a diferença entre um usuário se inscrever, fazer uma compra ou sair completamente do site.

O Vue.js oferece várias maneiras de animar seu aplicativo, incluindo transições e animações CSS, e usando JavaScript para manipular o DOM durante ganchos de transição. Você pode até conectar-se a bibliotecas de terceiros, como GSAP ou VelocityJS.

Uma transição ocorre quando um elemento passa de A para B. Eles estão entre dois estágios: do estado inicial (A) ao estado final (B). Eles funcionam muito bem para coisas como passar o mouse sobre links e botões ou adicionar um novo item a uma lista. O principal objetivo das transições é criar uma demonstração natural de que algo mudou. Um bom exemplo de uma transição no mundo real seria portas automáticas. Eles começam fechados e quando você pisa na frente deles, eles passam automaticamente para o estado aberto.

# Elementos de Transição

O Vue possui o elemento <transition> que facilita o manuseio de animações JavaScript, animações CSS e demais transições em seus elementos ou componentes. No caso de transições CSS, o elemento <transition> cuida da aplicação e da não aplicação de classes. Tudo o que você precisa fazer é definir a aparência do elemento durante a transição. Ele age como qualquer outro componente do Vue.js e você pode usar as mesmas diretivas como **v-if e v-show.

Para isso, o Vue usa classes de transição padrões para facilitar(talvez nem tanto) o manuseio de todo o estado da transição.

  • Exemplo de uma transição simples que envolve a opacidade do elemento:

Imagem mostrando todo o funcionamento de um transition

O *-active é na onde definimos o tempo de transição da nossa transição, e nas pontas o estado que irá ocorrer no começo ou no fim.

# Transições CSS

Iremos agora mostrar um exemplo na prática usando as transições:

<template>
  <div>
    <button @click="mostrar = !mostrar">Clique aqui</button>
    <transition name="opacity">
      <p v-if="mostrar">Oiiiiiiiiiiiiiiiiiiiii</p>
    </transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      mostrar: true
    }
  }
};
</script>

<style scoped>
.opacity-enter-active,
.opacity-leave-active {
  transition: opacity 1s ease;
}
.opacity-enter,
.opacity-leave-to {
  opacity: 0;
}
</style>
  • Podemos criar nossos próprios nomes para as transições, no caso atribuimos o name="opacity", assim o vue-loader irá pesquisar a tag opacity-** para carregar as classes na transição.

  • Como no nosso exemplo tanto a entrada quanto a saida possuem a mesma lógica, podemos economizar código juntando em um mesmo escopo.

  • Nesse caso, omitimos o estado inicial do componente, pois se não colocarmos o Vue considera o estado inicial dos atributos, no caso por padrão temos a opacidade em 1.

# Animações

Assim como as transições, podemos usar animações de uma forma parecido em nossos componentes transition:

<template>
  <div>
    <button @click="mostrar = !mostrar">Clique aqui</button>
    <transition name="cor">
      <p v-if="mostrar">Oiiiiiiiiiiiiiiiiiiiii</p>
    </transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      mostrar: true
    };
  }
};
</script>

<style scoped>
.cor-enter-active,
.cor-leave-active {
  animation: cor 0.5s ease-in;
}

@keyframes cor {
  0% {
    color: red;
  }
  50% {
    color: blue;
  }
  100% {
    color: red;
  }
}
</style>

# Out-in

Utilizando o Out-in, podemos esperar a transição de um componente, assim evitando mutações inesperadas(na verdade, esperadas) no template:

<transition name="cor" mode="out-in">
  ...
</transition>

# Transições entre componentes

<transition name="troca" mode="out-in">
  <component v-bind:is="componente"></component>
</transition>
  • O component irá buscar o nome componente nos componentes que estão registrados na instância.

# Transição em grupos

Quando temos mais de um elemento dentro de um transition(no caso mais que 1 elemento filho na transição), temos que usar o transition-group:

<transition-group name="list" tag="p">
  <article v-for="(item, index) in lista" :key="index">
    {{ item }}
  </article>
</transition-group>
  • No caso item irá assumir a tag p passada no transition-group.

# Move

Usando o move é aplicado diretamente um evento de transição a uma lista que possui elementos sendo alterados.

.classe-move {
  transition: transform 1s;
}

# Transições em methods

Podemos anexar transições em nosso template:

@before-enter="beforeEnter"
// ou
v-on:before-enter="beforeEnter"
methods: {
  beforeEnter(el) {
    el.style.opacity = 0
    el.style.height = 0
  }
}

Te esperamos na próxima seção, falaremos sobre o Keep Alive e como ele pode ser útil, nos vemos lá!

Próxima Seção