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!

ReactJS - Animation

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:

  1. Importamos Transition de 'react-transition-group'.
  2. Configuramos alguns estilos: um defaultStyle para nosso estado inicial e transitionStyles para diferentes fases da transição.
  3. Nosso componente FadeInOut usa um estado inProp para controlar a visibilidade.
  4. O componente Transition recebe duas propriedades principais: in (nosso estado de visibilidade) e timeout (duração da animação).
  5. 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:

  1. Usamos CSSTransition em vez de Transition.
  2. Especificamos classNames="super", o que diz ao React para usar classes como super-enter, super-enter-active, etc.
  3. 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:

  1. Usamos TransitionGroup para envolver nossa lista de itens.
  2. Cada item é envolvido em um CSSTransition.
  3. 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