inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

따라하며 배우는 리액트 A-Z[19버전 반영]

Drag and Drop 기능 추가하기

react-beautiful-dnd 드래그 기능 구현중 에러

1900

Hyeongjun Kim

작성한 질문수 3

0

먼저 제가 작성한 Lists.js의 소스코드는 아래와 같습니다.

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

export default function Lists({ todoData, setTodoData }) {
  //todo Checkbox 클릭했을때 실행되는 함수
  const handleCompletedChange = (id) =>{
    let newTodoData = todoData.map((data) =>{
      if(data.id === id){
        data.completed = !data.completed;
      }
      return data;
    });
    setTodoData(newTodoData);
  };

  //X버튼 클릭시 실행되는 함수
  const handleClick = (id) => {
    let newTodoData = todoData.filter((data) => data.id !== id);
    console.log("newTodoData",newTodoData);
    setTodoData(newTodoData);
  };

  //Drag가 끝날때 실행되는 함수
  const onDragEnd = (result) =>{
    console.log("result", result)
  }

  return (
    <div>
      <DragDropContext onDragEnd={onDragEnd}>
        <Droppable droppableId='todo'>
          {(provided) => (
            <div 
              ref={provided.innerRef}
              {...provided.droppableProps}
            >
              {todoData.map((data, index) => (
                <Draggable
                key={data.id}
                draggableId={data.id.toString()}
                index={index}
                >
                  {(provided, snapshot) => {
                    <div 
                      key={data.id}
                      {...provided.draggableProps}
                      ref={provided.innerRef}
                      {...provided.dragHandleProps}
                      className={`${snapshot.isDragging ? "bg-gray-300": "bg-gray-200"} flex items-center justify-between w-full px-4 py-1 my-2 text-gray-600 rounded bg-gray-200`}
                    >
                      <div className='items-center'>
                        {/* Checkbox */}
                        <input
                          className='mr-3' 
                          type="checkbox" 
                          defaultChecked={data.completed} 
                          onChange={()=>handleCompletedChange(data.id)}
                        />
                        {/* Todo Contents */}
                        <span className={data.completed ? "line-through":"none"}>{data.title}</span>
                      </div>
                      {/* + Button */}
                      <div>
                        <button className='px-4 py-2 float-right text-white' onClick={()=>handleClick(data.id)}>X</button>
                      </div>
                    </div>
                  }}
                </Draggable>
              ))}
              {provided.placeholder}
            </div>
          )}
        </Droppable>
      </DragDropContext>
    </div>
  );
}

스타일 관련부분 말고는 강사님이 작성하신 소스코드와 일치합니다. 그런데 실행하면 위와 같은 오류가 발생합니다. 질문 게시판에서 유사한 사례가 있나 싶어서 찾아봤습니다. index.js 파일에서 Restrict 모드를 제거하면 충돌에러를 없앤다고 하는데 지워도 바뀌는게 없습니다. 무엇이 원인인지 github이나 stackoverflow를 찾아봤는데두 마땅히 나오는게 없네요 ref 라는 이름이 문제일 수도 있다는 글을 보고 innerRef라고 변경해서 작성했는데도 똑같은 에러가 발생했습니다. 이유가 뭔지 알려주시면 감사하겠습니다.

 

혹시 몰라 App.js 의 소스코드는 아래와 같고,

import React, { useState } from "react";
import "./App.css";
import List from "./components/Lists";
import Form from "./components/Form";

function App(){
  const [todoData, setTodoData] = useState([]);
  const [value, setValue] = useState("");  

  //+ 버튼을 눌렀을때 실행되는 함수
  const handleSubmit = (e) =>{
    //form 안의 input에 값을 입력했을때 페이지 리로드 되는걸 막아줌
    e.preventDefault();
    //new todo data
    let newTodo = {
      id:Date.now(),
      title:value,
      completed: false,
    };
    //add new todo data on to the original todo list
    setTodoData((prev) =>[...prev, newTodo]);
    setValue("");
  }

    return(
      <div className="flex items-center justify-center w-screen h-screen bg-blue-100">
        <div className="w-full p-6 m-4 bg-white rounded-lg shadow-md lg:w-3/4 lg:max-w-lg">
          <div className="flex justify-between mb-3">
            <h1 className="text-xl font-mono">Todo-List</h1>
          </div>
          {/* Todo List */}
          <List todoData={todoData} setTodoData={setTodoData}/>
          {/* Todo List add button*/}
          <Form handleSubmit={handleSubmit} value={value} setValue={setValue}/>
          
        </div>
      </div>
    )
}

export default App;

제가 사용한 react와 react-beautiful-dnd의 버전은

{
  "name": "todoapp",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.16.5",
    "@testing-library/react": "^13.4.0",
    "@testing-library/user-event": "^13.5.0",
    "react": "^18.2.0",
    "react-beautiful-dnd": "^13.1.1",
    "react-dom": "^18.2.0",
    "react-scripts": "5.0.1",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "autoprefixer": "^10.4.14",
    "postcss": "^8.4.23",
    "tailwindcss": "^3.3.2"
  }
}

입니다.

react

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

오류 메시지를 살펴보니 아래 코드에서 문제가 발생한 것 같습니다.

{(provided, snapshot) => {
  <div 
    key={data.id}
    {...provided.draggableProps}
    ref={provided.innerRef}
    {...provided.dragHandleProps}
    className={`${snapshot.isDragging ? "bg-gray-300": "bg-gray-200"} flex items-center justify-between w-full px-4 py-1 my-2 text-gray-600 rounded bg-gray-200`}
  >
    {/*...*/}
  </div>
}}

위의 함수는 JSX를 반환해야 하는데 중괄호 안에 JSX를 작성하지 않았습니다. 아래와 같이 작성해 보시겠어요?

{(provided, snapshot) => (
  <div 
    key={data.id}
    {...provided.draggableProps}
    ref={provided.innerRef}
    {...provided.dragHandleProps}
    className={`${snapshot.isDragging ? "bg-gray-300": "bg-gray-200"} flex items-center justify-between w-full px-4 py-1 my-2 text-gray-600 rounded bg-gray-200`}
  >
    {/*...*/}
  </div>
)}

이제 실행하시면 제대로 동작할 것입니다. 다른 문제가 있으면 언제든지 댓글로 답변해주세요. 감사합니다.

강의 소스 코드 압축 풀기 오류

0

72

1

런타임 에러 ㅠㅠ

0

87

1

강의대로 따라갔는데 에러보다 api키로 들어간 넷플릭스? 그런게 렌더링 되지 않습니다 ㅠ

0

104

1

안녕하세요 개발과 상관없는 질문입니다만

0

111

1

리액트 라우터 관련

0

104

1

react-beatiful-dnd에서 문제가 발생합니다.

0

103

1

react19에서는 react-beautiful-dnd가 설치되지 않습니다.

0

816

1

useEffect로 사용을 해도 되나요?

0

201

1

넷플릭스 오리지널 제외하고 슬라이드가 동작을 안합니다.

0

195

1

react 19의 useActionState가 더이상 isPending은 지원하지 않는 듯합니다

0

281

2

리액트 dockderfile 작성 시 COPY 질문

0

147

1

next.js에서부터는 react query 필요없는지

0

320

1

기능

0

197

1

오류가 안보여요

0

197

1

CSS

0

218

1

local storage

0

212

1

list컴포넌트 생성하기

0

224

1

검색어 입력 후 초기화하는 방법 궁금합니다!

0

332

1

Banner.css에 대해서

0

448

1

플러그인이 추천을 안해줍니다

0

322

1

마이너스버튼 테스트

0

279

2

리액트 서버 실행 오류

0

1157

2

오류메세지는 확인했는데 어떻게 고쳐야 할지 모르겠습니다 ㅠ

0

298

1

creactStore질문이요

1

285

2