드래그 앤 드롭(Drag and Drop) 기능은 사용자가 요소를 마우스로 클릭하여 드래그한 후, 다른 위치로 드롭하는 기능을 말합니다. 이는 웹 애플리케이션에서 사용자 경험을 향상시키는 중요한 기능 중 하나입니다. 이번 기술 블로그에서는 Immer 라이브러리를 사용하여 React 애플리케이션에서 드래그 앤 드롭 기능을 구현하는 방법을 알아보겠습니다.
Immer란?
Immer는 불변성을 유지하면서 상태를 수정하기 위한 JavaScript 라이브러리입니다. 이 라이브러리는 제어 가능한 불변성을 제공하며, 가독성과 효율성을 높이기 위해 상태 변경을 간소화합니다. 이를 통해 복잡한 상태 관리 로직과 상태 업데이트 코드를 간편하게 작성할 수 있습니다.
드래그 앤 드롭 구현하기
이제 Immer를 사용하여 React 애플리케이션에서 드래그 앤 드롭 기능을 구현해보겠습니다. 아래는 간단한 예시 코드입니다.
import React, { useState } from 'react';
import { produce } from 'immer';
const App = () => {
const [items, setItems] = useState([
{ id: 1, text: 'Item 1' },
{ id: 2, text: 'Item 2' },
{ id: 3, text: 'Item 3' }
]);
const handleDragStart = (e, index) => {
e.dataTransfer.setData('text/plain', index);
};
const handleDragOver = (e, index) => {
e.preventDefault();
};
const handleDrop = (e, dropIndex) => {
const dragIndex = e.dataTransfer.getData('text/plain');
setItems(
produce(items, draft => {
const draggedItem = draft[dragIndex];
draft[dragIndex] = draft[dropIndex];
draft[dropIndex] = draggedItem;
})
);
};
return (
<div>
{items.map((item, index) => (
<div
key={item.id}
draggable
onDragStart={e => handleDragStart(e, index)}
onDragOver={e => handleDragOver(e, index)}
onDrop={e => handleDrop(e, index)}
>
{item.text}
</div>
))}
</div>
);
};
export default App;
위의 예시 코드에서는 useState 훅을 사용하여 items 배열을 상태로 관리합니다. handleDragStart 함수는 드래그를 시작할 때 호출되는 이벤트 핸들러로, 드래그 중인 요소의 인덱스를 dataTransfer로 전달합니다. handleDragOver 함수는 드래그 중인 요소를 드롭할 수 있는 위치인지 확인하기 위해 호출되는 이벤트 핸들러입니다. handleDrop 함수는 드롭 시 호출되는 이벤트 핸들러로, Immer의 produce 함수를 사용하여 items 배열을 변경합니다.
드래그 앤 드롭을 구현하기 위해 각 요소를 draggable로 설정하고, onDragStart, onDragOver, onDrop 이벤트 핸들러를 등록합니다.
마무리
Immer를 사용하여 React 애플리케이션에서 드래그 앤 드롭 기능을 구현하는 방법에 대해 알아보았습니다. Immer를 활용하면 불변성을 유지하면서 간단하고 가독성이 좋은 코드를 작성할 수 있습니다.
이 포스트가 도움이 되었기를 바랍니다! #Immer #드래그앤드롭