0Pricing
React Academy · Lezione

Interfaccia di upload con trascinamento

Creare un'area drag-and-drop con gli eventi onDragOver/onDrop e un feedback visivo.

Interfaccia di upload con trascinamento è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.

Benvenuto

In questa lezione costruirà in React un'area di caricamento dei file tramite trascinamento, utilizzando gli eventi nativi di trascinamento e un feedback visivo per guidare gli utenti.

Panoramica degli eventi di trascinamento

Il browser genera eventi di trascinamento quando i file vengono trascinati sopra gli elementi. Gli eventi principali sono: `dragover` (il file si trova sopra l'elemento), `dragleave` (il file lascia l'elemento) e `drop` (il file viene rilasciato).

Prevenire il comportamento predefinito

Per impostazione predefinita, rilasciare un file nel browser apre il file stesso. Chiami `e.preventDefault()` sia in `onDragOver` sia in `onDrop` per impedirlo.
const handleDragOver = (e) => {
  e.preventDefault();
};
const handleDrop = (e) => {
  e.preventDefault();
  const files = Array.from(e.dataTransfer.files);
  // process files
};

Stato visivo attivo

Tenga traccia del fatto che un file venga trascinato sopra l'area usando uno stato booleano. Attivi o disattivi una classe CSS per fornire agli utenti un feedback visivo, ad esempio un bordo evidenziato.
const [isDragging, setIsDragging] = useState(false);

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

Leggere i file rilasciati

I file rilasciati si trovano in `e.dataTransfer.files`, una FileList. La converta in un array ed elabori i file.
const handleDrop = (e) => {
  e.preventDefault();
  setIsDragging(false);
  const files = Array.from(e.dataTransfer.files);
  setSelectedFiles(files);
};

Combinare la selezione tramite clic

Renda l'area di rilascio selezionabile anche tramite clic, eseguendo il rendering di un input per file nascosto e facendo clic su di esso programmaticamente quando l'area viene selezionata.
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))}
/>

Mostrare le anteprime dei file

Iteri sui file selezionati per visualizzarne i nomi e le dimensioni. Per i file immagine, generi URL di anteprima con URL.createObjectURL e li revochi in un effetto di pulizia.

Rimuovere i file prima del caricamento

Consenta agli utenti di rimuovere i file prima del caricamento filtrando l'array dei file selezionati. Aggiorni lo stato con l'array filtrato.
const removeFile = (index) =>
  setSelectedFiles(files => files.filter((_, i) => i !== index));

dragenter e dragover

Usi `dragenter` per rilevare quando il trascinamento entra per la prima volta nell'area e `dragover` per mantenere attivo lo stato mentre il cursore rimane sopra l'area. Per i figli annidati, usi un contatore: lo incrementi con dragenter, lo decrementi con dragleave e lo reimposti con drop.

Librerie di terze parti

Per le aree di rilascio destinate alla produzione, prenda in considerazione **react-dropzone**: gestisce automaticamente le differenze tra browser, gli attributi ARIA, il filtraggio dei tipi di file e diverse modalità di caricamento.
import { useDropzone } from 'react-dropzone';
const { getRootProps, getInputProps, isDragActive } = useDropzone({
  onDrop: acceptedFiles => setFiles(acceptedFiles),
  accept: { 'image/*': [] },
});

Verifica rapida

Perché deve chiamare e.preventDefault() nel gestore onDragOver?

Riepilogo

Costruisca un'area di rilascio con gli eventi onDragOver, onDragLeave e onDrop. Chiami sempre e.preventDefault() durante dragover e drop. Tenga traccia dello stato isDragging per fornire un feedback visivo. Combini il tutto con un input per file nascosto per consentire la selezione tramite clic.

Prossimo argomento

Lezione successiva: **Caricare file su un'API backend**: utilizzerà FormData e fetch per inviare i file con POST e tenere traccia dell'avanzamento del caricamento.

Domande Frequenti

La lezione «Interfaccia di upload con trascinamento» è gratuita?

Sì — il testo completo di «Interfaccia di upload con trascinamento» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.

Cosa imparerò in «Interfaccia di upload con trascinamento»?

Creare un'area drag-and-drop con gli eventi onDragOver/onDrop e un feedback visivo. Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare React Academy?

Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Interfaccia di upload con trascinamento»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione React Academy?

Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Input non controllati con useRef
  2. Input per file e lettura dei dati
  3. Interfaccia di upload con trascinamento
  4. Caricamento di file su un'API backend
← Torna a React Academy