0Pricing
React Academy · レッスン

ドラッグ&ドロップによるファイルアップロードUI

onDragOver/onDropイベントと視覚的なフィードバックを使って、ドラッグ&ドロップ領域を構築します

「ドラッグ&ドロップによるファイルアップロードUI」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

ようこそ

このレッスンでは、ネイティブのドラッグイベントと視覚的なフィードバックを使って、React でドラッグ&ドロップ対応のファイルアップロードゾーンを作成します。

ドラッグイベントの概要

ファイルが要素上にドラッグされると、ブラウザーはドラッグイベントを発生させます。主なイベントは、`dragover`(ファイルが要素上にある)、`dragleave`(ファイルが要素から離れる)、`drop`(ファイルが放される)です。

デフォルト動作の防止

デフォルトでは、ブラウザーにファイルをドロップすると、そのファイルへ移動します。これを防ぐには、`onDragOver` と `onDrop` の両方で `e.preventDefault()` を呼び出します。
const handleDragOver = (e) => {
  e.preventDefault();
};
const handleDrop = (e) => {
  e.preventDefault();
  const files = Array.from(e.dataTransfer.files);
  // process files
};

アクティブ状態の表示

ファイルがゾーン上でドラッグされているかどうかを、真偽値の state で追跡します。CSS クラスを切り替えて、強調表示された境界線などの視覚的なフィードバックをユーザーに提供します。
const [isDragging, setIsDragging] = useState(false);

<div
  className={isDragging ? 'zone active' : 'zone'}
  onDragOver={(e) => { e.preventDefault(); setIsDragging(true); }}
  onDragLeave={() => setIsDragging(false)}
  onDrop={handleDrop}
>

ドロップされたファイルの読み取り

ドロップされたファイルは `e.dataTransfer.files` に含まれる `FileList` です。これを配列に変換して、ファイルを処理します。
const handleDrop = (e) => {
  e.preventDefault();
  setIsDragging(false);
  const files = Array.from(e.dataTransfer.files);
  setSelectedFiles(files);
};

クリック選択との組み合わせ

非表示のファイル入力をレンダリングし、ゾーンがクリックされたときにプログラムからクリックすることで、ドロップゾーンをクリック可能にもします。
const inputRef = useRef();

<div onClick={() => inputRef.current.click()} ...>
  Drop files here or click to browse
</div>
<input
  ref={inputRef}
  type="file"
  multiple
  hidden
  onChange={(e) => setSelectedFiles(Array.from(e.target.files))}
/>

ファイルプレビューの表示

選択されたファイルを map して、名前とサイズを表示します。画像ファイルの場合は、`URL.createObjectURL` でプレビュー用 URL を生成し、クリーンアップ用の effect で revoke します。

アップロード前のファイル削除

選択されたファイルの配列を filter することで、アップロード前にユーザーがファイルを削除できるようにします。filter 後の配列で state を更新します。
const removeFile = (index) =>
  setSelectedFiles(files => files.filter((_, i) => i !== index));

dragenter と dragover の違い

ドラッグがゾーンに最初に入ったことを検出するには `dragenter` を使い、ホバー中もアクティブ状態を維持するには `dragover` を使います。子要素がネストされている場合はカウンターを使い、dragenter で増加、dragleave で減少、drop でリセットします。

サードパーティーライブラリ

本番環境のドロップゾーンには **react-dropzone** を検討してください。ブラウザーごとの違い、ARIA 属性、ファイル形式のフィルタリング、複数のアップロード方式に標準で対応しています。
import { useDropzone } from 'react-dropzone';
const { getRootProps, getInputProps, isDragActive } = useDropzone({
  onDrop: acceptedFiles => setFiles(acceptedFiles),
  accept: { 'image/*': [] },
});

理解度チェック

なぜ `onDragOver` ハンドラーで e.preventDefault() を呼び出す必要があるのでしょうか?

まとめ

onDragOver、onDragLeave、onDrop イベントでドロップゾーンを作成します。dragover と drop では必ず e.preventDefault() を呼び出します。isDragging state で視覚的なフィードバックを管理します。非表示のファイル入力と組み合わせて、クリックによるファイル選択にも対応します。

次のレッスン

次のレッスンは **Uploading Files to a Backend API** です。FormData と fetch を使ってファイルを POST し、アップロードの進行状況を追跡します。

よくある質問

「ドラッグ&ドロップによるファイルアップロードUI」レッスンは無料ですか?

はい。「ドラッグ&ドロップによるファイルアップロードUI」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「ドラッグ&ドロップによるファイルアップロードUI」で何を学びますか?

onDragOver/onDropイベントと視覚的なフィードバックを使って、ドラッグ&ドロップ領域を構築します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「ドラッグ&ドロップによるファイルアップロードUI」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. useRefによる非制御入力
  2. ファイル入力とファイルデータの読み取り
  3. ドラッグ&ドロップによるファイルアップロードUI
  4. バックエンドAPIへのファイルアップロード
← React Academyに戻る