As animações de layout do Reanimated lidam declarativamente com mudanças de entrada, saída e layout. Itens aparecem gradualmente ou deslizam ao serem adicionados, colapsam ao serem removidos e deslizam suavemente quando listas são reordenadas - sem setState a cada frame.
Cartão de receita de referência rápida - pronto para copiar e colar.
npx expo install react-native-reanimated
import Animated, { FadeIn, FadeOut, Layout } from "react-native-reanimated";export function AnimatedListItem({ children }: { children: React.ReactNode }) { return ( <Animated.View entering={FadeIn.duration(220)} exiting={FadeOut.duration(180)} layout={Layout.springify()} > {children} </Animated.View> );}
// Desliza da borda final - comum para linhas de caixa de entradaimport { SlideInRight, SlideOutLeft } from "react-native-reanimated";<Animated.View entering={SlideInRight.springify()} exiting={SlideOutLeft.duration(200)} />
Quando usar isso:
Listas de tarefas, balões de chat e feeds de notificação com inserção/exclusão
Chips de filtro aparecendo/desaparecendo ao alternar categorias
Reordenação de grade após arrastar e soltar (com Layout em irmãos)
Seções de acordeão expandindo/recolhendo com reflow de irmãos
Usando Animated.View do react-native - As props entering/exiting são ignoradas. Correção: Importe Animated de react-native-reanimated.
Sem saída em mapa ScrollView sem mudança de chave - O reconciliador React reutiliza nós. Correção: Remova o item do array de estado para que o React desmonte a linha.
Chaves de índice em listas - Linha errada anima na exclusão. Correção: IDs de string estáveis em keyExtractor.
layout em cada Text aninhado - Anima excessivamente a tipografia interna. Correção: Um wrapper Animated.View por linha.
Enorme escalonamento de entrada - Lista de 200 itens com atraso de 50ms cada - a UI parece congelada. Correção: Escalone apenas a primeira tela (index < 12).
Combinando Layout com grades flex wrap - Saltos inesperados quando as quebras de linha mudam. Correção: Larguras de célula fixas ou meça com onLayout antes de animar.
Modal desmonta corta a saída prematuramente - O pai desaparece antes que a saída termine. Correção: Atrasar o pop de navegação até que a duração de exiting expire (runOnJS + timeout).
As animações de layout vêm com o Reanimated 4 - nenhum pacote extra. Confirme se o plugin Babel é o último em babel.config.js.
Por que a saída não funciona na minha FlatList?
O item ainda existe em data - você apenas rolou para longe.
A linha foi desmontada sem a prop exiting em um componente Reanimated.
A lista pai foi remontada (mudança de chave em FlatList) - a saída foi cancelada.
FadeIn ou SlideInRight para linhas de feed?
FadeIn / FadeInDown para feeds densos (menos ruído visual).
SlideInRight para listas de caixa de entrada/ação onde a metáfora direcional ajuda.
O que faz layout={Layout.springify()}?
Quando as views irmãs mudam de posição ou tamanho, a view anima para sua nova caixa de layout com uma curva de física de mola em vez de pular instantaneamente.
Posso usar durações personalizadas por design system?
Frequentemente sim com um wrapper Animated.View, mas a entrada pesada em rolagem rápida pode causar jank - analise no Android. Desabilite a entrada para pré-busca fora da tela, se necessário.
Como as animações de layout interagem com deslizar para excluir?
Acione a remoção do estado no final do deslize; exiting cuida do colapso. Coordene com Resolução de Conflitos de Gestos para que a rolagem e o deslize não entrem em conflito.