الأدلة · 01
القيم والأنماط
امتلك قيمة في مكوّن، واشتق مخرجات عبر calc()، واختر أين يُكتب متغيّر CSS.
امتلاك قيمة
ينشئ useAnimatedValue(initial) قيمة Value يملكها المكوّن. استخدم رقمًا، أو سجلًا مثل { x: 0, opacity: 1 } حقوله قيم منفصلة.
في style العادي، قيمة الخطّاف هي الرمز var(--kkwa-…, initial). تكتب التحديثات هذا المتغيّر على العناصر التي تستخدمه؛ ولا يعرض React.
جارٍ تجهيز المثال…
الاشتقاق عبر calc()
الاستيفاء من دون easing وadd وsubtract وmultiply وdivide بثابت تصبح تعبيرات calc() دقيقة للمتغيّر نفسه. يشتقها المتصفح؛ ولا يعمل لها JavaScript في كل إطار.
const progress = useAnimatedValue(0);
// A linear interpolation of a hook value is a calc() of the same CSS variable.
const x = progress.interpolate({ inputRange: [0, 1], outputRange: ['0px', '180px'] });
const half = multiply(progress, 0.5);
<div style={{ opacity: half, transform: `translateX(${x})` }} />;جارٍ تجهيز المثال…
الألوان والحسابات المخصّصة
لا يمكن كتابة الألوان والاستيفاءات ذات easing وmodulo وdiffClamp وAnimatedComputed كـ calc(). يمنحها useAnimatedCSS(node) متغيّر CSS خاصًا يحدّثه JavaScript، بعمر المكوّن نفسه.
استخدام عقدة كهذه مباشرة في style يرمي خطأً، فلا تبقى الكلفة مخفية أبدًا.
const progress = useAnimatedValue(0);
// Colors and eased curves are not calc() expressions: give them their own CSS value.
const color = useAnimatedCSS(
progress.interpolate({ inputRange: [0, 1], outputRange: ['#3d3bf3', '#22b8f0'] }),
);
<div style={{ background: color }} />;دع الخطّاف يمتلك الوصفة
يمتلك useAnimated(initial, factory, deps) القيمة وكل متحكم يُعرَّف بشكل متزامن في دالة المصنع. يبدأ عند التركيب، ويعيد البدء حين تتغيّر تبعية، ويتوقف عند الإزالة.
مرّر { autoStart: false } للتشغيل حسب الأحداث، ثم استدعِ start() أو stop() أو reset() على القيمة المُعادة.
const intro = useAnimated(
{ opacity: 0, y: 24 },
(value) => {
parallel([
timing(value.opacity, { toValue: 1, duration: 400 }),
spring(value.y, { toValue: 0, stiffness: 220, damping: 20 }),
]);
},
[],
);
<section style={{ opacity: intro.opacity, transform: `translateY(calc(${intro.y} * 1px))` }} />;اكتب مرة واحدة لعناصر كثيرة
افتراضيًا، يتلقى المتغيّر كل عنصر يستخدم نمطه المضمّن القيمة. ومع scope، يُكتب المتغيّر مرة واحدة على حاوية ويرثه أبناؤها: الخيار الصحيح لمئات العناصر.
يضبط AnimatedProvider scope={ref} نطاقًا افتراضيًا لكل قيم الخطّافات تحته.
const field = useRef(null);
// Written once on the field; every child that uses the value inherits it.
const wave = useAnimatedValue(0, { scope: field });
<div ref={field}>
{items.map((item) => (
<i key={item} style={{ transform: `rotate(calc(${wave} * 1turn))` }} />
))}
</div>;قراءة القيم في JavaScript
يعيد getValue() لقطة من دون إشراك React. ويستدعيك useAnimatedListener(node, fn) عند كل تغيير ويزيل المستمع عند الإزالة. استخدمه للرسم على canvas أو للتحليلات، لا للعرض.