1. Code
  2. JavaScript
  3. React

Introdução a Animações no React

Nos últimos tutoriais sobre React, familiarizamo-nos com os conceitos básicos do React, como JSX, rotas e formulários. Hoje, avançaremos e tentaremos entender animações no React.
Scroll to top

Portuguese (Português) translation by Erick Patrick (you can also view the original English article)

Nos últimos tutoriais sobre React, familiarizamo-nos com os conceitos básicos do React, como JSX, rotas e formulários. Hoje, avançaremos e tentaremos entender animações no React.

Começando

Criemos um diretório chamado ReactAnimations. Naveguemos até o diretório e iniciemos o projeto usando npm.

1
mkdir ReactAnimations
2
cd ReactAnimations
3
npm init

Instalemos react e react-dom no projeto.

1
npm install react react-dom  --save

Usaremos o empacotador de módulos webpack. Instalemo-no e o seu servidor de desenvolvimento.

1
npm install webpack webpack-dev-server --save-dev

Instalemos babel para converter a sintaxe JSX em JavaScript.

1
npm install --save-dev babel-core babel-loader babel-preset-react babel-preset-es2015

Criemos a configuração requerida pelo webpack-dev-server, onde feiniremos o arquivo de entrada, o de saída e o carregador do babel. Eis como webpack.config.js parece:

1
module.exports = {
2
    entry: './app.js',
3
    module: {
4
        loaders: [
5
            {
6
                exclude: /node_modules/,
7
                loader: 'babel-loader?presets[]=es2015&presets[]=react'
8
            }
9
        ]
10
    },
11
    output: {
12
        filename: 'bundle.js'
13
    }
14
};

Criemos um index.html onde a aplicação será renderizada. Eis como ele parece:

1
<html>
2
    <head>
3
        <title>TutsPlus - React Animations</title>
4
    </head>
5
    <body>
6
        <div id="app"></div>
7
        <script src="bundle.js"></script>
8
    </body>
9
</html>

Criemos um arquivo chamado app.js. Dentro dele, importemos as bibliotecas react necessárias, assim:

1
import React from 'react';
2
import {render} from 'react-dom';

Criemos um componente sem estado, Home, que renderizará a tag H1.

1
const Home = () => {
2
    return (
3
        <h2>{'TutsPlus - Welcome to React Animations!'}</h2>

4
    );
5
};

Renderizemos o componente Home dentro do elemento app no index.html. Eis como o app.js se parece:

1
import React from 'react';
2
import {render} from 'react-dom';
3
 
4
const Home = () => {
5
    return (
6
        <h2>{'TutsPlus - Welcome to React Animations'}</h2>

7
    );
8
};
9
 
10
render(
11
    <Home />,
12
    document.getElementById('app')
13
);

Salvemos e iniciemos o servidor webpack. Devemos ter um app rodando em http://localhost:8080/index.html.

Animações em React

React provê um número de complementos para criar apps nele. TransitionGroup e CSSTransitionGroup são as APIs providas para animação.

Da documentação oficial:

O complemento ReactTransitionGroup é uma API de baixo nível para animação, e ReactCSSTransitionGroup é um complemento para implementação básica fácil de animações e transições CSS.

Animação de Aparecer

Comecemos com uma animação simples em React. Instalemos react-addons-css-transition-group no projeto.

1
npm install react-addons-css-transition-group --save

Importemos ReactCSSTransitionGroup dentro de app.js.

1
import ReactCSSTransitionGroup from 'react-addons-css-transition-group'

Dentro do componente Home que criamos, envolvamos a tag H2 dentro da tag ReactCSSTransitionGroup.

1
<div>
2
    <ReactCSSTransitionGroup transitionName="anim" transitionAppear={true} transitionAppearTimeout={5000} transitionEnter={false} transitionLeave={false}>
3
        <h2>{'TutsPlus - Welcome to React Animations'}</h2>
4
    </ReactCSSTransitionGroup>
5
</div>

Usando a tag ReactCSSTransitionGroup, definimos a porção onde a animação acontecerá. Especificamos um nome para a transição usando transitionName. Também definimos onde a transição deverá aparecer, entrar e sair, ou não.

Usando o nome de transição definido em ReactCSSTransitionGroup, definimos as classes CSS que serão executadas ao aparecer e no estado ativo. Adicionemos o estilo CSS abaixo a index.html.

1
.anim-appear {
2
  opacity: 0.01;
3
}
4
5
.anim-appear.anim-appear-active{
6
  opacity: 2;
7
  transition: opacity 5s ease-in;
8
}

Como percebemos, precisamos especificar a duração da animação tanto na renderização quanto no CSS. É assim que o React sabe quando remover as classes de animação do elemento e quando remover o elemento da DOM.

Salvemos as mudanças acima e atualizemos. Uma vez carregada, dentro de alguns segundos deveremos ver o texto animado.

Animação de Entrar/Sair

Para entender melhor a animação de entrar e sair, criaremos uma outra pequena aplicação React. O app terá uma caixa de texto para digitar um nome. eremos como adicionar a animação de entrar quando o nome é adiciona à lista.

Dentro de app.js, criemos uma nova classe chamada App.

1
class App extends React.Component {
2
  
3
}

Inicializemos a lista data e a variável name dentro do estado inicial do componente.

1
class App extends React.Component {
2
  constructor(props) {
3
    super(props);
4
    this.state = {
5
      data: [],
6
      name:''
7
    };
8
  }
9
}

Dentro da parte de renderização do componente App, posicionemos uma caixa de texto para digitar o nome e um botão para adicionar o botão à lista de vetor.

1
<div>
2
    Enter Name <input onChange={this.handleChange} type="text" /> <input onClick={this.add} type="button" value="Add" />
3
</div>    

Definamos os eventos handleChange e add do campo, dentro do componente App.

1
handleChange(e){
2
    this.setState({name:e.target.value})
3
}

O evento handleChange configura o valor do campo de texto igual ao valor de name. Eis como o método add funciona:

1
add(){
2
    var arr = this.state.data.slice();
3
    arr.push({'id':(new Date()).getTime(),'name':this.state.name})
4
    this.setState({data:arr})
5
}

Dentro de add, o nome digitado e um ID único é passado para a lista de vetor data.

Vinculemos handleChange e add ao construtor do componente App.

1
constructor(props) {
2
    super(props);
3
    this.add = this.add.bind(this);
4
    this.handleChange = this.handleChange.bind(this);
5
    this.state = {
6
      data: [],
7
      name:''
8
    };
9
}

Mostraremos os nomes digitados em um lista. Modifiquemos o HTML renderizado para adicionar a lista.

1
<ul>
2
{
3
    this.state.data.map(function(player) {
4
         return <li key={player.id}>{player.name}</li>
5
    })
6
}
7
</ul>

Para animar os items recém adicionados, adicionaremos a tag ReactCSSTransitionGroup sobre os elementos li.

1
<ul>
2
    <ReactCSSTransitionGroup transitionName="anim" transitionAppear={false} transitionEnterTimeout={5000} transitionEnter={true} transitionLeave={false}>
3
    {
4
      this.state.data.map(function(player) {
5
         return <li key={player.id}>{player.name}</li>
6
      })
7
    }
8
    </ReactCSSTransitionGroup>
9
</ul>

Adicionemos o estilo de transição CSS à página index.html.

1
.anim-enter {
2
  opacity: 0.01;
3
}
4
5
.anim-enter.anim-enter-active {
6
  opacity: 2;
7
  transition: opacity 5s ease-in;
8
}

Eis o componente App completo:

1
class App extends React.Component {
2
  constructor(props) {
3
    super(props);
4
    this.add = this.add.bind(this);
5
    this.handleChange = this.handleChange.bind(this);
6
    this.state = {
7
      data: [],
8
      name:''
9
    };
10
  }
11
  add(){
12
    var arr = this.state.data.slice();
13
    arr.push({'id':(new Date()).getTime(),'name':this.state.name})
14
    this.setState({data:arr})
15
  }
16
  handleChange(e){
17
    this.setState({name:e.target.value})
18
  }
19
  render() {
20
    return (
21
      <div>
22
        Enter Name <input onChange={this.handleChange} type="text" /> <input onClick={this.add} type="button" value="Add" />
23
        
24
        <ul>
25
        <ReactCSSTransitionGroup transitionName="anim" transitionAppear={false} transitionEnterTimeout={3000} transitionEnter={true} transitionLeave={false}>
26
        {
27
          this.state.data.map(function(player) {
28
             return <li key={player.id}>{player.name}</li>

29
          })
30
        }
31
        </ReactCSSTransitionGroup>

32
        </ul>

33
        
34
      </div>

35
    )
36
  }
37
}

Salvemos e atualizemos a página. Digitemos um nome e apertemos o botão add, e o item deverá aparecer na lista com animação.

Similarmente, a animação de sair também pode ser implementada no código acima. Após a funcionalidade ser implementada na aplicação, adicionemos as classes leave e leave-active ao index.html. Configuremos transitionLeave=True na tag ReactCSSTransitionGroup de render e tudo deve estar ok.

Conclusão

Nesse tutorial, vimos como começar a usar animações em React. Criamos um app simples em React e vimos como implementar animações para aparecer e entrar. Para informações em detalhes sobre animações em React, recomendamos a documentação oficial.

O código fonte desse tutorial está disponível no GitHub.

No último ano, React cresceu em popularidade. Na verdade, temos vários itens no mercado, disponíveis para compra, resenha, implementação e etc. Assim, para mais recurso sobre React, não deixe de conferi-los.

Diga-nos o que acho nos comentários abaixo. Veja a página de instrutor na Envato Tuts+ para mais tutoriais sobre React e tecnologia web correlatas.