如何Implement Drag and Drop:Claude Code 实战指南
学习如何implement drag and drop:Claude Code 实战. 包含实用代码示例和分步指导。
拖拽&放置の实现パターン
拖拽&放置は直感的なUIを実現する重要な機能です。列表並べ替え、カンバンボード、文件上传など多くの場面で使われます。借助 Claude Code,アクセシブルで堅牢な拖拽&放置を効率よく实现可以。
カスタムフック通过基本实现
> HTML Drag and Drop API使用...的Reactのカスタムフックを作って。
> 列表の並べ替えに支持して。
import { useState, useCallback, DragEvent } from 'react';
function useSortable<T extends { id: string }>(initialItems: T[]) {
const [items, setItems] = useState(initialItems);
const [draggedId, setDraggedId] = useState<string | null>(null);
const handleDragStart = useCallback((e: DragEvent, id: string) => {
setDraggedId(id);
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('text/plain', id);
}, []);
const handleDragOver = useCallback((e: DragEvent, targetId: string) => {
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
if (draggedId === null || draggedId === targetId) return;
setItems((prev) => {
const dragIndex = prev.findIndex((item) => item.id === draggedId);
const targetIndex = prev.findIndex((item) => item.id === targetId);
const newItems = [...prev];
const [removed] = newItems.splice(dragIndex, 1);
newItems.splice(targetIndex, 0, removed);
return newItems;
});
}, [draggedId]);
const handleDragEnd = useCallback(() => {
setDraggedId(null);
}, []);
return { items, draggedId, handleDragStart, handleDragOver, handleDragEnd, setItems };
}
排序可能な列表组件
function SortableList({ initialTasks }: { initialTasks: Task[] }) {
const { items, draggedId, handleDragStart, handleDragOver, handleDragEnd } =
useSortable(initialTasks);
return (
<ul role="listbox" aria-label="タスク一覧(並べ替え可能)">
{items.map((task) => (
<li
key={task.id}
draggable
role="option"
aria-grabbed={draggedId === task.id}
onDragStart={(e) => handleDragStart(e, task.id)}
onDragOver={(e) => handleDragOver(e, task.id)}
onDragEnd={handleDragEnd}
className={`p-3 mb-2 rounded border cursor-grab ${
draggedId === task.id ? 'opacity-50 border-blue-400' : 'border-gray-200'
}`}
>
<span>{task.title}</span>
</li>
))}
</ul>
);
}
文件放置ゾーン
> 文件を拖拽&放置で上传できる组件を作って。
> 预览显示と验证も。
function FileDropZone({ onFiles, accept, maxSize = 5 * 1024 * 1024 }: DropZoneProps) {
const [isDragging, setIsDragging] = useState(false);
const [errors, setErrors] = useState<string[]>([]);
const validateFiles = (files: File[]): File[] => {
const errs: string[] = [];
const valid = files.filter((file) => {
if (accept && !accept.includes(file.type)) {
errs.push(`${file.name}: 対応していないファイル形式です`);
return false;
}
if (file.size > maxSize) {
errs.push(`${file.name}: ファイルサイズが上限を超えています`);
return false;
}
return true;
});
setErrors(errs);
return valid;
};
const handleDrop = (e: DragEvent<HTMLDivElement>) => {
e.preventDefault();
setIsDragging(false);
const files = Array.from(e.dataTransfer.files);
const valid = validateFiles(files);
if (valid.length > 0) onFiles(valid);
};
return (
<div
onDragOver={(e) => { e.preventDefault(); setIsDragging(true); }}
onDragLeave={() => setIsDragging(false)}
onDrop={handleDrop}
className={`border-2 border-dashed rounded-lg p-8 text-center transition-colors ${
isDragging ? 'border-blue-500 bg-blue-50' : 'border-gray-300'
}`}
>
<p>ファイルをここにドロップ、またはクリックして選択</p>
{errors.map((err, i) => (
<p key={i} className="text-red-500 text-sm mt-1">{err}</p>
))}
</div>
);
}
キーボード操作のサポート
アクセシビリティの为了キーボードでも操作できるようにします。
const handleKeyDown = (e: React.KeyboardEvent, index: number) => {
if (e.key === ' ' || e.key === 'Enter') {
e.preventDefault();
toggleGrabbed(index);
}
if (e.key === 'ArrowUp' && isGrabbed) {
e.preventDefault();
moveItem(index, index - 1);
}
if (e.key === 'ArrowDown' && isGrabbed) {
e.preventDefault();
moveItem(index, index + 1);
}
};
总结
借助 Claude Code,列表並べ替えから文件上传まで、多様な拖拽&放置实现を高效地构建可以。文件上传的详细信息请参阅文件上传实现を、アクセシビリティ支持はアクセシビリティ指南。
HTML Drag and Drop API的规范请参阅MDN Web Docs。
#Claude Code
#drag and drop
#React
#UI
#interaction
Related Posts
Tips & Tricks
Tips & Tricks
10 个技巧让你的 Claude Code 生产力翻三倍
分享 10 个实用的 Claude Code 使用技巧。从提示词策略到工作流优化,这些方法让你今天就能提升效率。
Tips & Tricks
Tips & Tricks
Canvas/WebGL Optimization:Claude Code 实战指南
了解canvas/webgl optimization:Claude Code 实战. 包含实用技巧和代码示例。
Tips & Tricks
Tips & Tricks
Markdown Implementation:Claude Code 实战指南
了解markdown implementation:Claude Code 实战. 包含实用技巧和代码示例。