Útmutatók · 03

Animated komponensek

Rendereljen sima elemeket, amelyek a cél felé mozognak, reagálnak a gesztusokra, és elegánsan távoznak.

Animated.<tag>

Az Animated.div, az Animated.button, az Animated.svg és minden más HTML- vagy SVG-címke burkoló nélkül renderel sima elemet. A style-juk értékeket fogad, a transzformációk pedig tömbök is lehetnek, mint React Native-ben.

Ezeken az elemeken a véges transform- és opacity-mozgást, a rugókat is beleértve, a böngésző játszhatja le.

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

seed, pose, poses és tempo

A seed az első képkocka, a pose az aktuális cél (objektum vagy a poses egy bejegyzésének neve), a tempo pedig timing vagy rugó. Ha csak a tempo változik, a változatlan célt nem játssza le újra.

Az onRest akkor fut le, amikor az elem megérkezik.

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

Reagálás gesztusokra

A respond a gesztusokat ideiglenes célokra képezi le: hover, focus, focusWithin, press, longPress, drag, inView és mások. Ha a reakció véget ér, az elem bárhonnan visszatér a saját pózába.

Az onResponse jelzi minden reakció kezdetét és végét, a respond={{ press: {} }} pedig látható változás nélkül követ egy gesztust.

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

Közös alapértékek az Animated.Scope-pal

Az Animated.Scope egy póznevet, tempót és animációs alapértékeket ad át a benne lévő Animated elemeknek.

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

Saját komponensek

Az Animated.wrap(Component) — React Native-ben createAnimatedComponent — lehetővé teszi, hogy egy ref-továbbító, egyetlen DOM-elemre feloldódó komponens ugyanazokat a props-okat fogadja.

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

Keresés

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