Sprievodcovia · 03

Komponenty Animated

Renderujte bežné prvky, ktoré sa pohybujú k cieľu, reagujú na gestá a elegantne odchádzajú.

Animated.<tag>

Animated.div, Animated.button, Animated.svg a každý ďalší tag HTML alebo SVG renderujú bežný prvok bez obalu. Ich style prijíma hodnoty a transformácie môžu byť polia ako v React Native.

Konečný pohyb transform a opacity na týchto prvkoch, vrátane pružín, môže prehrávať prehliadač.

Príprava príkladu…

seed, pose, poses a tempo

seed je prvá snímka, pose aktuálny cieľ (objekt alebo názov položky v poses) a tempo timing alebo pružina. Samotná zmena tempo znova neprehrá nezmenený cieľ.

onRest sa spustí, keď prvok dorazí.

Card.jsx
<Animated.article
  seed={{ opacity: 0, transform: [{ translateY: 16 }] }}
  pose={selected ? 'raised' : 'rest'}
  poses={{
    rest: { opacity: 1, transform: [{ translateY: 0 }, { scale: 1 }] },
    raised: { opacity: 1, transform: [{ translateY: -8 }, { scale: 1.04 }] },
  }}
  tempo={{ spring: { stiffness: 300, damping: 26 } }}
  onRest={() => console.log('arrived')}
/>;

Reakcia na gestá

respond mapuje gestá na dočasné ciele: hover, focus, focusWithin, press, longPress, drag, inView a ďalšie. Keď reakcia skončí, prvok sa vráti do svojej pózy z miesta, kde práve je.

onResponse hlási začiatok a koniec každej reakcie a respond={{ press: {} }} sleduje gesto bez toho, aby čokoľvek vizuálne menil.

Príprava príkladu…

Zdieľanie predvolených hodnôt cez Animated.Scope

Animated.Scope odovzdá názov pózy, tempo a predvolené nastavenia animácie prvkom Animated vnútri.

Menu.jsx
<Animated.Scope tempo={{ spring: { stiffness: 380, damping: 30 } }}>
  <Animated.li pose={{ opacity: 1 }} />
  <Animated.li pose={{ opacity: 1 }} />
</Animated.Scope>;

Vaše vlastné komponenty

Animated.wrap(Component) — v React Native createAnimatedComponent — umožní komponentu, ktorý odovzdáva ref a zodpovedá jednému prvku DOM, prijímať rovnaké props.

Link.jsx
import { forwardRef } from 'react';
import { Animated } from '@kkwaenggwari/animated';

const Link = forwardRef((props, ref) => <a ref={ref} {...props} />);
const AnimatedLink = Animated.wrap(Link);

<AnimatedLink href="/pricing" respond={{ hover: { transform: [{ translateX: 4 }] } }} />;

Hľadať

Píšte a hľadajte v dokumentácii.