Анимация контента

Библиотека react-native-reanimated позволяет добавить анимированное появление или исчезновение элемента:
import Animated, { FadeIn, FadeOut } from 'react-native-reanimated'

const Badge = ({ count }) => (
	<Animated.Text
		entering={FadeIn}
		exiting={FadeOut}
	>
		{count}
	</Animated.Text>
);
В таком варианте анимация сработает только при первом появлении компонента на экране и при изменении count никакой анимации не будет, потому что компонент, при изменении этого свойства, не пропадает с экрана.
Можно накрутить кастомную анимацию которая запускается при изменении свойства, но тогда это будет выглядеть намного сложнее и парой строчек кода тут дело не обойдется.
Предлагаю вспомнить про свойство key которое есть у каждого элемента в React. Обычно оно используется для отображения массива элементов. Но если вспомнить как это свойство работает, то оно сильно упростит нашу задачу.
Свойство key позволяет React'у связывать виртуальное дерево с реальным. Пока key не меняется, между рендерами React только обновляет свойства компонента. Но как только key изменится, компонент удаляется из дерева и добавляется новый с новым ключом — то что надо для запуска анимации.
import Animated, { FadeInDown, FadeOutUp } from 'react-native-reanimated'

const Badge = ({ count }) => (
	<Animated.Text
		key={count}
		entering={FadeInDown}
		exiting={FadeOutUp}
	>
		{count}
	</Animated.Text>
)
Такой способ применим не только к тексту. Можно, например, очень приятно поменять иконку на кнопке.
import { Pressable } from 'react-native'
import Animated, { ZoomIn, ZoomOut } from 'react-native-reanimated'
import { Icon } from '~/components/Icon'

const Button = ({ icon }) => (
	<Pressable>
		<Animated.View
			key={icon}
			entering={ZoomIn}
			exiting={ZoomOut}
		>
			<Icon name={icon} />
		</Animated.View>
	</Pressable>
)