Aplicando transições com Vue 2

Na versão 2 do Vue teremos um completo suporte às transições de elementos da DOM da aplicação, tanto para inserção, exclusão ou alteração. Nesse artigo veremos alguns passos introdutórios para a sua compreensão.

As transições que o vue pode suportar são:

  • Transições aplicadas diretamente à classe CSS
  • Integração com bibliotecas CSS, como o Animate.css
  • Uso de javascript diretamente para manipular a DOM e aplicar a transição
  • Integração com bibliotecas Javascript, como o Velocity.js

Neste artigo estaremos compreendendo um exemplo simples de como o Vue pode aplicar ao elemento uma classe CSS específica para determinar a transição que deve ser realizada naquele instante, quando o elemento é inserido ou removido da DOM (ou quando ele é apenas "escondido").

Primeiro, criamos uma simples instância do Vue com uma propriedade chamada "show":

new Vue({  
  el: '#demo',
  data: {
    show: true
  }
})

No nosso template html, criamos um botão que irá alternar o valor da propriedade show, e usamos o elemento <transition> para determinar que o vue observe os elementos que estarão neste elemento:

<div id="demo">  
  <button v-on:click="show = !show">
    Toggle
  </button>
  <transition name="fade">
    <p v-if="show">hello</p>
  </transition>
</div>  

Neste html, temos o elemento <transition> e nele temos um <p> que possui a condificional v-if, isto é, o elemento <p> será inserido ou removido da DOM dependendo do valor da propriedade show.

Com esses dois fatores, o vue passa a observar este elemento, e quando o valor de show muda, ele passa a adicionar classes CSS ao elemento, de forma dinâmica.

Estas classes CSS que irão determinar o comportamento do efeito, de acordo com a propriedade name do <transition>. Como usamos name="fade", significa que podemos criar as classes fade-enter-active, fade-leave-active, fade-enter e fade-leave-active, da seguinte forma:

.fade-enter-active, .fade-leave-active {
  transition: opacity .5s
}
.fade-enter, .fade-leave-active {
  opacity: 0
}

Se tivéssemos criado um name=foo, a classe CSS seria: foo-enter-active

Com isso já podemos testar o efeito, através do JSFiddle:

Perceba que o efeito da transição está no CSS e não no Vue. O Vue se encarrega apenas de adicionar as classes no momento certo, e em conjunto com o CSS a "mágica" acontece! Ainda existem dezenas de funcionalidades extras em relação à transição e animação de elementos com o Vue, que deve ser estudada através da sua documentação, mas o passo inicial desse processo é compreender este exemplo apresentado. Bons estudos e até a próxima.