0Pricing
React Academy · Aula

Interface de envio de arquivos por arrastar e soltar

Crie uma área de arrastar e soltar com eventos onDragOver/onDrop e retorno visual.

Interface de envio de arquivos por arrastar e soltar é uma aula grátis de React Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.

Boas-vindas

Nesta lição, você criará uma zona de carregamento de arquivos com arrastar e soltar em React, usando eventos nativos de arrastar e um feedback visual para orientar os usuários.

Visão geral dos eventos de arrastar

O navegador dispara eventos de arrastar quando os arquivos são arrastados sobre elementos. Os principais eventos são: `dragover` (o arquivo está sobre o elemento), `dragleave` (o arquivo deixa o elemento) e `drop` (o arquivo é solto).

Evitando o comportamento padrão

Por padrão, soltar um arquivo no navegador faz com que ele seja aberto. Chame `e.preventDefault()` em `onDragOver` e `onDrop` para evitar isso.
const handleDragOver = (e) => {
  e.preventDefault();
};
const handleDrop = (e) => {
  e.preventDefault();
  const files = Array.from(e.dataTransfer.files);
  // process files
};

Estado visual ativo

Acompanhe, com um estado booleano, se um arquivo está sendo arrastado sobre a zona. Alterne uma classe CSS para fornecer feedback visual aos usuários, como uma borda destacada.
const [isDragging, setIsDragging] = useState(false);

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

Lendo os arquivos soltos

Os arquivos soltos estão em `e.dataTransfer.files` — um FileList. Converta-o em uma matriz e processe os arquivos.
const handleDrop = (e) => {
  e.preventDefault();
  setIsDragging(false);
  const files = Array.from(e.dataTransfer.files);
  setSelectedFiles(files);
};

Combinando com a navegação por clique

Permita também que a zona de soltar seja clicável, renderizando um campo de arquivo oculto e clicando nele programaticamente quando a zona for clicada.
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))}
/>

Exibindo visualizações dos arquivos

Percorra os arquivos selecionados para exibir seus nomes e tamanhos. Para arquivos de imagem, gere URLs de visualização com URL.createObjectURL e revogue-os em um efeito de limpeza.

Removendo arquivos antes do carregamento

Permita que os usuários removam arquivos antes do carregamento filtrando a matriz de arquivos selecionados. Atualize o estado com a matriz filtrada.
const removeFile = (index) =>
  setSelectedFiles(files => files.filter((_, i) => i !== index));

dragenter versus dragover

Use `dragenter` para detectar quando o arrasto entra inicialmente na zona e `dragover` para manter o estado ativo enquanto o cursor permanece sobre ela. Use um contador para elementos filhos aninhados: incremente em `dragenter`, decremente em `dragleave` e redefina em `drop`.

Bibliotecas de terceiros

Para zonas de soltar em produção, considere **react-dropzone** — ela lida automaticamente com particularidades dos navegadores, atributos ARIA, filtragem por tipo de arquivo e vários modos de carregamento.
import { useDropzone } from 'react-dropzone';
const { getRootProps, getInputProps, isDragActive } = useDropzone({
  onDrop: acceptedFiles => setFiles(acceptedFiles),
  accept: { 'image/*': [] },
});

Verificação rápida

Por que você precisa chamar e.preventDefault() no manipulador onDragOver?

Recapitulação

Crie uma zona de soltar com os eventos onDragOver, onDragLeave e onDrop. Sempre chame e.preventDefault() em dragover e drop. Acompanhe o estado isDragging para fornecer feedback visual. Combine isso com um campo de arquivo oculto para permitir a navegação por clique.

A seguir

Próxima lição: **Carregando arquivos em uma API de backend** — você usará FormData e fetch para fazer POST dos arquivos e acompanhar o progresso do carregamento.

Perguntas Frequentes

A aula “Interface de envio de arquivos por arrastar e soltar” é grátis?

Sim — o texto completo de “Interface de envio de arquivos por arrastar e soltar” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.

O que vou aprender em “Interface de envio de arquivos por arrastar e soltar”?

Crie uma área de arrastar e soltar com eventos onDragOver/onDrop e retorno visual. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar React Academy?

Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Interface de envio de arquivos por arrastar e soltar”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de React Academy?

Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Entradas não controladas com useRef
  2. Entrada de arquivo e leitura de dados de arquivos
  3. Interface de envio de arquivos por arrastar e soltar
  4. Carregando arquivos para uma API de back-end
← Voltar para React Academy