מדריכים · 01
ערכים וסגנון
החזיקו ערך ברכיב, גזרו פלטים עם calc() ובחרו איפה משתנה ה־CSS נכתב.
להחזיק ערך
useAnimatedValue(initial) יוצר Value ששייך לרכיב. השתמשו במספר, או ברשומה כמו { x: 0, opacity: 1 } שהשדות שלה הם ערכים נפרדים.
ב־style רגיל, ערך של hook הוא הטוקן 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 }} />;לתת ל־hook להחזיק מתכון
useAnimated(initial, factory, deps) מחזיק את הערך ואת כל בקר שמוצהר באופן סינכרוני ב־factory. מתחיל בהרכבה, מתחיל מחדש כשתלות משתנה ונעצר בהסרה.
העבירו { 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} קובע scope ברירת מחדל לכל ערכי ה־hooks מתחתיו.
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 או לאנליטיקה, לא לרינדור.