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

如果数组中不存在item,如何拖放元素- React DND ES6

在React DND(Drag and Drop)中,如果你想在数组中不存在某个元素时进行拖放操作,你需要确保你的拖放逻辑能够正确处理这种情况。以下是一些基础概念和相关解决方案:

基础概念

  1. React DND:一个用于在React应用中实现拖放功能的库。
  2. 拖放目标(Drop Target):定义可以接收拖动元素的区域。
  3. 拖动源(Drag Source):定义可以被拖动的元素。

相关优势

  • 灵活性:React DND提供了灵活的API,可以轻松地集成到现有的React应用中。
  • 可重用性:拖放组件可以独立于应用的其他部分,提高代码的可重用性。
  • 性能优化:React DND通过使用React的虚拟DOM来优化性能。

类型

  • HTML5拖放:利用浏览器原生的拖放功能。
  • React DND:通过React组件和上下文来实现拖放。

应用场景

  • 任务管理应用:拖放任务以重新排序。
  • 文件管理器:拖放文件以进行移动或复制。
  • UI布局工具:拖放组件以调整布局。

解决方案

假设你有一个数组items,你想在数组中不存在某个元素时进行拖放操作。以下是一个示例代码:

代码语言:txt
复制
import React from 'react';
import { useDrag, useDrop } from 'react-dnd';

const ItemTypes = {
  ITEM: 'item',
};

const DragItem = ({ id, text, index, moveItem }) => {
  const [, drag] = useDrag({
    type: ItemTypes.ITEM,
    item: { id, index },
  });

  const [, drop] = useDrop({
    accept: ItemTypes.ITEM,
    hover(item, monitor) {
      if (!ref.current) {
        return;
      }
      const dragIndex = item.index;
      const hoverIndex = index;

      if (dragIndex === hoverIndex) {
        return;
      }

      const hoverBoundingRect = ref.current.getBoundingClientRect();
      const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;
      const clientOffset = monitor.getClientOffset();
      const hoverClientY = clientOffset.y - hoverBoundingRect.top;

      if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) {
        return;
      }

      if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) {
        return;
      }

      moveItem(dragIndex, hoverIndex);
      item.index = hoverIndex;
    },
  });

  const ref = React.useRef(null);
  drag(drop(ref));

  return (
    <div ref={ref} style={{ padding: '10px', border: '1px solid black' }}>
      {text}
    </div>
  );
};

const DragDropContainer = ({ items, moveItem }) => {
  return (
    <div>
      {items.map((item, index) => (
        <DragItem key={item.id} {...item} index={index} moveItem={moveItem} />
      ))}
    </div>
  );
};

const App = () => {
  const [items, setItems] = React.useState([
    { id: 1, text: 'Item 1' },
    { id: 2, text: 'Item 2' },
    { id: 3, text: 'Item 3' },
  ]);

  const moveItem = (dragIndex, hoverIndex) => {
    const dragItem = items[dragIndex];
    setItems((items) => {
      const newItems = [...items];
      newItems.splice(dragIndex, 1);
      newItems.splice(hoverIndex, 0, dragItem);
      return newItems;
    });
  };

  return <DragDropContainer items={items} moveItem={moveItem} />;
};

export default App;

解释

  1. DragItem组件:这是一个可拖动的组件,使用useDraguseDrop钩子来实现拖放功能。
  2. DragDropContainer组件:这是一个容器组件,包含多个DragItem组件。
  3. moveItem函数:这个函数用于在拖放过程中更新数组。

参考链接

通过这种方式,你可以确保即使在数组中不存在某个元素时,拖放操作也能正常进行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

在拖动的过程,不需要开发者自己判断拖动状态,只需要在传入的 spec 对象各个状态属性做对应处理即可,因为react-dnd使用了redux管理自身内部的状态。...DndProvider 如果想要使用 React DnD,首先需要在外层元素上加一个 DndProvider。...dom useDrag传入两个参数 第一个参数,描述了drag的配置信息,常用属性 type: 指定元素的类型,只有类型相同的元素才能进行drop操作 item: 元素在拖拽过程,描述该对象的数据,如果指定的是一个方法...它接收两个参数,一个 DragTargetMonitor 实例和拖拽元素描述信息item 第二个参数是一个数组,表示对方法更新的约束,只有当数组的参数发生改变,才会重新生成方法,基于react的useMemo.../react-dnd-demo ,欢迎star 最后 感谢你能看到这里,本文总结了react-dnd的API以及常见的场景,后续会一直更新,希望对你有所帮助,当然,如果可以的话不妨留一个赞再走呢。

17.9K42

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

简介 最近在研究用 React 绘制拓扑图的时候涉及到了 HTML5 拖放 API,了解到了 React DnD 这个拖放神器。...React DnD 帮我们封装了一系列的拖放 API,大大简化了拖放 API 的使用方式,今天就结合下面这个示例给大家介绍下 React DnD 的用法。...spec: 一个js对象,上面定义了一些方法,用来描述 drag source 如何对拖动事件进行响应。 方法的参数解释: props:当前组件的 props 参数。...如果在 drop target 的 drop 方法返回了一个对象,在这里可以通过 monitor.getDropResult() 获取到返回结果。...spec: 一个js对象,上面定义了一些方法,描述了拖放目标对拖放事件的反应。 方法的参数解释: props:当前组件的 props 参数。

1.8K20
  • es6删除数组指定元素_如何删除数组元素

    arr.splice(arr.findIndex(item => item.id === id), 1) //item 只是参数可以写成 i 或者 v 都可以 , //后面的额id是数组的id,是不能随便写的...,如果数组里面写的是id,这里就写id,如果数组里面写的是num,那这里就写num , //=== 后面的id是你想要删除的元素的id号,同理,如果数组里面写的是num,那这里就是num号 ,...//1是你要删除1个元素的意思 第一种 splice(index,num); index代表的是数组元素的下标位置,num代表的是删除的个数 findIndex(); 是找到某元素的下标的位置...如图,这个数组里面有三个元素,现在要删掉这个id是24的元素,那我们代码就应该这么写 arr.splice(arr.findIndex(item => item.id === 24), 1) 打印一下发现...第二种 arr.filter() filter() 方法创建一个新的数组,新数组元素是通过检查指定数组符合条件的所有元素。 注意: filter() 不会对空数组进行检测。

    6.8K20

    react-dnd使用总结一】拖放完成后获取放置元素在drop容器的相对位置

    工具函数-根据元素的起始位置和最终位置,计算相对于某元素的位置 export interface IPosition { left: number; top: number; } /** *...根据元素的其实位置和最终位置,计算相对于某元素的位置 * @param initialPosition 拖动元素相对于屏幕左上角的起始位置(偏移量) * @param finalPosition 拖放完成后当前节点相对于屏幕左上角的位置...* @param containerEle 目标容器元素 * @returns */ export const getCorrectDroppedOffsetValue = ( initialPosition...dropTargetPosition.left; return { left: newXposition, top: newYposition, }; }; 在drop回调函数...(偏移量) monitor.getSourceClientOffset(), // 拖放完成后当前节点相对于屏幕左上角的位置 document.querySelector('#container

    4.2K10

    有趣的拖放案例

    问题**在epilot,我们在应用程序的不同部分广泛使用了react-beautiful-dnd。然而,在尝试一些复杂的场景时,我们在某些情境遇到了一些障碍,它无法准确预测元素的放置位置。...由于这些边缘情况,基于拖放位置移动元素数据的代码变得混乱不堪。react-beautiful-dnd停止维护和支持也不利于继续使用它的理由。...{item.content} );};在这两个具有相同功能的代码示例,你可以看出dnd-kit的复杂性更高,但也更全面。...在react-beautiful-dnd实现这一点可能会很具有挑战性,因为它将具有有限的功能并且需要大量的JavaScript来达到令人满意的状态。...在我们的场景,我们希望在拖动期间显示元素及其子元素的精简版本,因此我们使用了带有React portal的DragOverlay。

    25600

    React DnD

    不像其它库一样提供无穷尽的Draggable Component应对常见业务场景,React DnD从相对底层的角度提供支持,是对拖放能力的抽象与封装,通过抽象来简化使用,通过封装来屏蔽下层差异 二.术语概念...Item和Type Item是对元素/组件的抽象理解,拖放的对象不是DOM元素React组件,而是特定数据模型(Item): An item is a plain JavaScript object...DnD就是基于Redux实现的,见下文核心实现部分 Connector Connector用来建立DOM抽象(React)与DnD Backend需要的具体DOM元素之间的联系: The connectors...,一般可以看作另一种状态的drag source DnD Role是React DnD的基本抽象单元: They really tie the types, the items, the side effects...0.5 : 1, cursor: 'move' }} /> ); } 很自然地实现了被拖走的效果(拖放对象变成半透明),看不到复杂的DnD处理逻辑(这些都被封装到了React DnD

    1.5K30

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

    1.1 draggable 属性 现代浏览器,不难发现,图片标签()是可以被长按拖拽,但如果需要自定义的 DOM 节点可以被拖拽需要配置以告诉浏览器提供对元素(Element / Tag...1.3 DataTransfer 在上述的事件类型,不难发现,放置元素和拖动元素分别绑定了自己的事件,可如何将拖拽元素和放置元素建立联系以及传递数据?...如果该类型的数据不存在,则将其添加到末尾,以便类型列表的最后一项将是新的格式。如果该类型的数据已经存在,则在相同位置替换现有数据。...三、已有拖拽库 目前主流的拖拽库有: react-dnd: https://github.com/react-dnd/react-dnd/ react-beautiful-dnd: https://github.com...参考资料 [1]react-dnd - Github: https://react-dnd.github.io/react-dnd/about [2]draggable - MDN: https://developer.mozilla.org

    4.9K30

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

    Pragmatic-drag-and-drop已经完成了很多用户设计指南,其中体现了我们希望如何在产品实现拖放,其中一些决策体现在一些可选包。当然,也运行可以自由使用喜欢的任何设计语言。...Live-Region:向屏幕阅读器用户发送消息的助手react-beautiful-dnd-migration:支持从 react-beautiful-dnd 到 Pragmatic 拖放的快速迁移三...快了进275ms,比react-dnd更是快了287ms,用时6ms;在桌面端,Pragmatic-drag-and-drop比react-beatiful-dnd快了进180ms,比react-dnd...'lightgrey' : 'white';}3.移动棋子最后实现棋子在掉落时移动方块,我们将使用monitorForElements实用的拖放功能。监视器允许从代码库的任何位置观察拖放交互。...Pragmatic-drag-and-drop以极其小的安装体积以及极快运行性能,广泛的应用技术支持快速的吸引了前端开发者的目光,如果你是一名前端开发者,正在考虑前端拖放场景的实现,Pragmatic-drag-and-drop

    2.6K21

    有点意思的gif动图生成平台开发实战(二)

    精彩回顾 如何实现H5可视化编辑器的实时预览和真机扫码预览功能 在线IDE开发入门之从零实现一个在线代码编辑器 基于React+Koa实现一个h5页面可视化编辑器-Dooring TS核心知识点总结及项目实战案例分析...接下来我们看看主要要实现的功能点: 纯前端实现图片上传和预览 基于react-beautiful-dnd实现元素自由拖动排序 使用javascript实现生成uuid的函数 使用file-saver实现前端下载文件...其中File对象可以是来自用户在一个input元素上选择文件后返回的FileList对象,也可以来自拖放操作生成的DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行...} id={item.id} alt=""/> 在代码我们将图片数据存储到一个对象里, 对象包括由uuid函数生成的唯一id和url组成, 至于为何生成唯一id, 这里笔者将在下文中介绍. 3....使用react-beautiful-dnd实现元素自由拖动排序 大家在研究过H5-Dooring | 一款强大的开源H5编辑器 后就会发现react-dnd这个模块很熟悉, 因为该开源编辑器就使用了react-dnd

    1.1K10

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

    」 是一组 「React」 高阶组件,使用的时候只需要使用对应的 「API」 将目标组件进行包裹,即可实现拖动或接受拖动元素的功能。...「github:」 https://github.com/react-dnd/react-dnd 「demo地址:」 http://react-dnd.github.io/react-dnd 4....有很多库允许React拖放交互. 其中最值得注意的是惊人的「react-dnd」. 它提供了一套非常出色的拖放函数,这些函数在特定情况下非常适用疯狂地不一致的html5拖放功能....「react-beautiful-dnd」 是为垂直和水平列表专门构建的更高级别的抽象. 在该功能的子集内「react-beautiful-dnd」提供强大,自然和美丽的拖放体验....Formily 在 React ,在受控模式下,表单的整树渲染问题非常明显。

    1.4K20

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

    」 是一组 「React」 高阶组件,使用的时候只需要使用对应的 「API」 将目标组件进行包裹,即可实现拖动或接受拖动元素的功能。...「github:」 https://github.com/react-dnd/react-dnd 「demo地址:」 http://react-dnd.github.io/react-dnd 4....有很多库允许React拖放交互. 其中最值得注意的是惊人的「react-dnd」. 它提供了一套非常出色的拖放函数,这些函数在特定情况下非常适用疯狂地不一致的html5拖放功能....「react-beautiful-dnd」 是为垂直和水平列表专门构建的更高级别的抽象. 在该功能的子集内「react-beautiful-dnd」提供强大,自然和美丽的拖放体验....Formily 在 React ,在受控模式下,表单的整树渲染问题非常明显。

    5.9K21

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

    在今天的文章,将介绍每个 React 开发人员都应该熟悉的 33 个令人惊叹的 React 库。而且是由其他开发人员经过良好测试和维护的令人惊叹的 React 库。...react-icons image.png 使用react-icons可以轻松地在React项目中使用流行的图标,它利用ES6导入,支持按需打包。...react-drag-drop-files image.png 轻量且简单的 Reactjs 拖放文件库,可使用非常灵活的更改选项,因此您可以为拖放区域放置任何您想要的设计。...用户可以在窗口中的任何位置拖放甚至选择文件。 react-dnd image.png React DnD 是一组 React 实用程序,可帮助您构建复杂的拖放界面,同时保持组件解耦。...react-virtual image.png 仅在 TS/JS、React、Vue、Solid 和 Svelte 以 60FPS 的速度虚拟化大量可滚动元素的可见 DOM 节点,同时保留对标记和样式的

    33220

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

    如何使用 使用拖放 API 主要包括以下 3 个步骤: 「定义可拖拽的(draggable)元素」:将需要拖动的元素标记为可拖拽,并指定相应的事件处理逻辑。...下面是一个简单的示例代码,演示了如何使用拖放 API 实现项目任务管理应用拖放功能: <div class="task" draggable="true...下面是一个完整示例代码,演示了<em>如何</em>使用<em>拖放</em> API 实现页面生成器<em>中</em>的<em>拖放</em>功能: #canvas { border: 2px dashed #ccc; padding...Drag and drop so simple it hurts <em>React</em> <em>DnD</em>[9]: 19.3k⭐,适用于 <em>React</em> 的强大<em>拖放</em>库。Drag and Drop for <em>React</em>....<em>DnD</em>: https://github.com/<em>react</em>-<em>dnd</em>/<em>react</em>-<em>dnd</em> [10] Vue.Draggable: https://github.com/SortableJS/Vue.Draggable

    27120

    react-dnd 从入门到手写低代码编辑器

    拖拽是常见的需求,在 react 里我们会用 react-dnd 来做。 不管是简单的拖拽,比如拖拽排序,或者复杂的拖拽,比如低代码编辑器,react-dnd 都可以搞定。...新建个 react 项目 安装 react-dnd 相关的包: npm install react-dnd react-dnd-html5-backend 然后改一下 App.tsx import...这个就是设置 dnd 的 context的,用于在不同组件之间共享数据。 然后我们试试看: 确实,现在元素能 drag 了,并且拖到目标元素也能触发 drop 事件,传入 item 数据。...只不过上面的案例是修改数组元素顺序,而这个是修改一个树形 json 的元素顺序。...react-dnd 主要就是 useDrag、useDrop、useDragLayout 这 3 个 API。 useDrag 是给元素添加拖拽,指定 item、type、collect 等参数。

    1.2K20

    JavaScript进阶之实现拖拽

    最近做到的react项目就有一个拖拽的需求,然后大概搜索了一下,找到了star比较高的react-dnd库,但是阅读react-dnd的官方文档还是有点难受的,因为概念性比较强,所以在介绍react-dnd...注意 ball.ondragstart = function() { return false; }; 如果不设置这段代码,会发生奇怪的现象,这是因为浏览器有自己的对图片和一些其他元素拖放处理,...另外,如果是从其他应用软件或是文件拖东西进来,尤其是图片的时候,默认的动作是显示这个图片或是相关信息,并不是真的执行drop。此时需要用用document的ondragover事件把它直接干掉。...的概念有注意理解react-dnd库的api 举个例子?: <!...定义拖动效果 dropEffect 属性用来控制拖放操作中用户给予的反馈。它会影响到拖动过程浏览器显示的鼠标样式。比如,当用户悬停在目标元素上的时候,浏览器鼠标也许要反映拖放操作的类型。

    2.7K40

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

    二、由于篇幅较长,特设目录一陀                       三、HTML4下实现简单拖拽 四、HTML5下实现简单拖拽 五、如何启用DnD效果 六、draggable属性详解 七、DnD.../blob/master/sample/sample4/ 五、如何启用DnD效果                             html片段 <div id="drag" draggable=...caixw/blog/102845 http://www.cnblogs.com/birdshome/archive/2006/07/22/Drag_Drop.html 《HTML5实战》第11章、HTML5元素拖放...参数格式包含text/url-list,应更正为text/uri-list 十六、书评                                   《HTML5实战》第11章、HTML5元素拖放...《HTML5用户指南》第8章、拖放,除了简单介绍HTML5 DnD API外,还介绍起源和IE上DnD的特点和作者对DnD API不完美的抱怨,比《HTML5实战》更值得拜读。

    4K100

    猿创征文|2022年快过完了,是时候总结一下那些优秀的 React 组件库

    2022 年只剩下 2 个月,在这快一年的开发过程,我觉得是时候总结了 7 个很棒的、日常开发中常用的 React 组件库。...React DnD React DnD是一个使用 HTML5 拖放 API 创建复杂拖放接口的库。它建立在现代 API 之上,使其更容易使用和更强大。...React DnD不像大多数拖放库,如果你以前从未使用过它,它可能会让你感到害怕。然而,一旦你尝到了其设计核心的一些概念,它就开始有意义了。 4....React Reflex Re-F|ex是一个基于React flex 的布局组件库。它以一种简单的方式解决React Web应用程序需要调整布局的需求。 6....React Query React Query 是一个强大的异步状态管理库,支持 TS/JS, React, Solid, Vue 和 Svelte。

    26710
    领券