Vodniki · 01
Vrednosti in slog
Imejte vrednost v komponenti, izpeljite izhode s calc() in izberite, kam se zapiše spremenljivka CSS.
Lastništvo vrednosti
useAnimatedValue(initial) ustvari Value, ki pripada komponenti. Uporabite število ali zapis, kot je { x: 0, opacity: 1 }, katerega polja so ločene vrednosti.
V navadnem style je vrednost hooka žeton var(--kkwa-…, initial). Posodobitve zapišejo to spremenljivko na elemente, ki jo uporabljajo; React ne upodablja.
Pripravljanje primera …
Izpeljava s calc()
Interpolacija brez easinga ter add, subtract, multiply ali divide s konstanto postanejo natančni izrazi calc() iste spremenljivke. Izračuna jih brskalnik; zanje se v nobeni sličici ne izvaja 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})` }} />;Pripravljanje primera …
Barve in lastni izračuni
Barv, interpolacij z easingom, modulo, diffClamp in AnimatedComputed ni mogoče zapisati kot calc(). useAnimatedCSS(node) jim da lastno spremenljivko CSS, ki jo posodablja JavaScript, z enako življenjsko dobo kot komponenta.
Uporaba takega vozlišča neposredno v style vrže napako, zato strošek nikoli ni skrit.
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 }} />;Naj ima hook recept v lasti
useAnimated(initial, factory, deps) ima v lasti vrednost in vsak krmilnik, ki je sinhrono deklariran v factoryju. Zažene se ob priklopu, znova se zažene, ko se odvisnost spremeni, in se ustavi ob odklopu.
Za predvajanje, ki ga upravljajo dogodki, podajte { autoStart: false }, nato na vrnjeni vrednosti pokličite start(), stop() ali 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))` }} />;En zapis za veliko elementov
Privzeto spremenljivko dobi vsak element, katerega vrstični slog uporablja vrednost. S scope se spremenljivka zapiše enkrat na vsebnik in jo podedujejo njegovi otroci: prava izbira za stotine elementov.
AnimatedProvider scope={ref} nastavi privzeti scope za vse vrednosti hookov pod njim.
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>;Branje vrednosti v JavaScriptu
getValue() vrne posnetek brez naročnine Reacta. useAnimatedListener(node, fn) vas pokliče ob vsaki spremembi in poslušalca odstrani ob odklopu. Uporabite ga za risanje na canvas ali analitiko, ne za upodabljanje.