HTML5 Drag & Drop API로 간단한 DND 구현하기 (React)

2024. 11. 24. 18:51· Frontend/html & css

 

업무에서 첨부파일 업로드 솔루션을 적용하는 도중 드래그앤드롭을 구현하게 됐다.

라이브러리를 써야할 정도로 다양한 기능이 필요한 것은 아니여서 html5에서 제공하는 드래그앤드롭 API를 사용했다.

 

아주 간단하게 기능만 동작하는 코드를 가져왔다.

 

State 및 상태 관리

const [files, setFiles] = useState([]);

useEffect(() => {
    console.log(files);
}, [files]);

files가 변경될 때마다 로깅한다.

 

드래그 앤 드롭 이벤트 핸들링

// 드래그 중일 때 이벤트 발생
const handleDragOver = (e) => {
    e.preventDefault();
    e.stopPropagation();
};

// 파일을 드래그 영역 위에 떨어트렸을 때 발생
const handleDropFiles = (e) => {
    e.preventDefault();
    e.stopPropagation();

    setFiles(Array.from(e.dataTransfer.files));
};

Drag & Drop 이벤트를 핸들링하는 로직 부분이다.

 

e.preventDefault()를 설정하지 않을 경우 브라우저의 기본 동작이 발생하게 된다.

크롬 브라우저를 예로 들면 파일을 Drop 시 크롬 탭으로 파일이 열리게 된다.

 

또한 이벤트가 다른 상위 요소로 전파되어 의도하지 않은 동작이 발생되는 것을 방지하기 위해 e.stopPropagation()를 설정해줬다.

 

마지막으로 Drop 이후 files에 이벤트로 받은 파일들을 세팅해줬다.

 

 

UI 렌더링

return (
    <>
        <div
            onDragOver={handleDragOver}
            onDrop={handleDropFiles}
            style={{
                width: "500px",
                height: "100px",
                padding: "20px",
                borderRadius: "8px",
                color: "#6E7894",
                border: "1px dashed #B3BAD3",
                backgroundColor: "#F1F3F6",
            }}
        >
            드래그 앤 드롭
        </div>
        <div style={{ marginTop: "20px", marginBottom: "150px" }}>
            <h4>업로드된 파일:</h4>
            {files.map((file, index) => (
                <p key={index}>{file.name}</p>
            ))}
        </div>
    </>
);

UI는 정말 대충 모양새만 알 수 있도록 ... :)

내가 적용할 솔루션의 경우에는 커스텀 Drag and Drop을 만들었기 때문에 DataTransfer 객체로 변환해서 솔루션 업로더에 추가해줘야 했다.

 

이 부분은 완성되면 또 포스팅을 해야겠다.


 

전체 코드 확인하기

더보기
import React, {useEffect, useState} from "react";

const DragAndDrop = () => {
    const [files, setFiles] = useState([]);

    useEffect(() => {
        console.log(files);
    }, [files]);

    const handleDragOver = (e) => {
        e.preventDefault();
        e.stopPropagation();
    }

    const handleDropFiles = (e) => {
        e.preventDefault();
        e.stopPropagation();

        setFiles(Array.from(e.dataTransfer.files));
    };

    return (
        <>
            <div
                onDragOver={handleDragOver}
                onDrop={handleDropFiles}
                style={{
                    width: "500px",
                    height: "100px",
                    padding: "20px",
                    borderRadius: "8px",
                    color: "#6E7894",
                    border: "1px dashed #B3BAD3",
                    backgroundColor: "#F1F3F6",
                }}>
            </div>
            <div style={{
                marginTop: "20px",
                marginBottom: "150px"
            }}>
                {files.map(file => (<p>{file.name}</p>))}
            </div>
        </>
    )
}

export default DragAndDrop;

 

728x90
저작자표시 (새창열림)

'Frontend > html & css' 카테고리의 다른 글

무료 웹폰트 Pretendard CDN 적용하기  (0) 2024.11.11
iframe 내부 웹 페이지의 css가 깨지는 현상  (1) 2024.10.24
HTML/CSS 스크롤 바 디자인  (0) 2020.05.28
'Frontend/html & css' 카테고리의 다른 글
  • 무료 웹폰트 Pretendard CDN 적용하기
  • iframe 내부 웹 페이지의 css가 깨지는 현상
  • HTML/CSS 스크롤 바 디자인
민57
민57
IT 개발 및 노션 관련 이것저것
youngdevIT 개발 및 노션 관련 이것저것
민57
youngdev
민57
전체
오늘
어제
  • 분류 전체보기 (105)
    • Dev logs (6)
    • Frontend (4)
      • javascript (19)
      • typescript (0)
      • html & css (4)
      • vuejs & reactjs (3)
      • programmers (1)
      • jsp (1)
    • Backend (38)
      • express (1)
      • php (27)
      • git & linux (7)
      • unity (3)
    • 개발 지식 (22)
      • computer science (3)
      • errors (4)
      • tool (8)
      • util (7)
    • Notion (3)
      • template (1)
      • widget (2)
    • 취미 (2)
      • github (1)
      • game (1)
    • 일상 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • miny위젯
  • 자바스크립트모듈
  • 웹사이트모음
  • 맥북필수프로그램
  • 자바스크립트콘솔
  • php기초
  • JS
  • 맥북포맷
  • 노션
  • 리렌더링
  • 티스토리챌린지
  • vue 토이프로젝트
  • PHP
  • javascript
  • 동적선택기
  • vue
  • 토이프로젝트
  • 노션위젯
  • 리액트
  • javascript-archive
  • 오블완
  • 리액트기본
  • 리액트입문
  • notion
  • react
  • vuejs
  • PHP함수
  • 자바스크립트
  • sql문제
  • IntelliJ

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
민57
HTML5 Drag & Drop API로 간단한 DND 구현하기 (React)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.