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