拖放功能
- react-draggable:
react-draggable
主要提供單一元素的拖動功能,拖動過程中不涉及拖放區或自定義效果。它的功能相對簡單,適合需要基本拖動的場景。 - react-dnd:
react-dnd
提供高度可定制的拖放功能,支持多個拖放區、拖放類型和自定義拖放效果。它允許開發者創建複雜的拖放交互,並提供 API 來管理拖放狀態。 - react-zoom-pan-pinch:
react-zoom-pan-pinch
不涉及拖放功能,但提供縮放和平移功能,允許用戶通過手勢或滑鼠操作來移動和縮放內容。
易用性
- react-draggable:
react-draggable
非常易於使用,特別是對於簡單的拖動功能。它的 API 直觀,適合快速實現拖動效果。 - react-dnd:
react-dnd
需要一定的學習曲線,特別是對於複雜的拖放交互。它的文檔詳細,但配置和實現可能需要更多時間。 - react-zoom-pan-pinch:
react-zoom-pan-pinch
的易用性取決於縮放和平移功能的實現。對於需要這些功能的應用來說,它提供了簡單的接口和良好的文檔。
縮放和平移功能
- react-draggable:
react-draggable
也不提供縮放或平移功能,僅限於拖動單個元素。 - react-dnd:
react-dnd
不提供縮放或平移功能,專注於拖放交互。 - react-zoom-pan-pinch:
react-zoom-pan-pinch
專注於縮放和平移,支持多點觸控和滑鼠操作,適合需要處理大範圍內容的應用。
代碼示例
- react-draggable:
拖動示例
import Draggable from 'react-draggable'; const DraggableComponent = () => { return ( <Draggable> <div style={{ width: '100px', height: '100px', background: 'lightcoral' }}>拖動我</div> </Draggable> ); }; export default DraggableComponent;
- react-dnd:
拖放示例
import { DndProvider, useDrag, useDrop } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; const ItemType = 'BOX'; const DraggableBox = () => { const [{ isDragging }, drag] = useDrag({ type: ItemType, item: { id: 1 }, collect: (monitor) => ({ isDragging: monitor.isDragging() }), }); return <div ref={drag} style={{ opacity: isDragging ? 0.5 : 1 }}>拖動我</div>; }; const DropZone = () => { const [{ isOver }, drop] = useDrop({ accept: ItemType, drop: (item) => console.log(`Dropped item: ${item.id}`), collect: (monitor) => ({ isOver: monitor.isOver() }), }); return <div ref={drop} style={{ background: isOver ? 'lightblue' : 'lightgray', height: '200px' }}>放置區域</div>; }; const App = () => ( <DndProvider backend={HTML5Backend}> <DraggableBox /> <DropZone /> </DndProvider> ); export default App;
- react-zoom-pan-pinch:
縮放和平移示例
import { TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch'; const ZoomPanComponent = () => { return ( <TransformWrapper> <TransformComponent> <img src='your-image.jpg' alt='可縮放的內容' /> </TransformComponent> </TransformWrapper> ); }; export default ZoomPanComponent;