首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用react-beautiful dnd和material ui在两列之间拖放项目

React Beautiful DND是一个用于实现拖放功能的React库,而Material UI是一个流行的React UI组件库。结合这两个库,我们可以很容易地实现在两列之间拖放项目的功能。

首先,我们需要安装React Beautiful DND和Material UI的相关依赖包。可以使用npm或者yarn进行安装。

代码语言:txt
复制
npm install react-beautiful-dnd @material-ui/core

接下来,我们需要导入所需的组件和样式。

代码语言:txt
复制
import React from 'react';
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
import { List, ListItem, ListItemText } from '@material-ui/core';

然后,我们需要定义两个列的数据和状态。

代码语言:txt
复制
const initialData = {
  column1: {
    id: 'column1',
    title: '列1',
    items: [
      { id: 'item1', content: '项目1' },
      { id: 'item2', content: '项目2' },
      { id: 'item3', content: '项目3' },
    ],
  },
  column2: {
    id: 'column2',
    title: '列2',
    items: [],
  },
};

const [data, setData] = React.useState(initialData);

接下来,我们需要编写处理拖放事件的函数。

代码语言:txt
复制
const onDragEnd = (result) => {
  const { source, destination } = result;

  // 如果没有有效的目标位置,则直接返回
  if (!destination) {
    return;
  }

  // 如果拖放的位置没有发生变化,则直接返回
  if (
    source.droppableId === destination.droppableId &&
    source.index === destination.index
  ) {
    return;
  }

  // 获取拖放的项目
  const item = data[source.droppableId].items[source.index];

  // 从源列中移除项目
  const sourceColumn = {
    ...data[source.droppableId],
    items: [...data[source.droppableId].items],
  };
  sourceColumn.items.splice(source.index, 1);

  // 将项目插入目标列中
  const destinationColumn = {
    ...data[destination.droppableId],
    items: [...data[destination.droppableId].items],
  };
  destinationColumn.items.splice(destination.index, 0, item);

  // 更新数据状态
  setData({
    ...data,
    [source.droppableId]: sourceColumn,
    [destination.droppableId]: destinationColumn,
  });
};

最后,我们需要渲染两列和拖放功能。

代码语言:txt
复制
const App = () => {
  return (
    <DragDropContext onDragEnd={onDragEnd}>
      <Droppable droppableId="column1">
        {(provided) => (
          <List
            ref={provided.innerRef}
            {...provided.droppableProps}
          >
            {data.column1.items.map((item, index) => (
              <Draggable
                key={item.id}
                draggableId={item.id}
                index={index}
              >
                {(provided) => (
                  <ListItem
                    ref={provided.innerRef}
                    {...provided.draggableProps}
                    {...provided.dragHandleProps}
                  >
                    <ListItemText primary={item.content} />
                  </ListItem>
                )}
              </Draggable>
            ))}
            {provided.placeholder}
          </List>
        )}
      </Droppable>
      <Droppable droppableId="column2">
        {(provided) => (
          <List
            ref={provided.innerRef}
            {...provided.droppableProps}
          >
            {data.column2.items.map((item, index) => (
              <Draggable
                key={item.id}
                draggableId={item.id}
                index={index}
              >
                {(provided) => (
                  <ListItem
                    ref={provided.innerRef}
                    {...provided.draggableProps}
                    {...provided.dragHandleProps}
                  >
                    <ListItemText primary={item.content} />
                  </ListItem>
                )}
              </Draggable>
            ))}
            {provided.placeholder}
          </List>
        )}
      </Droppable>
    </DragDropContext>
  );
};

这样,我们就完成了在两列之间拖放项目的功能。当用户拖动项目时,onDragEnd函数会被调用,我们可以在该函数中更新数据状态,从而实现项目的拖放效果。

推荐的腾讯云相关产品:腾讯云云服务器(CVM)和腾讯云对象存储(COS)。

  • 腾讯云云服务器(CVM):提供弹性计算能力,可根据业务需求快速创建、部署和扩展云服务器实例。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务,适用于存储和处理各种类型的文件和数据。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

你不知道的33个令人惊艳的React开发库

material-ui image.png MUI 提供了一套全面的 UI 工具,可帮助您更快地发布新功能。...从 Material UI(我们完全加载的组件库)开始,或者将您自己的设计系统引入我们的生产就绪组件中。...react-icons image.png 使用react-icons可以轻松地React项目使用流行的图标,它利用ES6导入,支持按需打包。...用户可以在窗口中的任何位置拖放甚至选择文件。 react-dnd image.png React DnD 是一组 React 实用程序,可帮助您构建复杂的拖放界面,同时保持组件解耦。...storybook image.png Storybook 是一个用于独立构建 UI 组件页面的前端研讨会。成千上万的团队使用它进行 UI 开发、测试和文档编制。它是开源且免费的。

28420

回望过去,展望未来- 2024 React 生态一览表

以下知识点,请「酌情使用」。 ❞ 无头 UI 无头 UI(Headless UI)是指提供 UI 元素交互逻辑、状态、处理 API 的库工具,但不提供标记(markup)、样式或预先构建的实现。...它有VueReact的版本。 3. Material-UI Material-UI[18] 是一个受欢迎且得到良好维护的 React UI 框架。...数据可视化 一下大屏项目或者后天项目中,总是会有数据可视化的需求。下面的几个库可以帮助我们创建交互式信息丰富的图表图形。...(我的待写清单中,其实有一篇关于draggable的内容,等哪天总结一下,给大家分享出来) 解决方案 DND Kit[37] 用于拖放功能 DND Kit 是一个功能强大的库,用于为我们的 React...它提供了一种简单且可定制的方式来实现重新排序、重新排列或组织用户界面中的元素的拖放功能。 react-dnd[38]这是一个老牌的Dnd库。

52810

现代 React 开发必备的 13 个神库,路由、UI 组件库、拖拽、虚拟列表都齐了

MUI Core 包含 4 个用于更快构建和交付 UI 的基础库: Material UI: Material UI 是一个实现了 Google Material Design 的 React UI...(来源: Material UI) Joy UI: Joy UI 是一个使用 React 构建的漂亮设计的 UI 组件库,旨在为开发过程带来乐趣。...React Bootstrap 提供了一个组件库,这些组件具有易于使用的功能、状态管理默认可访问性,使其成为开始构建应用程序 UI 的不错选择。...几乎所有的工业级应用程序都有某种形式的拖放功能。 React DND是一个帮助你构建基于拖放功能的 React 应用程序的库。为此,它使用了HTML5 拖放 API。...这个库使用起来相当简单,实际应用中有许多有趣创新的用例。它在GitHub上拥有超过 19K stars,NPM上拥有超过 180 万次周下载量(2023 年 8 月数据)。 6.

1.7K30

React DnD

不像其它库一样提供无穷尽的Draggable Component应对常见业务场景,React DnD从相对底层的角度提供支持,是对拖放能力的抽象与封装,通过抽象来简化使用,通过封装来屏蔽下层差异 二.术语概念...ItemType Item是对元素/组件的抽象理解,拖放的对象不是DOM元素或React组件,而是特定数据模型(Item): An item is a plain JavaScript object...Type作为萝卜(drag source)坑(drop target)的匹配依据,相当于经典DnD库的group name Monitor Monitor是拖放状态的集合,比如拖放操作是否正在进行,是的话萝卜是哪个坑是哪个...就是基于Redux实现的,见下文核心实现部分 Connector Connector用来建立DOM抽象(React)与DnD Backend需要的具体DOM元素之间的联系: The connectors...Drag Source与Drop Target 上面提到过这个东西,可以称之为DnD Role,表示DnD中所饰角色,除了drag sourcedrop target外,还有一个叫drag preview

1.4K30

做了N+1个企业项目之后, 我总结了这些React必备插件

UI 移动端组件库 MaterialUI 世界最受欢迎的基于质感设计的React UI库 React toolbox 一套使用CSS模块功能实现Google的Material Design规范的React...组件 React Virtualized 一个能渲染大型列表表格的React解决方案 Fabric UI 微软开源的UX框架的集合,用于创建共享代码,设计交互行为的精美的跨平台应用程序 React...react-desktop与NW.jsElectron.js完美结合,但是可以在任何JavaScript驱动的项目使用 Zent 有赞 PC 端 WebUI 规范的 React 实现,提供了一整套基础的...AntV 包含 G2、G6、F2、L7 以及一套完整的图表使用设计规范, 提供强大的数据可视化需求 G2Plot 基于G2封装的开箱即用的可视化组件库 recharts 使用ReactD3构建的自定义的图表库...react-beautiful-dnd 漂亮,可移植性 列表拖拽库 react-dnd 可帮助我们构建复杂的拖放界面,同时保持组件的分离 react-moveable 支持自由拖拽, 缩放, 参考线的灵活强大的拖拽库

2K10

有趣的拖放案例

引言拖放可能看起来像一个简单的用户交互,其中你拾取一个项目并将其放置在其他地方,类似于Trello板或任何看板样式界面上组织项目,其中卡片或信息可以轻松通过点击拖动进行重新排列。...问题**epilot,我们应用程序的不同部分广泛使用了react-beautiful-dnd。然而,尝试一些复杂的场景时,我们某些情境中遇到了一些障碍,它无法准确预测元素的放置位置。...由于这些边缘情况,基于拖放位置移动元素数据的代码变得混乱不堪。react-beautiful-dnd停止维护支持也不利于继续使用它的理由。...dnd-kit的关键优势包括:零依赖优化的性能可访问性支持多种输入方法全面的文档示例演示代码这里是使用个库进行简单拖放的代码。...它使用Sortable来解决这个问题,因为这是它解决的用例之一。它符合我们解决更复杂的嵌套拖放场景以及不同级别拖动的能力的目标。

18200

【前端拖拽组件库】最强开源高性能组件库Pragmatic-drag-and-drop简介与分析

Atlassian 研发这个前端组件库的时候,是奔着实用主义去的,一般我们理解使用实用都会好想到:体积小,性能高,好用,使用,简单易用等关键字,没错,Pragmatic-drag-and-drop就是一个非常关注性能的拖放库...Pragmatic-drag-and-drop已经完成了很多用户设计指南,其中体现了我们希望如何在产品中实现拖放,其中一些决策体现在一些可选包中。当然,也运行可以自由使用喜欢的任何设计语言。...下面再附上一张Pragmatic-drag-and-drop与react-beatiful-dnd的简单对比图,方便同学们更加直观的对比俩者之间的功能,Pragmatic-drag-and-drop真的非常的...四、实操教程下面我们将根据官网的一个实例,学习使用 Pragmatic-drag-and-drop实现一些基本功能,包括可拖放拖放目标监视器,我们将创建一个带有可拖动棋子的棋盘,效果图如下:1.构建可拖动棋子我们第一步是允许棋子被拖动...'lightgrey' : 'white';}3.移动棋子最后实现棋子掉落时移动方块,我们将使用monitorForElements实用的拖放功能。监视器允许从代码库中的任何位置观察拖放交互。

88010

整理了12款开源拖拽库, 轻松上手可视化搭建

目前我把整理的可视化相关的开源项目都汇总到如下的网站中,其中包含拖拽搭建,可视化搭建开源项目酷炫的开源图表库,感兴趣的可以收藏一下~: 可视化导航地址:http://wep.turntip.cn/web...Sortable 「Sortable」 —是一个「JavaScript」库,用于现代浏览器触摸设备上对拖放列表进行重新排序。无需「jQuery」。...有很多库允许React中的拖放交互. 其中最值得注意的是惊人的「react-dnd」. 它提供了一套非常出色的拖放函数,这些函数特定情况下非常适用疯狂地不一致的html5拖放功能....「react-beautiful-dnd」 是为垂直水平列表专门构建的更高级别的抽象. 该功能的子集内「react-beautiful-dnd」提供强大,自然和美丽的拖放体验....8. dnd kit 「dndkit」 可以让我们轻松构建拖放界面, 而无需每次项目需要移动位置时都更新「dom」.

53420

拖拽神器React DnD你真的了解了吗?

简介 最近在研究用 React 绘制拓扑图的时候涉及到了 HTML5 拖放 API,了解到了 React DnD 这个拖放神器。...React DnD 帮我们封装了一系列的拖放 API,大大简化了拖放 API 的使用方式,今天就结合下面这个示例给大家介绍下 React DnD 的用法。...通过它可以获取当前的拖拽信息,比如可以获取当前被拖拽的项目及其类型,当前初始坐标偏移,以及它是否已被删除。 component:是组件的实例。...通过它可以获取当前的拖拽信息,比如可以获取当前被拖拽的项目及其类型,当前初始坐标偏移,以及它是否已被删除。 component:是组件的实例。...DragDropContext && DragDropContextProvider 使用 DragSource DropTarget 包裹的组件必须放置 DragDropContext 或者 DragDropContextProvider

1.4K20

前端10大开源拖拽排序库汇总, 让搭建,更简单

「interact.js Pro」 使用更多的调节器扩展了该开源功能,更多复杂的内置交互,框架集成,高级开发工具,用于节省我们的事件js开销。...Sortable 「Sortable」 —是一个「JavaScript」库,用于现代浏览器触摸设备上对拖放列表进行重新排序。无需「jQuery」。...有很多库允许React中的拖放交互. 其中最值得注意的是惊人的「react-dnd」. 它提供了一套非常出色的拖放函数,这些函数特定情况下非常适用疯狂地不一致的html5拖放功能....「react-beautiful-dnd」 是为垂直水平列表专门构建的更高级别的抽象. 该功能的子集内「react-beautiful-dnd」提供强大,自然和美丽的拖放体验....8. dnd kit 「dndkit」 可以让我们轻松构建拖放界面, 而无需每次项目需要移动位置时都更新「dom」.

5.3K21

【JS】1724- 重学 JavaScript API - Drag and Drop API

这个 API 提供了一系列的事件方法,使我们能够轻松地处理拖放操作。 1.2 作用使用场景 拖放 API 作用在于使网页具备拖放功能,为用户提供更直观、灵活的交互体验。...如何使用 使用拖放 API 主要包括以下 3 个步骤: 「定义可拖拽的(draggable)元素」:将需要拖动的元素标记为可拖拽,并指定相应的事件处理逻辑。...通过这样的实现,用户可以轻松地将图片拖动到不同的相册中进行分类管理。 3.2 项目任务管理应用 项目任务管理应用中,用户可以通过拖动任务卡片进行排序、分组或更改任务状态。...下面是一个简单的示例代码,演示了如何使用拖放 API 实现项目任务管理应用中的拖放功能: <div class="task" draggable="true...总结 本文主要介绍了 Drag and Drop API,我们了解了这个 API 的作用<em>和</em><em>如何</em><em>使用</em>,<em>在</em>文章中还通过一些常见<em>使用</em>示例<em>和</em>大家展示代码<em>如何</em>实现,最后还给出一些<em>使用</em>建议和注意,希望大家能够更好的了解

21920

总结100+前端优质库,让你成为前端百事通

事件之间的 300ms 的延迟。..., 并且可以 React、Vue、Angular 项目使用 「Scroll Reveal」 零依赖,为 web 移动浏览器提供了简单的滚动动画,以动画的方式显示滚动中的内容 「Kute.js」 一个强大高性能且可扩展的原生...鼠标/键盘相关 「KeyboardJS」 一个浏览器中使用的库(与 node.js 兼容).它使开发人员可以轻松设置键绑定使用组合键来设置复杂的绑定....Google 的 Material Design 规范的 React 组件 Fabric UI 微软开源的 UX 框架的集合,用于创建共享代码,设计交互行为的精美的跨平台应用程序 React desktop...排序 react-beautiful-dnd 漂亮,可移植性 列表拖拽库 react-dnd 可帮助我们构建复杂的拖放界面,同时保持组件的分离 react-moveable 支持自由拖拽, 缩放, 参考线的灵活强大的拖拽库

3.1K20

前端里的拖拖拽拽了解一下?

最近在项目使用了 react-dnd[1],一个基于 HTML5 的拖拽库,“拖拽能力”丰富了前端的交互方式,基于拖拽能力,会扩展各种各样的拖拽反馈效果,因此有必要学习了解,最好的学习方式就是实操!...一、HTML5 中的拖放 拖(Drag)放(Drop)是 HTML5 标准的组成部分,了解掌握之后,举一反三,有助于提升我们拖拽场景下技术方案的设计能力。...拖动元素期间,一些与拖放相关的事件会被触发,像 drag dragover 类型的事件会被频繁触发。...1.3 DataTransfer 在上述的事件类型中,不难发现,放置元素拖动元素分别绑定了自己的事件,可如何将拖拽元素放置元素建立联系以及传递数据?...,从可扩展兼容性上考虑,最终选择了 react-dnd 作为基础拖拽库,当然,复杂的拖拽场景下,是需要自行扩展该拖拽库,上手难度相对会高一点,不过有了这些“拖拽知识”作为前置基础,那么扩展功能也就不是什么难事了

4.7K30

盘点7个开源WPF控件

1、一个可拖拉实现列表排序的WPF开源控件 项目简介 gong-wpf-dragdrop是一个开源的.NET项目,用于WPF应用程序中实现拖放功能,可以让开发人员快速、简单的实现拖放的操作功能。...可以同一控件内或不同控件之间拖动数据以重新排序,支持插入、移动、复制到同一个或另一个控件集合中去,并支持操作预览效果功能。...2、一个类似Office用户界面的WPF库 项目简介 Fluent.Ribbon是一个开源的UI库,它提供了现代化的、易于使用的用户界面,可以用于创建各种类型的桌面应用程序。...5、适合Windows桌面、Material Design设计风格、WPF美观控件库 项目简介 这是一个适用于Windows桌面,全面且易于使用的控件库,遵循Google推测的Material Design...7、一款基于.Net Core开发简约漂亮的 WPF UI项目简介 这是一款使用简单、UI评论的WPF UI库,借鉴了多个开源框架。UI简单清晰、大气。

87220

JavaScript进阶之实现拖拽

最近做到的react项目就有一个拖拽的需求,然后大概搜索了一下,找到了star比较高的react-dnd库,但是阅读react-dnd的官方文档还是有点难受的,因为概念性比较强,所以介绍react-dnd...注意 ball.ondragstart = function() { return false; }; 如果不设置这段代码,会发生奇怪的现象,这是因为浏览器有自己的对图片一些其他元素的拖放处理,...HTML 拖放(Drag and Drop) 拖拽事件 HTML 的 drag & drop 使用了 DOM event model 以及从mouse events 继承而来的 drag events...操作期间,会触发一些事件类型,有一些事件类型可能会被多次触发(比如drag dragover 事件类型) ?...link 表明拖动源位置目标位置之间将会创建一些关系表格或是连接。 参考:MDN HTML5 drag & drop 拖拽与拖放简介

2.6K40

HTML5魔法堂:全面理解Drag & Drop API

二、由于篇幅较长,特设目录一陀                       三、HTML4下实现简单拖拽 四、HTML5下实现简单拖拽 五、如何启用DnD效果 六、draggable属性详解 七、DnD...effectAllowed  dropEffect 属性      这个个属性对于初次接触DnD的朋友来说,可谓最令人摸不着头脑的,网上各书籍上对这个属性的解释均不全面,下面我试图尽量把它们讲明白...IE10+仅支持TextURL种类型,不支持text/plain、text/uri-list等类型    3.  ...《HTML5用户指南》第8章、拖放,除了简单介绍HTML5 DnD API外,还介绍起源IE上DnD的特点作者对DnD API不完美的抱怨,比《HTML5实战》更值得拜读。...《HTML5与CSS3权威指南》4.5.拖放,内容,深度与《HTML5实战》相似 《论道HTML5》3.3.Drag & Drop API,对比上述三本书,它提及到使用Modernizr作DnD特征检测

4K100

不可错过的几款GitHub开源项目

实际项目中的应用,MVP中RxJava生命周期的管理…; 上述罗列的各种开源框架的使用方法; Java8 Lambda表达式Stream API的用法; 怎样适配Material Design; ToolBar...使用Material Design控件动画 使用MVP架构整个项目,对应于model、ui、presenter三个包 使用Realm做阅读记录收藏记录的增、删、查、改 使用Glide做图片的处理和加载...RxJava其他操作符来做延时、轮询、转化、筛选等操作 使用okhttp3对网络返回内容做缓存,还有日志、超时重连、头部消息的配置 使用Material Design控件动画 使用MVP架构整个项目,...对应于model、ui、presenter三个包 使用Dagger2将M层注入P层,将P层注入V层,无需new,直接调用对象 使用Realm做阅读记录收藏记录的增、删、查、改 使用Glide做图片的处理和加载...主要技术点: 整体项目MVP结构 Dagger2 相机部分,API >= 21使用 Camera2 ,API < 21使用 Camera 相机的状态机,聚焦状态机 照片缓存分为种,一个是大图,一个是小图

1.8K20

关于react-dnd,看这一篇就够了

概念 React DnD 是一组 React 高阶组件,使用的时候只需要使用对应的 API 将目标组件进行包裹,即可实现拖动或接受拖动元素的功能。...拖动的过程中,不需要开发者自己判断拖动状态,只需要在传入的 spec 对象中各个状态属性中做对应处理即可,因为react-dnd使用了redux管理自身内部的状态。...它是 DnD Dom 层的实现。...它接收个参数,一个 DragTargetMonitor 实例拖拽元素描述信息item 第二个参数是一个数组,表示对方法更新的约束,只有当数组中的参数发生改变,才会重新生成方法,基于react的useMemo...数据流转 看了API之后,实际上不能很好的认识到每个状态每个方法的工作流程,所以,我这里画了一张图,帮助你更清晰的看到它的数据是如何流动的。

15.6K42
领券