الأدلة · 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} />;