Все компоненты
MotionSwap
Содержимое, которое плавно сменяется, а размер подстраивается.
ВебReact NativeСодержимое и размер
Попробуйте
Кратчайшее использование
SaveButton.jsx<button onClick={save}>
<MotionSwap value={status} effect="up">
{status === 'saving' ? 'Saving…' : status === 'saved' ? 'Saved' : 'Save'}
</MotionSwap>
</button>;
Что он берёт на себя
- Элемент меняет размер от текущего на экране к естественному размеру нового содержимого, поэтому кнопки никогда не прыгают.
- Старое содержимое исчезает на месте, пока новое появляется; ни одно не перестраивается во время смены.
- Возврат назад посреди смены продолжается с того, что на экране, а не накапливает копии.
- Дочерний текст сам служит своим
value; для всего остального передайте value.
Для чего подходит
- «Сохранить», затем «Сохранение…», затем «Сохранено».
- Скелетон, который превращается в карточку профиля.
- Кнопка воспроизведения, которая становится паузой.
Props
| Проп | Тип | По умолчанию | Описание |
|---|
value | unknown | | Идентичность содержимого; новое значение вызывает смену. Дочерний текст сам служит своей идентичностью. |
|---|
children | ReactNode | | Содержимое. |
|---|
as | element | 'span' | Элемент для рендера. |
|---|
inline | boolean | as === 'span' | true подстраивает размер под содержимое (подписи, иконки); false заполняет ширину родителя и анимирует высоту. |
|---|
align | 'start' | 'center' | 'end' | 'center' | Где находится содержимое, пока меняется размер. |
|---|
effect | 'fade' | 'up' | 'down' | 'scale' | 'fade' | Как содержимое входит и уходит: up поднимается, down опускается, scale растёт. |
|---|
transition | Transition | spring | Кривая timing { duration, easing } или пружина { tempo: 'spring', spring }. При прерывании пружины сохраняют инерцию. |
|---|
onMotionComplete | (value) => void | | Выполняется, когда движение останавливается. |
|---|
Остальные props передаются отрендеренному элементу, поэтому className, style и обработчики событий работают как обычно.