מדריכים · 01

ערכים וסגנון

החזיקו ערך ברכיב, גזרו פלטים עם calc() ובחרו איפה משתנה ה־CSS נכתב.

להחזיק ערך

useAnimatedValue(initial) יוצר Value ששייך לרכיב. השתמשו במספר, או ברשומה כמו { x: 0, opacity: 1 } שהשדות שלה הם ערכים נפרדים.

ב־style רגיל, ערך של hook הוא הטוקן var(--kkwa-…, initial). עדכונים כותבים את המשתנה הזה על האלמנטים שמשתמשים בו; React לא מתרנדר.

מכין את הדוגמה…

לגזור עם calc()

אינטרפולציה בלי easing ו־add, subtract, multiply או divide בקבוע הופכים לביטויי calc() מדויקים של אותו משתנה. הדפדפן גוזר אותם; שום JavaScript לא רץ בשבילם בכל פריים.

Slide.jsx
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 זורק שגיאה, כך שהעלות לעולם לא מוסתרת.

Glow.jsx
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() על הערך שהוחזר.

Intro.jsx
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 מתחתיו.

Field.jsx
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 או לאנליטיקה, לא לרינדור.

חיפוש

הקלידו כדי לחפש בתיעוד.