react使用dnd实现简单的拖拽排序

2023-11-03

在react项目中使用dnd实现一个简单的拖拽排序功能

首先简单的介绍一下dnd:

React-DnD是一组React实用程序,可帮助您构建复杂的拖放界面,同时保持组件之间的耦合。

1、DndProvider组件为您的应用程序提供React-DnD功能。必须通过backendc参数将其注入后端,但是也可以将其注入window对象。

backend后端是React-DnD中非常好的一种设计方法。可以理解为具体拖拽的实现方式

2、userDrag声明拖动源

userDrag用于将当前组件用作拖动源的钩子。

3、userDrop声明放置源

useDrop用于使用当前组件作为放置目标的钩子。

下面是具体实现拖拽功能的组件代码

import React, { useRef } from 'react';
import { useDrop, useDrag } from 'react-dnd';
// dnd拖拽排序
export default (props: any) => {
  const { moveRow, index, children } = props;
  const ref: any = useRef(null);
  const accept = 'DragDropBox';
  const [{ isOver, dropClassName }, drop] = useDrop({
    accept,
    collect: (monitor) => {
      const { index: dragIndex } = (monitor.getItem() || {}) as any;
      if (dragIndex === index) {
        return {};
      }
      return {
        isOver: monitor.isOver(),
        dropClassName: dragIndex < index ? ' drop-over-downward' : ' drop-over-upward',
      };
    },
    drop: (item: any) => {
      moveRow(item.index, index);
    },
  });
  const [, drag] = useDrag({
    type: accept,
    item: { index },
    collect: (monitor: any) => ({
      isDragging: monitor.isDragging(),
    }),
  });
  const changeRef = drag(drop(ref));
  return (
    <div
      // @ts-ignore
      ref={changeRef}
      key={index + 1}
      className={`${isOver ? dropClassName : ''}`}
    >
      <span key={index}>{children}</span>
    </div>
  );
};

使用时

import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';
import ReactDndDragSort from './drag';
import { useCallback} from 'react';

const moveRow = useCallback(
    (dragIndex, hoverIndex) => {
      const newItems = [...textValue];
      newItems.splice(hoverIndex, 1, ...newItems.splice(dragIndex, 1, newItems[hoverIndex]));
      onChange?.(newItems);
    },
    [textValue],
  );

<DndProvider backend={HTML5Backend}>
      <WSpace size={'large'}>
        {textValue.map((item: string, index: number) => {
          return (
            <div key={index}>
              <ReactDndDragSort index={index} moveRow={moveRow}>
               <div>需要拖拽的模块</div>
              </ReactDndDragSort>
            </div>
          );
        })}
      </WSpace>
</DndProvider>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react使用dnd实现简单的拖拽排序 的相关文章

随机推荐

  • Elasticsearch数据刷新策略RefreshPolicy简述

    说明 默认情况下ElasticSearch索引的refresh interval为1秒 这意味着数据写1秒才就可以被搜索到 每次索引refresh会产生一个新的 lucene 段 这会导致频繁的 segment merge 行为 对系统 C
  • node入门(一)bcrypt密码加密和验证

    前言 node js越来越被广泛的使用 现在找工作职位要求上大都写熟悉或了解一门后端 语言 如 java php node等 Node js是一个javascript运行环境 它让javascript可以开发后端程序 实现几乎其他后端语言实
  • 一道智力题--三个运动员参加M个项目,在每一项目中,第一,第二,第三名分别得X,Y,Z分

    题目 有一种体育竞赛共含M个项目 有运动员A B C三人参加 在每一项目中 第一 第二 第三名分别得X Y Z分 其中X Y Z为正整数且X gt Y gt Z 最后A得22分 B与C均得9分 B在百米赛中取得第一 1 求M的值 2 在跳高
  • 使用excel将一个数字随机分摊?

    在Excel中 如何把一个数值随机分配到N个单元格内 分配后每个单元格的数值之和等于这个数值 比如这里我们需要在A1 A10区域中随机输入数字 其实结果等于10000 这里我们可以选中区域 然后输入公式 FREQUENCY ROW 1 10
  • python代码,用于获取mp3部分信息并存入MySQL中

    a1 a2 a3 a4参数需要自己输 host a1 user a2 password a3 database a4 import os import base64 import struct import pymysql 这是python
  • 在github上创建个人主页的方法【2023更新版】

    01 进入github的网站 链接 https github com 然后注册 登陆 注意登陆时设置的用户名 username 就是将来你个人主页的三级域名 所以这里一定要慎重填写username 如下图所示 02 注册完成后进入个人主页如
  • (详细简单成功版本)Mysql主从复制

    博主不易 如果有帮助点个赞加个关注再走啊家人们 目录 介绍 配置 前置条件 大坑 如果两份mysql文件都是复制的一份 那么就修改其中一份的uuid 要不后续配置不成功 配置 主库Master 1 修改Mysql数据库的配置文件my ini
  • 为自己的站点实现访客统计

    简介 我们都很好奇自己的站点有没有被人所熟知 每天能有多少的访问量 最简单的方法便是使用平台的统计功能 比如cnzz 百度统计 谷歌统计等等平台 但这篇文章的重点是自己写代码实现统计功能 一 HTML语句实现 推荐加到页面的底部界面
  • 数组 求上升区间的高度和

    求上升区间的高度和 LC 买卖股票的最佳时机 II 思路 如果上升 则max next pre Objective C 求上升区间的高度和 NSMutableArray array NSMutableArray arrayWithArray
  • Java项目:考试系统(java+JSP+bootstrap+Servlet+Mysql)

    源码获取 俺的博客首页 资源 里下载 项目介绍 本系统分为两个角色 一个是考生 一个是管理员 考生功能如下 登录 选择考试科目 选择考卷 在线考试 提交试卷 并且查询自己的考试成绩 管理员功能如下 登录 添加试卷 并且添加试卷里的题目 编辑
  • Linux(Ubuntu)系统上下载安装Redis

    redis最新版本可以到官网自己下载 这里提供5 0 2的版本 Redis 5 0 2 tar gz网盘资源如下 百度网盘 请输入提取码https pan baidu com s 1ZGy vI7n4RmTb9kLnWe91w压缩包下载完成
  • 使用路由器搭建局域网

    A 如果搭建的是有网局域网 网线插到WAN接口 一般都是蓝色的 买路由器时会自带一条网线 把它的一头插到LAN接口 随便插一个口就行 另一头插到电脑网线接口上就好 B 如果搭建的是无网局域网 路由器只需要接通电源就行 WAN接口不需要插网线
  • 机器学习——SVM的易错题型

    问 支持向量机仅可以用于处理二分类任务 答 错误 支持向量机可以用于处理多分类任务 通过使用一对多或一对一的方法 将多个类别分别与其他类别做二分类 也可以使用多类支持向量机算法 直接将多个类别一起纳入训练和分类过程中 此外 支持向量机还可以
  • YoloV8改进策略:重新思考高效的基于注意力的移动块模型EMO重新定义了轻量化的YoloV8

    文章目录 摘要 论文翻译 EMO 重新思考高效的基于注意力的移动块模型 1 介绍 2 方法论 归纳法和演绎法 2 1 通用效率模型标准 2 2 元移动块 2 3 微设计 倒置残余移动块 2 4 面向密集预测的EMO宏观设计 3 实验 3 1
  • Large Language Models and Knowledge Graphs: Opportunities and Challenges

    本文是LLM系列的文章 针对 Large Language Models and Knowledge Graphs Opportunities and Challenges 的翻译 大语言模型和知识图谱 机会与挑战 摘要 1 引言 2 社区
  • 40道Python经典面试题(附答案)

    1 什么是Python 使用Python有什么好处 Python是一种编程语言 包含对象 模块 线程 异常和自动内存管理 Python的好处在于它简单易用 可移植 可扩展 内置数据结构 并且它是一个开源的 2 什么是PEP 8 PEP 8是
  • uniapp踩坑-使用vue-cli框架对node版本有要求

    uniapp踩坑 使用vue cli框架对node版本有要求 前言 背景 最近在开发uniapp 官方文档提供的开发方式有两种 一种是通过HBulider可视化界面创建 一种是通过vue cli命令行创建 因为可视化更加方便 所以就使用了可
  • 设计算法来统计一个输入字符串中所包含的整数个数,并输出这些数

    设计算法来统计一个输入字符串中所包含的整数个数 并输出这些数 假设输入的字符既有数字又有非数字的字符 例如 ak123x456 17960 302gef4563 其中连续数字作为一个整体看成整数 例如123 456等 include
  • 二进制补码运算

    在计算机系统中 数值一律用补码来表示和存储 原因在于 使用补码 可以将符号位和数值域统一处理 同时 加法和减法也可以统一处理 此外 补码与原码相互转换 其运算过程是相同的 不需要额外的硬件电路 补码运算 正数补码是其原码 负数的补码为其数值
  • react使用dnd实现简单的拖拽排序

    在react项目中使用dnd实现一个简单的拖拽排序功能 首先简单的介绍一下dnd React DnD是一组React实用程序 可帮助您构建复杂的拖放界面 同时保持组件之间的耦合 1 DndProvider组件为您的应用程序提供React D