Oppaat · 01

Arvot ja tyyli

Omista arvo komponentissa, johda tulokset calc()-lausekkeilla ja valitse, mihin CSS-muuttuja kirjoitetaan.

Arvon omistaminen

useAnimatedValue(initial) luo komponentille kuuluvan Value-arvon. Käytä lukua tai tietuetta, kuten { x: 0, opacity: 1 }, jonka kentät ovat erillisiä arvoja.

Tavallisessa style-propsissa hookin arvo on token var(--kkwa-…, initial). Päivitykset kirjoittavat tämän muuttujan sitä käyttäviin elementteihin; React ei renderöi.

Valmistellaan esimerkkiä…

Johtaminen calc()-lausekkeilla

Interpolointi ilman easingia sekä add, subtract, multiply tai divide vakiolla muuttuvat saman muuttujan tarkoiksi calc()-lausekkeiksi. Selain laskee ne; niitä varten ei ajeta JavaScriptiä yhdessäkään ruudussa.

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})` }} />;

Valmistellaan esimerkkiä…

Värit ja omat laskelmat

Värejä, easingia käyttäviä interpolointeja, modulo-, diffClamp- ja AnimatedComputed-arvoja ei voi kirjoittaa calc()-muodossa. useAnimatedCSS(node) antaa niille oman, JavaScriptin päivittämän CSS-muuttujan, jonka elinkaari on sama kuin komponentin.

Tällaisen solmun käyttäminen suoraan style-propsissa heittää virheen, joten kustannus ei ole koskaan piilossa.

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 }} />;

Anna hookin omistaa resepti

useAnimated(initial, factory, deps) omistaa arvon ja jokaisen factoryssa synkronisesti määritellyn ohjaimen. Se käynnistyy kiinnitettäessä, käynnistyy uudelleen riippuvuuden muuttuessa ja pysähtyy irrotettaessa.

Anna { autoStart: false } tapahtumien ohjaamaa toistoa varten ja kutsu sitten palautetun arvon start(), stop() tai 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))` }} />;

Yksi kirjoitus monelle elementille

Oletuksena muuttujan saa jokainen elementti, jonka inline-tyyli käyttää arvoa. scope-asetuksella muuttuja kirjoitetaan kerran säiliöön ja sen lapset perivät sen: oikea valinta sadoille elementeille.

AnimatedProvider scope={ref} asettaa oletus-scopen kaikille sen alla oleville hookien arvoille.

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>;

Arvojen lukeminen JavaScriptissä

getValue() palauttaa tilannekuvan ilman React-tilausta. useAnimatedListener(node, fn) kutsuu sinua jokaisella muutoksella ja poistaa listenerin irrotettaessa. Käytä sitä canvas-piirtämiseen tai analytiikkaan, ei renderöintiin.

Haku

Kirjoita hakeaksesi dokumentaatiosta.