解决 react-beautiful-dnd “Unable to find draggable element with id“ 错误的方法

解决 “Unable to find draggable element with id” 错误的方法

⭐️最近在使用 "react-beautiful-dnd" 拖拽库时,遇到 "Unable to find draggable element with id" 错误。

🚀 这个错误表示拖拽库无法找到与指定的 draggableId 匹配的可拖拽元素。本篇博客将解释该错误的常见原因以及如何解决它。(最后有彩蛋🌈)

错误提示如下👇

问题描述

问题描述

"Unable to find draggable element with id" 错误通常发生在以下情况:

  • 当你拖拽一个元素时,拖拽库无法找到匹配 draggableId 的可拖拽元素。
  • 这个错误可能会在控制台中显示,通常伴随着一些堆栈跟踪信息,但通常没有足够的信息来迅速定位问题。

常见原因

以下是可能导致 "Unable to find draggable element with id" 错误的常见原因:

  1. 拼写错误: draggableId 的值拼写错误或包含额外的空格,与实际的可拖拽元素的 ID不匹配。

  2. 未正确包装元素: 没有正确使用 Draggable 组件来包装可拖拽的元素,或者没有为 draggableId 提供正确的值。

  3. 数据同步问题: 如果你的拖拽元素是从后端数据动态渲染的,可能需要确保数据的同步性。如果数据在渲染之前被改变,可能导致无法找到匹配的 draggableId

  4. 其他错误: 其他与拖拽相关的错误,如逻辑错误,也可能导致这个问题。

🌰下面是我的数据结构

const initialData = [
  {
    id: 'column1',
    title: 'Column 1',
    tasks: [
      { id: 'task1', content: 'Task 1' },
      { id: 'task2', content: 'Task 2' },
      { id: 'task3', content: 'Task 3' },
    ],
  },
  {
    id: 'column2',
    title: 'Column 2',
    tasks: [
      { id: 'task4', content: 'Task 4' },
      { id: 'task5', content: 'Task 5' },
    ],
  },
];
  • 在这个案例中,draggableId 的值与数据结构中的对象的 id 属性一致,确保了匹配。这是因为 “react-beautiful-dnd” 需要正确的 draggableId 来识别要拖拽的元素。

  • 所以,如果你想要拖拽 task 1 元素,你的 draggableId 应该是 task1,以与数据结构中的 id 属性匹配。如果你希望拖拽 Column 1列,你的 draggableId 应该是 column1 以匹配数据结构中的列的 id 属性。

  • 确保在设置 draggableId 时使用正确的值,以匹配要拖拽的元素在数据结构中的唯一标识符。如果你在设置 draggableId 时出现错误,可能会导致 "Unable to find draggable element with id" 错误。

代码示例

🌰以下是一个示例代码,演示了如何使用 "react-beautiful-dnd" 来设置可拖拽元素和容器:

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

// 使用数组代表列,每个列中包含一个任务数组
const initialData = [
  {
    id: 'column1',
    title: 'Column 1',
    tasks: [
      { id: 'task1', content: 'Task 1' },
      { id: 'task2', content: 'Task 2' },
      { id: 'task3', content: 'Task 3' },
    ],
  },
  {
    id: 'column2',
    title: 'Column 2',
    tasks: [
      { id: 'task4', content: 'Task 4' },
      { id: 'task5', content: 'Task 5' },
    ],
  },
};

function App() {
  const onDragEnd = (result) => {
    // 在拖放结束时的处理逻辑
  };

  return (
    <DragDropContext onDragEnd={onDragEnd}>
      <Droppable droppableId="outer-container" direction="horizontal" type="column">
        {(provided) => (
          <div
            ref={provided.innerRef}
            {...provided.droppableProps}
          >
            {initialData.map((column, index) => (
              <Draggable draggableId={column.id} index={index} key={column.id}>
                {(provided) => (
                  <div
                    ref={provided.innerRef}
                    {...provided.draggableProps}
                    {...provided.dragHandleProps}
                  >
                    <Droppable droppableId={column.id} type="task">
                      {(provided) => (
                        <div
                          ref={provided.innerRef}
                          {...provided.droppableProps}
                        >
                          {column.tasks.map((task, taskIndex) => (
                            <Draggable draggableId={task.id} index={taskIndex} key={task.id}>
                              {(provided, snapshot) => (
                                <div
                                  ref={provided.innerRef}
                                  {...provided.draggableProps}
                                  {...provided.dragHandleProps}
                                >
                                  {task.content}
                                </div>
                              )}
                            </Draggable>
                          ))}
                        </div>
                      )}
                    </Droppable>
                  </div>
                )}
              </Draggable>
            ))}
          </div>
        )}
      </Droppable>
    </DragDropContext>
  );
}

export default App;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
react-beautiful-dnd是一个用于实现拖放功能的React库。它提供了一个优雅的方式来实现复杂的拖放交互,并且在性能方面也表现出色。 官方示例展示了如何在React中使用react-beautiful-dnd来创建一个基本的拖放列表。该示例使用两个列表,左侧列表中有一些颜色方块,右侧列表为空。 首先,我们需要引入所需的库和组件。然后,在页面上创建两个容器,一个用于左侧列表,一个用于右侧列表。接下来,我们需要定义一个状态来存储列表项的数据。在示例中,数据是一个包含颜色方块的数组。我们还需要定义一个函数来处理列表项的拖动和放置操作。 然后,我们可以使用react-beautiful-dnd提供的DragDropContext组件来包裹整个应用,并将其附加到页面的根元素上。这样可以确保拖放操作在整个应用中生效。 接下来,我们需要在左侧列表容器中渲染颜色方块列表,并使用Draggable组件对每个方块进行包装。我们还需要在Draggable组件上设置一个唯一的ID,并使用DragHandleProps和DraggableProps来传递拖动和放置操作的属性。 最后,我们需要在右侧列表容器中渲染一个Droppable组件,以表示可以将颜色方块拖放到其中。并且,我们需要在Droppable组件上使用DroppableProps来传递拖放操作的属性。 通过以上步骤,我们就可以创建一个简单的拖放列表。当我们拖动一个颜色方块时,react-beautiful-dnd会自动处理其它方块的重新排序和位置更新。同时,我们还可以添加一些自定义的逻辑来实现更复杂的拖放交互效果。 总之,react-beautiful-dnd官方示例展示了如何使用这个库来创建一个基本的拖放列表。通过这个示例,我们可以学习到如何在React中使用react-beautiful-dnd,并了解其强大的拖放功能和灵活的配置选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值