Посібники · 02
Веб і React Native
Один імпорт для обох платформ. Metro вибирає нативну реалізацію, а веб-збирачі — реалізацію для DOM.
Один імпорт
Встановіть один пакет і імпортуйте з його кореня на обох платформах. Єдина обов’язкова peer-залежність — React; React Native — необов’язкова peer-залежність для нативних застосунків. Жодній платформі не потрібні provider, обгортка чи виклик налаштування.
// Web and React Native: the same import.
import { MotionNumber, MotionList } from '@kkwaenggwari/animated-chorus';
export function Score({ points, players }) {
return (
<>
<MotionNumber value={points} />
<MotionList items={players} renderItem={(player) => player.name} />
</>
);
}Як відтворюється рух
У вебі компоненти відтворюються через Web Animations API з аналітично обчисленими пружинами, тож не треба завантажувати бібліотеку анімації й немає рендеру React на кожен кадр. У React Native компоненти використовують Animated із нативним драйвером для transform і opacity, а драйвер JS — лише там, де змінюється розкладка (ширина чи висота).
| Частина | Веб | React Native |
|---|---|---|
| Transform і opacity | Web Animations API | Animated, нативний драйвер |
| Ширина й висота | Web Animations API | Animated, драйвер JS |
| Потоковий текст | Символи, що плавно з’являються, кілька рендерів React на секунду | Справжній Text, без згасання |
| Шторки й збільшення | Нативний dialog у верхньому шарі | Прозорий Modal |
| У фоні | У прихованій вкладці потоковий текст показується одразу | Рух одразу приходить у кінцевий стан |
Особливості React Native
API той самий; ось відмінності, які ви помітите на пристрої.
- Числа й потоковий текст лишаються справжнім
Text, тож виділення, переноси,numberOfLinesі доступність працюють як завжди. MotionSheetіMotionZoomрендеряться в прозоромуModalі закриваються кнопкою «Назад».- Внутрішні
ScrollViewу шторці зберігають свої жести; шторку тягнуть за ручку й статичні ділянки. MotionHoldпідтверджує одразу за дією активації доступності.- Вбудований
MotionSwapвимірює новий вміст в один рядок; для вмісту з переносами використовуйтеinline=—.
import { Text, View } from 'react-native';
import { MotionNumber, MotionSheet } from '@kkwaenggwari/animated-chorus';
export function Wallet({ balance, open, setOpen }) {
return (
<View>
<MotionNumber
value={balance}
intl
locale="en-US"
format={{ style: 'currency', currency: 'USD' }}
/>
<MotionSheet open={open} onOpenChange={setOpen} detents={[0.5, 0.9]}>
<Text>Recent activity</Text>
</MotionSheet>
</View>
);
}Ваша розкладка лишається вашою
Компоненти зберігають власну розкладку платформи: метрики тексту, переноси, масштаб шрифту, обмеження батька й ваші стилі. Рух ніколи не нав’язує вашому тексту ширину символів, фіксовану висоту чи маску обрізання.
Що й де перевірено
Поведінку у вебі перевірено в справжніх браузерах. Поведінку в React Native покрито тестами спільних моделей і імітованим рендерером, тож перед випуском перевірте жести й розкладку на цільових пристроях.