가수면

React beautiful dnd 본문

React/라이브러리

React beautiful dnd

니비앙 2023. 3. 23. 17:40

※ React 18 버전에서 StrictMode모드 삭제해야 적용됨

설치

npm i react-beautiful-dnd

npm i --save-dev @types/react-beautiful-dnd

 

 

기본 형태

import React from "react";
import { DragDropContext, Draggable, Droppable } from "react-beautiful-dnd";

const Trello = () => {
  const onDragEnd = () => {};
  return (
    <DragDropContext onDragEnd={onDragEnd}>
      <div>
// droppableId는 string이어야 함
        <Droppable droppableId="one">
          {(provided) => (
            <ul ref={provided.innerRef} {...provided.droppableProps}>
              <Draggable draggableId="first" index={0}>
                {(provided) => (
                  <li ref={provided.innerRef} {...provided.draggableProps}>
                    <span {...provided.dragHandleProps}>🔥</span>
                    one
                  </li>
                )}
              </Draggable>
            </ul>
          )}
        </Droppable>
      </div>
    </DragDropContext>
  );
};

export default Trello;

<Droppable> , <Draggable>

children이 함수여야함

 

dragHandleProps
특정 영역을 통해서만 드래그를 가능하도록 하고 싶을 때 사용한다.

 

드래그하면 박스 크기 바뀔 때

placeholder 추가

/ ...
        <Droppable droppableId="one">
          {(provided) => (
/ ...
            {provided.placeholder}
          )}
        </Droppable>
/ ...

 

드래그 이벤트

<Droppable> , <Draggable>의 snapshot을 이용해 드래그 유무 확인하기
/ ...
	<Droppable droppableId={boardId}>
        {(provided, snapshot) => (
/ ...
// snapshot의 형식 정의

export interface DroppableStateSnapshot {
// 드래그를 통해 옮기려는 박스에 들어오고 있는지 확인 유무
    isDraggingOver: boolean;
    draggingOverWith: DraggableId | null | undefined;
// 드래그를 시작했는지 확인 유무
    draggingFromThisWith: DraggableId | null | undefined;
    isUsingPlaceholder: boolean;
}


export interface DraggableStateSnapshot {
    isDragging: boolean;
    isDropAnimating: boolean;
    isClone: boolean;
    dropAnimation: DropAnimation | null | undefined;
    draggingOver: DroppableId | null | undefined;
    // the id of a draggable that you are combining with
    combineWith: DraggableId | null | undefined;
    // a combine target is being dragged over by
    combineTargetFor: DraggableId | null | undefined;
    // What type of movement is being done: 'FLUID' or 'SNAP'
    mode: MovementMode | null | undefined;
}

위 타입을 props로 내려줌으로써 css의 분기처리를 해줄 수 있다.

// Board.tsx

      <Droppable droppableId={boardId}>
        {(provided, snapshot) => (
          <Area
            isDraggingOver={snapshot.isDraggingOver}
            isDraggingFromThis={Boolean(snapshot.draggingFromThisWith)}
 // ...
 
 const Area = styled.div<IAreaProps>`
  background-color: ${(props) => (props.isDraggingOver ? "pink" : props.isDraggingFromThis ? "red" : "blue")};
  flex-grow: 1;
  transition: background-color 0.3s ease-in-out;
`;
// DraggableCard.tsx

    <Draggable draggableId={todo} index={index}>
      {(provided, snapshot) => (
        <Card
          isDragging={snapshot.isDragging}
// ...

const Card = styled.li<{ isDragging: boolean }>`
  border-radius: 5px;
  margin-bottom: 5px;
  padding: 10px;
  background-color: ${(props) => (props.isDragging ? "#e4f2ff" : props.theme.cardColor)};
  box-shadow: ${(props) => (props.isDragging ? "0px 2px 5px rgba(0, 0, 0, 0.05)" : "none")};
`;

'React > 라이브러리' 카테고리의 다른 글

Tailwind CSS  (1) 2023.06.08
[Framer Motion] Framer Motion  (0) 2023.03.28
[React Query] 비동기 취소하기  (0) 2023.01.12
[React Query] 인증  (0) 2023.01.11
[React Query] useInfiniteQuery  (0) 2023.01.09
Comments