Introdução a Animações no React
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 complementoReactTransitionGroupé uma API de baixo nível para animação, eReactCSSTransitionGroupé 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.



