動手試試
最簡用法
Playlist.jsx<MotionReorder
items={tracks}
onItemsChange={setTracks}
layout="list"
renderItem={(track) => track.title}
/>;
它替你處理的事
- 其他項目會在你拖曳時(
reorder="live")或放下時(reorder="drop")讓開。 - 透過
columns 與 gap 支援清單與格狀版面。 - Web 上支援鍵盤移動,React Native 上提供無障礙動作。
- 可以用
items 與 onItemsChange 受控,或用 defaultItems 非受控。
適用情境
- 播放清單。
- 依優先順序排列的待辦清單。
- 相片格狀排列。
Props
| Prop | 型別 | 預設值 | 說明 |
|---|
items | readonly T[] | | 由你控制順序時的項目。 |
|---|
defaultItems | readonly T[] | [] | 由元件保存順序時的初始項目。 |
|---|
onItemsChange | (items, { reason, key }) => void | | 帶著新的順序,以及變化來自拖曳、放下或鍵盤執行。 |
|---|
getKey | (item) => string | number | item | 為項目回傳唯一的 key。預設為項目本身。 |
|---|
renderItem | (item, { index, dragging }) => ReactNode | item.label | 繪製一個項目;會收到它的索引以及是否正被拖曳。 |
|---|
reorder | 'live' | 'drop' | 'live' | live 在拖曳時移動其他項目;drop 等到放下才移動。 |
|---|
layout | 'list' | 'grid' | 'grid' | list 或 grid。 |
|---|
columns | number | 3 | 格狀排列的欄數。 |
|---|
gap | number | 12 | 項目之間的間距,單位為像素。 |
|---|
disabled | boolean | false | 關閉拖曳。 |
|---|
duration | number | 260 | 其他項目讓開時的毫秒時長。 |
|---|
itemClassName | string | | 每個項目元素的 class;itemStyle 設定其行內樣式。 |
|---|
其他 props 會傳給渲染的元素,所以 className、style 與事件處理函式照常可用。