Vadovai · 01

Reikšmės ir stilius

Laikykite reikšmę komponente, išveskite išvestis su calc() ir pasirinkite, kur įrašomas CSS kintamasis.

Reikšmės valdymas

useAnimatedValue(initial) sukuria komponentui priklausančią Value. Naudokite skaičių arba įrašą, pavyzdžiui, { x: 0, opacity: 1 }, kurio laukai yra atskiros reikšmės.

Paprastame style hook reikšmė yra žetonas var(--kkwa-…, initial). Atnaujinimai įrašo tą kintamąjį į jį naudojančius elementus; React neperpiešia.

Ruošiamas pavyzdys…

Išvedimas su calc()

Interpoliacija be easing ir add, subtract, multiply ar divide su konstanta tampa tiksliomis to paties kintamojo calc() išraiškomis. Jas apskaičiuoja naršyklė; jokiame kadre dėl jų nevykdomas 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})` }} />;

Ruošiamas pavyzdys…

Spalvos ir savi skaičiavimai

Spalvų, interpoliacijų su easing, modulo, diffClamp ir AnimatedComputed negalima užrašyti kaip calc(). useAnimatedCSS(node) suteikia joms savo CSS kintamąjį, kurį atnaujina JavaScript, su tokiu pat gyvavimo laiku kaip komponentas.

Tokį mazgą naudojant tiesiai style išmetama klaida, todėl kaina niekada nepaslėpta.

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

Leiskite hook valdyti receptą

useAnimated(initial, factory, deps) valdo reikšmę ir kiekvieną factory sinchroniškai aprašytą valdiklį. Jis paleidžiamas prijungiant, paleidžiamas iš naujo pasikeitus priklausomybei ir sustabdomas atjungiant.

Įvykių valdomam grojimui perduokite { autoStart: false }, tada grąžintai reikšmei iškvieskite start(), stop() arba 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))` }} />;

Vienas įrašymas daugeliui elementų

Pagal numatymą kintamąjį gauna kiekvienas elementas, kurio vidinis stilius naudoja reikšmę. Su scope kintamasis įrašomas vieną kartą į konteinerį ir jį paveldi jo vaikai: tinkamas pasirinkimas šimtams elementų.

AnimatedProvider scope={ref} nustato numatytąjį scope visoms po juo esančioms hook reikšmėms.

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

Reikšmių skaitymas JavaScript kode

getValue() grąžina momentinę kopiją be React prenumeratos. useAnimatedListener(node, fn) iškviečia jus po kiekvieno pakeitimo ir pašalina listener atjungiant. Naudokite jį piešimui canvas ar analitikai, o ne atvaizdavimui.

Paieška

Rašykite, kad ieškotumėte dokumentacijoje.