動手試試
最簡用法
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 與事件處理函式照常可用。