다음은 React 컴포넌트로 드래그로 요소를 선택하는 기능을 구현한 예제입니다. 드래그하는 동안 선택 영역에 포함된 요소들을 감지하여 선택된 요소들을 표시합니다. CSS 스타일은 별도의 styles.css 파일에서 정의합니다.
import React, { useState } from 'react';
import './styles.css'; // 스타일 시트를 import
function DragSelect() {
const [isDragging, setIsDragging] = useState(false); // 드래그 상태를 관리하는 상태
const [startX, setStartX] = useState(0); // 드래그 시작 X 좌표
const [startY, setStartY] = useState(0); // 드래그 시작 Y 좌표
const [endX, setEndX] = useState(0); // 드래그 끝 X 좌표
const [endY, setEndY] = useState(0); // 드래그 끝 Y 좌표
const [selectedItems, setSelectedItems] = useState([]); // 선택된 요소들을 저장하는 배열
// 드래그 시작 핸들러
const handleMouseDown = (event) => {
setIsDragging(true); // 드래그 시작
setStartX(event.clientX); // 드래그 시작 X 좌표 설정
setStartY(event.clientY); // 드래그 시작 Y 좌표 설정
setSelectedItems([]); // 새로운 드래그 시작시 선택된 요소 배열 초기화
};
// 드래그 중 핸들러
const handleMouseMove = (event) => {
if (!isDragging) return; // 드래그 중이 아니면 무시
setEndX(event.clientX); // 드래그 끝 X 좌표 설정
setEndY(event.clientY); // 드래그 끝 Y 좌표 설정
// 드래그 영역 계산
const minX = Math.min(startX, endX);
const minY = Math.min(startY, endY);
const maxX = Math.max(startX, endX);
const maxY = Math.max(startY, endY);
// 선택된 요소 찾기
const newSelectedItems = Array.from(document.querySelectorAll('.selectable')).filter(item => {
const rect = item.getBoundingClientRect();
return rect.left < maxX && rect.right > minX && rect.top < maxY && rect.bottom > minY;
});
setSelectedItems(newSelectedItems); // 선택된 요소들 업데이트
};
// 드래그 종료 핸들러
const handleMouseUp = () => {
setIsDragging(false); // 드래그 종료
};
return (
<div
className="container"
onMouseDown={handleMouseDown}
onMouseMove={handleMouseMove}
onMouseUp={handleMouseUp}
>
{/* 선택 가능한 요소들 */}
<div className="selectable">Item 1</div>
<div className="selectable">Item 2</div>
<div className="selectable">Item 3</div>
<div className="selectable">Item 4</div>
<div className="selectable">Item 5</div>
{/* 선택된 요소들을 표시 */}
{selectedItems.map((item, index) => (
<div key={index} className="selected-item">{item.textContent}</div>
))}
</div>
);
}
export default DragSelect;