ReactJS - Animação: Trazendo Suas Componentes à Vida
Olá aí, futuros magos das animações em React! Estou entusiasmado por ser seu guia nesta emocionante jornada para o mundo das animações em ReactJS. Como alguém que tem ensinado ciência da computação por anos, posso告诉你 que as animações são como o molho secreto que faz seus aplicativos não apenas funcionais, mas também deliciosamente agradáveis. Então, vamos mergulhar e fazer nossos componentes dançar!
A Magia do React Transition Group
Antes de começar a jogar com animações, vamos entender o que é o React Transition Group. Pense nele como uma caixa de ferramentas cheia de gadgets práticos que nos ajudam a criar transições suaves e atraentes em nossos aplicativos React.
Instalando o React Transition Group
Primeiro de tudo, precisamos convidar o React Transition Group para a festa do nosso projeto. Abra seu terminal e digite:
npm install react-transition-group
ou, se você é fã de yarn:
yarn add react-transition-group
Excelente! Agora temos nossos superpoderes de animação à nossa disposição.
Transition: O Bloco de Construção das Animações
O componente Transition
é como a base de uma casa. Ele nos dá uma base sólida para construir nossas animações. Vamos vê-lo em ação com um exemplo simples:
import React, { useState } from 'react';
import { Transition } from 'react-transition-group';
const duration = 300;
const defaultStyle = {
transition: `opacity ${duration}ms ease-in-out`,
opacity: 0,
}
const transitionStyles = {
entering: { opacity: 1 },
entered: { opacity: 1 },
exiting: { opacity: 0 },
exited: { opacity: 0 },
};
const FadeInOut = () => {
const [inProp, setInProp] = useState(false);
return (
<div>
<Transition in={inProp} timeout={duration}>
{state => (
<div style={{
...defaultStyle,
...transitionStyles[state]
}}>
Eu sou um texto que some e aparece!
</div>
)}
</Transition>
<button onClick={() => setInProp(!inProp)}>
Clique para Fade
</button>
</div>
);
};
Vamos desmembrar isso:
- Importamos
Transition
de 'react-transition-group'. - Configuramos alguns estilos: um
defaultStyle
para nosso estado inicial etransitionStyles
para diferentes fases da transição. - Nosso componente
FadeInOut
usa um estadoinProp
para controlar a visibilidade. - O componente
Transition
recebe duas propriedades principais:in
(nosso estado de visibilidade) etimeout
(duração da animação). - Dentro de
Transition
, usamos uma função que recebe o estado atual da transição e aplica o estilo apropriado.
Quando você clica no botão, você verá o texto sumir e aparecer suavemente. Mágico, né?
CSSTransition: Quando CSS Encontra React
Agora, vamos nivelar nossa jogo com CSSTransition
. É como o irmão mais legal do Transition
que trabalha perfeitamente com classes CSS. Aqui está um exemplo divertido:
import React, { useState } from 'react';
import { CSSTransition } from 'react-transition-group';
import './styles.css'; // Vamos criar isso em um momento
const Superhero = () => {
const [inProp, setInProp] = useState(false);
return (
<div>
<CSSTransition in={inProp} timeout={300} classNames="super">
<div className="superhero">
Eu sou um Super-Herói!
</div>
</CSSTransition>
<button onClick={() => setInProp(!inProp)}>
Transformar!
</button>
</div>
);
};
E aqui está o nosso CSS (em styles.css
):
.superhero {
background-color: #f0f0f0;
padding: 20px;
border-radius: 5px;
}
.super-enter {
opacity: 0;
transform: scale(0.9);
}
.super-enter-active {
opacity: 1;
transform: translateX(0);
transition: opacity 300ms, transform 300ms;
}
.super-exit {
opacity: 1;
}
.super-exit-active {
opacity: 0;
transform: scale(0.9);
transition: opacity 300ms, transform 300ms;
}
Aqui está o que está acontecendo:
- Usamos
CSSTransition
em vez deTransition
. - Especificamos
classNames="super"
, o que diz ao React para usar classes comosuper-enter
,super-enter-active
, etc. - Nosso CSS define como o componente deve parecer em cada fase da transição.
Quando você clica em "Transformar!", nosso super-herói aparecerá e desaparecerá dramaticamente com um efeito de escalonamento. É como assistir a um filme de super-heróis, mas no seu navegador!
TransitionGroup: lidando com Múltiplas Transições
Por último, mas não menos importante, vamos falar sobre TransitionGroup
. É como um maestro em uma orquestra, gerenciando várias transições ao mesmo tempo. Aqui está um exemplo prático:
import React, { useState } from 'react';
import { CSSTransition, TransitionGroup } from 'react-transition-group';
import './list-styles.css';
const TodoList = () => {
const [items, setItems] = useState([]);
const [inputValue, setInputValue] = useState('');
const addItem = () => {
setItems([...items, { id: Date.now(), text: inputValue }]);
setInputValue('');
};
const removeItem = (id) => {
setItems(items.filter(item => item.id !== id));
};
return (
<div>
<input
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
placeholder="Enter a task"
/>
<button onClick={addItem}>Adicionar</button>
<TransitionGroup className="todo-list">
{items.map(({ id, text }) => (
<CSSTransition
key={id}
timeout={500}
classNames="item"
>
<div className="todo-item">
{text}
<button onClick={() => removeItem(id)}>X</button>
</div>
</CSSTransition>
))}
</TransitionGroup>
</div>
);
};
E o CSS correspondente (list-styles.css
):
.todo-list {
list-style-type: none;
padding: 0;
}
.todo-item {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 10px;
margin-bottom: 10px;
display: flex;
justify-content: space-between;
}
.item-enter {
opacity: 0;
}
.item-enter-active {
opacity: 1;
transition: opacity 500ms ease-in;
}
.item-exit {
opacity: 1;
}
.item-exit-active {
opacity: 0;
transition: opacity 500ms ease-in;
}
Este exemplo cria uma lista de tarefas simples onde os itens entram e saem com uma fade-in e fade-out suaves. Aqui está o resumo:
- Usamos
TransitionGroup
para envolver nossa lista de itens. - Cada item é envolvido em um
CSSTransition
. - Quando itens são adicionados ou removidos,
TransitionGroup
gerencia as transições automaticamente.
O resultado? Uma lista de tarefas suave e profissional que faria qualquer gerente de projeto orgulhoso!
Concluindo
E aí, pessoal! Nós fizemos uma jornada pelo território das animações em React, desde o básico Transition
até o poderoso TransitionGroup
. Lembre-se, as animações não são apenas sobre fazer as coisas parecerem bonitas (embora isso seja um grande bônus). Elas são sobre criar interfaces intuitivas e responsivas que guiam seus usuários através do seu aplicativo.
Aqui está uma tabela de referência rápida dos métodos que cobrimos:
Componente | Caso de Uso | Propriedades Chave |
---|---|---|
Transition | Transições básicas |
in , timeout
|
CSSTransition | Transições baseadas em CSS |
in , timeout , classNames
|
TransitionGroup | Gerenciamento de múltiplas transições |
component (opcional) |
Agora, vá e anime! E lembre-se, com grandes poderes vem grandes responsabilidades. Use animações com sabedoria, e seus usuários vão te agradecer. Boa programação!
Credits: Image by storyset