어쩌다 알게 된 ƪ(•̃͡•̃͡ ƪ

[React] drag&drop sortable 리액트 라이브러리 , react-sortable-hoc 본문

개발/🟦 React

[React] drag&drop sortable 리액트 라이브러리 , react-sortable-hoc

비니_ 2025. 4. 12. 18:16
728x90

 

 

npm install react-sortable-hoc

 

구성 요소 설명
sortableContainer 리스트 전체를 감싸는 컨테이너 (드래그 영역 설정)
sortableElement 개별 아이템을 드래그 가능한 요소로 만들어줌
onSortEnd 아이템 순서를 바꿨을 때 실행되는 콜백 함수

 

import React, { useState } from 'react';
import { sortableContainer, sortableElement } from 'react-sortable-hoc';
import arrayMove from 'array-move'; // 배열 순서를 바꿔주는 유틸

// 각 아이템을 드래그 가능하게 만드는 컴포넌트
const SortableItem = sortableElement(({ value }) => (
  <li style={{ padding: '10px', border: '1px solid gray', marginBottom: '5px' }}>{value}</li>
));

// 리스트 전체를 드래그 가능하게 감싸주는 컴포넌트
const SortableList = sortableContainer(({ items }) => {
  return (
    <ul>
      {items.map((value, index) => (
        <SortableItem key={`item-${value}`} index={index} value={value} />
      ))}
    </ul>
  );
});

export default function SortableExample() {
  const [items, setItems] = useState(['하나', '둘', '셋', '넷']);

  // 순서가 바뀌었을 때 실행되는 콜백
  const onSortEnd = ({ oldIndex, newIndex }) => {
    setItems(prev => arrayMove(prev, oldIndex, newIndex));
  };

  return (
    <div>
      <h2>정렬 가능한 리스트</h2>
      <SortableList
        items={items}
        onSortEnd={onSortEnd}
        axis="y"          // 세로 정렬
        pressDelay={200} // 0.2초 꾹 눌러야 드래그됨 (모바일 UX 고려)
      />
    </div>
  );
}

 

포인트 설명
index 각각의 아이템에 꼭 있어야 함. 리스트의 순서를 인식하기 위한 기준.
arrayMove oldIndex에서 newIndex로 배열을 이동시켜주는 유틸. 직접 구현도 가능하지만 이게 제일 편함.
pressDelay 모바일 UX를 고려해 일정 시간 꾹 눌러야 드래그가 시작되게 함. 데스크탑은 없어도 OK.
axis="y" 드래그 방향 제한. "y"는 세로, "x"는 가로. 필요에 따라 고정.
lockAxis="y" 드래그 중 이동 방향을 완전히 고정. 원하지 않는 흔들림을 방지.
helperClass 드래그하는 동안 적용되는 CSS 클래스. 스타일 조절할 때 유용.
distance 드래그 시작 전 마우스를 얼마나 이동해야 드래그가 시작될지 설정. pressDelay 대체 가능.
useDragHandle 리스트의 전체가 아니라 특정 영역만 드래그 가능하게 할 수 있음. ex) 아이콘만 드래그.
shouldCancelStart 특정 조건에서 드래그를 막고 싶을 때 사용. (예: 인풋 클릭 시)

 

array-move 유틸 따로 설치 필요

npm install array-move

 

 

 

728x90
Comments