React 元素拖拽教程 react-dnd 实现拖拽

实现效果

下面是实际的项目中的应用,涉及业务逻辑代码比较繁琐,下文只说明其基本原理,有疑问的地方请留言
拖拽展示

h5原生的拖拽处理起来过分的繁琐,而社区已经提供了成熟的库 react-dnd 来帮助我们实现这些细节,我们只需要关心业务逻辑即可。

下面的内容主要是适用于单个元素的拖拽,从一个容器中拖入另外一个容器中,没有实现真正的DOM层面的运动,实际是通过拖拽的事件监听操纵数据层的变化,从而触发页面的渲染导致得更新,注意!没有真正的dom移动那么炫酷的效果

一个完整的拖拽流程分为两部分:拖动+放置
下面进行展示

1、安装依赖

npm i react-dndnpm i react-dnd-html5-backend

安装主要的拖拽库 react-dnd,第二个依赖是html5的拖拽库,在前一个依赖中需要用到第二个,因 pc端移动端 的 dom 层存在不同的事件监听和处理方式。所以 dnd 将这部分单独抽出来。方便后续的扩展。

  • react-dnd-html5-backend:用于控制 html5 事件的 backend。
  • react-dnd-touch-backend:用于控制移动端 touch 事件的 backend。
  • react-dnd-test-backend:用户可参考自定义的 backend。

2、创建拖拽的容器

顾名思义,所有的拖拽都必须在这个容器中发生,只需要把拖拽的dom都包裹住就行

import { HTML5Backend } from react-dnd-html5-backend";
import { DndProvider } from "react-dnd";<DndProvider backend={HTML5Backend}><Component/>
</DndProvider>;

react-dnd 中导出 DndProvider,包裹要实现拖动和放置的区域。

3、创建拖拽区域,拖拽组件

DndProvider下面放置拖动组件 和 放置组件,这个主页面用于布局


import { HTML5Backend } from react-dnd-html5-backend";
import { DndProvider } from "react-dnd";// CustDrag:拖动组件 CustDrop:放置组件
import CustDrag from "./CustDrag.jsx";
import CustDrop from "./CustDrop.jsx";// 布局左右结构(没有写css 自己幻想一下)
const DndPage = () => {return (<DndProvider backend={HTML5Backend}><div className={styles.center}><CustDrag /></div><div className={styles.center}><CustDrop/></div></DndProvider>);
};

4、CustDrag 拖动组件

主要是用到了 useDrag 的hook,其中参数

  • type 拖动类型,当有多个的时候,这个是用来一一对应的

  • item 携带的数据,当前放置的时候会接受到这个数据

  • collect 返回一个对象,用于该hook的第一个参数,供页面使用

具体的可以去网上查询

import { useDrag } from "react-dnd";const CustDrag = () => {const [{ opacity }, dragRef] = useDrag({type: "Field",item: '我是拖拽数据',collect: (monitor) => ({opacity: monitor.isDragging() ? 0.5 : 1,}),});return (<div ref={dragRef} style={{ opacity, cursor: "move" }}>这个是拖拽对象</div>);
};

5、CustDrop:放置组件

使用 useDrop 参数如下

  • accept 接受类型,与上面的组件对应

  • drop 放置的事件,这时候可以获取到拖拽组件传过来的数据data

  • collect 收集拖动事件在放置区的数据。比如:是否有成功的拖动到放置区上、是否已经开始拖动,距离放置区的坐标等。并且将监听的数据传递到 useDrop 第一个参数来。

具体的可以去网上查询


import { useDrop } from "react-dnd";
const CustDrop = () => {const [value, setValue] = useState<any[]>([]);const [{ canDrop, isOver }, drop] = useDrop({accept: 'Field',drop: (data) => {console.log('data',data)setValue(data);},collect: (monitor) => ({// 是否放置在目标上isOver: monitor.isOver(),// 是否开始拖拽canDrop: monitor.canDrop(),}),});return (<divref={drop}style={{ border: '1px solid #000', marginTop: '10px', minHeight: '200px', background: '#fff' }}></div>);
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 基础

文章目录 1.Docker概述2.Docker安装3.Docker与虚拟机VM4.Docker命令1.帮助命令2.镜像命令1.images2.search3.pull4.rmi 3.容器命令1.run2.ps3.rm4.start5.stop6.restart7.kill 4.常用其他命令1.后台启动容器2.查看日志&#xff08;logs&#xff09;3.查看进程信息&#xff08;t…

使用proteus进行主从JK触发器仿真失败原因的分析

在进行JK触发器的原理分析的时候&#xff0c;我首先在proteus根据主从JK触发器的原理进行了实验根据原理图&#xff0c;如下图&#xff1a; 我进行仿真&#xff0c;在仿真的过程中&#xff0c;我向电路图中添加了外部的置0/1端口&#xff0c;由此在proteus中得到下面的电路图 …

ReactNative进阶(五十三)ios组包报错getaddrinfo ENOTFOUND static.realm.io问题修复

文章目录 一、前言二、问题分析三、解决方案四、拓展阅读 一、前言 在jenkins进行iOS组包过程中&#xff0c;控制台报如下错误&#xff1a; FetchError: request to https://static.realm.io/downloads/sync/realm-sync-cocoa-4.7.3.tar.gz failed, reason: getaddrinfo ENOT…

独孤思维:做副业,明白什么是重要的事情

做副业&#xff0c;明白什么是重要的事情。 并且要在重要的事情中&#xff0c;分配足够多的时间和精力&#xff0c;不惜一切代价。 比如独孤&#xff0c;副业重要的事&#xff1a; 自媒体写作&#xff0c;写了4年&#xff0c;目标一辈子&#xff1b; 实操副业项目&#x…

变异系数法

变异系数法是根据统计学方法计算得出系统各指标变化程度的方法&#xff0c;是直接利用各项指标所包含的信息&#xff0c;通过计算得到指标的权重&#xff0c;因此是一种客观赋权的方法。 如果这个指标的变化能够很大影响我们的对象就权重很大 需要进行预处理 指标正向化 指…

红队打靶练习:DERPNSTINK: 1

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto 5、whatweb 目录探测 1、gobuster 2、dirsearch WEB get flag1 robots.txt /php/phpmyadmin /temporary /weblog wordpress wpscan扫描 漏洞发现 提权 系统信息收集 mysql登录 john get flag2 s…

DBSCAN聚类模型

目录 介绍&#xff1a; 一、数据 二、建模 三、评价指标 3.1metrics.homogeneity_score 3.2metrics.completeness_score 3.3metrics.v_measure_score 3.4metrics.adjusted_rand_score 3.5metrics.adjusted_mutual_info_score 3.6metrics.silhouette_score 四、画图…

假设与灵敏度分析

灵敏度分析 关系究竟有多敏感&#xff0c;就要进行灵敏度分析 如果你改变了系统参数后&#xff0c;引起这个模型&#xff08;公式&#xff09;输出的变化的程度不大&#xff0c;则说明你的模型稳定性较强&#xff08;即灵敏性较差&#xff09;&#xff0c;反之则反&#xff01…

MySQL常用sql语句记录

1&#xff0c;创建用户及赋权 -- 创建用户 CREATE USER usernamelocalhost IDENTIFIED BY password;-- 赋予所有权限 GRANT ALL PRIVILEGES ON database_name.* TO usernamelocalhost;-- 赋予特定表的某些权限 GRANT SELECT, INSERT ON table_name TO usernamelocalhost;-- 更…

前端-基础 常用标签-超链接标签( 锚点链接 )

锚点链接 &#xff1a; 点击链接&#xff0c;可以快速定位到 页面中的某个位置 如果不好理解&#xff0c;讲一个例子&#xff0c;您就马上明白了 >>> 这个是 刘德华的百度百科 &#xff0c;可以看到&#xff0c;页面里面有很多内容&#xff0c;那就得有个目录了 …

为什么地中海气候对葡萄最有益?

优质葡萄酒离不开优秀的葡萄品种&#xff0c;更离不开有利的风土优势。云仓酒庄的品牌雷盛红酒LEESON分享熟悉葡萄酒知识的朋友都听说过不少葡萄酒产区是被老天爷眷顾的地中海气候。 为什么地中海气候对葡萄种植最有益呢&#xff1f;云仓酒庄的品牌雷盛红酒LEESON分享因为这是一…

5g视频短信群发助力汽车销售!

视频短信群发在汽车销售中具有以下优势&#xff1a; 1.增强品牌形象&#xff1a;通过视频短信&#xff0c;可以向潜在客户展示汽车品牌形象、企业文化和价值观&#xff0c;提升品牌认知度和美誉度。 2.产品展示与介绍&#xff1a;视频短信可以用来详细介绍汽车的特点、功能和优…

Copilot在Pycharm的应用和示例

Copilot 是 Github 在 2021 年发布的 AI 代码助手工具&#xff0c;它可以根据你提供的上下文信息&#xff0c;自动生成代码建议&#xff0c;帮助提高代码编写效率和准确性。在 Pycharm 中使用 Copilot&#xff0c;可以进一步提升 Python 开发效率&#xff0c;本文将分享如何在 …

React.Children.map 和 js 的 map 有什么区别?

JavaScript 中的 map 不会对为 null 或者 undefined 的数据进行处理&#xff0c;而 React.Children.map 中的 map 可以处理 React.Children 为 null 或者 undefined 的情况。 React 空节点&#xff1a;可以由null、undefined、false、true创建 import React from reactexport …

大模型学习第二课

学习目标&#xff1a; 浦语大模型趣味Demo 学习内容&#xff1a; 学习时间&#xff1a; 20240108 学习产出&#xff1a; InternLM介绍 大模型&#xff1a;人工智能领域钟参数数量巨大、拥有庞大计算能力和参数规模的模型。InternLM模型全链条开源&#xff0c;7B&#xff0c;…

BUUCTF--铁人三项(第五赛区)_2018_rop1

这题是一题标准的rop。先简单查看下保护&#xff1a; 32位程序&#xff0c;黑盒测试下效果&#xff1a; 一上来就是输入&#xff0c;然后结尾会输出Hello,World.看看IDA中具体逻辑如何&#xff1a; 漏洞点主要在vulnerable_function()函数中。老常规栈溢出了。做这种题的思路&a…

Eltima 端口虚拟化软件授权分析

目录 Eltima 端口虚拟化软件 授权文件加密方式 授权文件格式 key_type 授权类型 errorCode 授权状态 hid 硬件编码 授权许可 1、替换公钥 2、dll劫持hook 测试验证 成品 Eltima 端口虚拟化软件 USB Network Gate 通过局域网和互联网共享和接入USB端口Serial to Eth…

80/20法则-扫盲和复习篇

80/20法则-扫盲和复习篇 一、80/20法则二、对于目标三、时间管理应用四、“二八定律”基本内容总结 一、80/20法则 “80/20法则”是20世纪初意大利统计学家、经济学家维尔弗雷多帕累托提出的&#xff0c;他指出&#xff1a;在任何特定群体中&#xff0c;重要的因子通常只占少数…

Vue脚手架及组件开发

组件插槽: 路由数据传递&#xff1a;

02.语言元素

语言元素 指令和程序 计算机的硬件系统通常由五大部件构成&#xff0c;包括&#xff1a;运算器、控制器、存储器、输入设备和输出设备。其中&#xff0c;运算器和控制器放在一起就是我们通常所说的中央处理器&#xff0c;它的功能是执行各种运算和控制指令以及处理计算机软件…