Руководства · 09
SSR, тесты и продакшен
Рендеринг на сервере, гидратация, тесты и правила очистки, на которые можно положиться.
Рендеринг на сервере
Значения хуков рендерят своё начальное значение в серверную разметку, и анимация продолжается после гидратации. React 18 и новее используют useId для стабильных имён переменных; на серверах с React 16 и 17 передайте id.
import { AnimatedProvider } from '@kkwaenggwari/animated';
// The package entry is marked 'use client'. A server layout can render the
// provider directly; hooks and Animated.<tag> go inside Client Components.
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>
<AnimatedProvider>{children}</AnimatedProvider>
</body>
</html>
);
}Стабильные id в старых версиях React
Нужно только при рендеринге на сервере с React 16 или 17.
// React 18+ uses useId automatically. On React 16/17 servers, pass a stable id.
const progress = useAnimatedValue(0, { id: 'hero-progress' });Очистка, на которую можно положиться
Всё, чем владеет компонент, освобождается вместе с ним.
useAnimated,useAnimatedValue,useTimelineиuseReorderостанавливают свои контроллеры и слушатели при размонтировании.- Контроллеры и ввод, объявленные в фабрике
useAnimated, заменяются вместе при изменении зависимости. Animated.Keepудаляет уходящие дочерние элементы после их движения, а новая поза прерывает движение с текущей позиции.- Вне React
bind,bindOutput,createTimelineиcreateLayoutSceneвозвращают явныйdispose.
Тестирование
flushAnimatedUpdates() синхронно применяет ожидающий вывод, чтобы детерминированные тесты могли проверять DOM.
import { flushAnimatedUpdates } from '@kkwaenggwari/animated';
act(() => progress.setValue(0.5));
flushAnimatedUpdates();
// Pending style writes are applied now; assert on the DOM.Текст, атрибуты и свойства
output(target, mapping) внутри useAnimated владеет выводом в стиль, атрибут, текст или свойство объекта. bindOutput сразу подключает то же сопоставление и возвращает flush и dispose.
const label = useRef(null);
const count = useAnimated(
0,
(value) => {
output(label, { text: new AnimatedComputed([value], (v) => `${Math.round(v * 100)}%`) });
timing(value, { toValue: 1, duration: 1200 });
},
[],
);
<span ref={label} />;