动手试试
最简用法
SaveButton.jsx<button onClick={save}>
<MotionSwap value={status} effect="up">
{status === 'saving' ? 'Saving…' : status === 'saved' ? 'Saved' : 'Save'}
</MotionSwap>
</button>;
它替你处理的事
- 元素会从屏幕上的当前尺寸变化到新内容的自然尺寸,所以按钮从不跳动。
- 旧内容在原处淡出,新内容同时淡入;切换期间两者都不会重新排版。
- 切换中途改回去,会从屏幕上的当前状态继续,而不会叠出多个副本。
- 纯文本子元素本身就是它的
value;其他内容请传入 value。
适用场景
- 保存 → 保存中… → 已保存。
- 骨架屏变成个人资料卡。
- 播放按钮变成暂停按钮。
Props
| Prop | 类型 | 默认值 | 说明 |
|---|
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 | 时间曲线 { duration, easing } 或弹簧 { tempo: 'spring', spring }。弹簧被打断时会保留动量。 |
|---|
onMotionComplete | (value) => void | | 动效停稳时运行。 |
|---|
其他 props 会传给渲染的元素,所以 className、style 和事件处理函数照常可用。