Útmutatók · 01

Értékek és stílus

Birtokoljon egy értéket a komponensben, származtasson kimeneteket calc()-kal, és válassza meg, hová íródjon a CSS-változó.

Egy érték birtoklása

A useAnimatedValue(initial) a komponenshez tartozó Value-t hoz létre. Használjon számot vagy olyan rekordot, mint a { x: 0, opacity: 1 }, amelynek mezői külön értékek.

Sima style-ban a hook értéke a var(--kkwa-…, initial) token. A frissítések ezt a változót írják az azt használó elemekre; a React nem renderel.

A példa előkészítése…

Származtatás calc()-kal

Az easing nélküli interpoláció, valamint az add, subtract, multiply vagy divide konstanssal ugyanannak a változónak pontos calc() kifejezéseivé válik. Ezeket a böngésző számolja; miattuk egyetlen képkockában sem fut 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})` }} />;

A példa előkészítése…

Színek és saját számítások

A színek, az easinggel végzett interpolációk, a modulo, a diffClamp és az AnimatedComputed nem írhatók calc() formában. A useAnimatedCSS(node) saját, JavaScript által frissített CSS-változót ad nekik, a komponenssel azonos élettartammal.

Ha egy ilyen csomópontot közvetlenül a style-ban használ, az hibát dob, így a költség soha nem rejtett.

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

A receptet birtokolja a hook

A useAnimated(initial, factory, deps) birtokolja az értéket és minden, a factoryban szinkron deklarált vezérlőt. Csatoláskor indul, függőségváltozáskor újraindul, és leválasztáskor leáll.

Eseményvezérelt lejátszáshoz adja át a { autoStart: false } beállítást, majd hívja meg a visszaadott értéken a start(), stop() vagy reset() metódust.

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

Egy írás sok elemhez

Alapértelmezés szerint a változót minden olyan elem megkapja, amelynek inline stílusa használja az értéket. A scope használatakor a változó egyszer íródik a tárolóelemre, és a gyermekei öröklik: ez a jó választás több száz elemhez.

Az AnimatedProvider scope={ref} az alatta lévő összes hookértékhez beállítja az alapértelmezett scope-ot.

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

Értékek olvasása JavaScriptben

A getValue() React-feliratkozás nélkül ad vissza pillanatképet. A useAnimatedListener(node, fn) minden változáskor meghívja Önt, és leválasztáskor eltávolítja a listenert. Canvasra rajzoláshoz vagy analitikához használja, ne rendereléshez.

Keresés

Gépeljen a dokumentációban való kereséshez.