当前位置: 首页 > news >正文

(含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现

原生写法

// 封装组件
import React, { useState, useRef } from 'react';const DraggableModal = ({ children }) => {const [position, setPosition] = useState({ x: 0, y: 0 });const modalRef = useRef(null);const handleMouseDown = (e) => {const modal = modalRef.current;const startX = e.clientX - modal.offsetLeft;const startY = e.clientY - modal.offsetTop;const handleMouseMove = (e) => {setPosition({x: e.clientX - startX,y: e.clientY - startY});};const handleMouseUp = () => {document.removeEventListener('mousemove', handleMouseMove);document.removeEventListener('mouseup', handleMouseUp);};document.addEventListener('mousemove', handleMouseMove);document.addEventListener('mouseup', handleMouseUp);};return (<divref={modalRef}style={{ position: 'absolute', left: position.x, top: position.y }}><div style={{ cursor: 'move' }} onMouseDown={handleMouseDown}>Drag Me</div>{children}</div>);
};export default DraggableModal;// 使用
<DraggableModal><ModalContent />
</DraggableModal>

使用库并处理拖动和点击事件重叠问题

// 使用库实现功能
你可以使用react-draggable库来实现这个功能。首先安装react-draggable库:```
npm install react-draggable
```然后在你的组件中引入react-draggable库,并使用它来包裹你想要添加可拖动功能的按钮:```jsx
import React from 'react';
import Draggable from 'react-draggable';const DraggableButton = () => {let isDragging = false;const handleDrag = () => {isDragging = true;};const handleStop = () => {console.log('handleStop');// 触发 onStop 后会触发 onClick,加个 setTimeout 是为了让修改不“马上”发生,导致 handleClick 拿到的不是预期的结果setTimeout(() => (isDragging = false), 0);};const handleClick = () => {console.log('handleClick');if (isDragging) {return;}console.log('啊,我被 click 了');};return (<Draggable onDrag={handleDrag} onStop={handleStop}><button onClick={handleClick} style={{ position: 'fixed', bottom: 0, right: 0 }}>可拖动按钮</button></Draggable>);
}export default DraggableButton;

解决库和Antd Tooltip配置使用无法拖动

可以尝试使用`react-draggable`的`handle`属性来指定拖动的句柄,避免事件冲突。
示例代码如下:<Draggable handle=".drag-handle"><div><Button className="drag-handle">Hover me<Tooltip title="Tooltip text"><QuestionCircleOutlined /></Tooltip></Button></div>
</Draggable>

移动端或PC端如何判断react-draggable包裹的组件时点击还是移动(含移动位置判断),用reack hook代码实现

// 判断是否点击还是移动import React, { useState } from 'react';
import Draggable from 'react-draggable';const DraggableComponent = () => {const [isDragging, setIsDragging] = useState(false);const handleTouchStart = (e) => {setIsDragging(false);};const handleTouchMove = (e) => {setIsDragging(true);};const handleTouchStop = () => {if (!isDragging) {// 没在拖动}settimeout(() => {setIsDragging(false)}, 0)}return (<DraggableonStart={handleTouchStart}onDrag={handleTouchMove}onStop={handleTouchStop}><div style={{ width: '100px', height: '100px', backgroundColor: 'lightblue' }}>Drag me</div></Draggable>);
};export default DraggableComponent;// 下方是判断移动位置import React, { useState } from 'react';
import Draggable from 'react-draggable';const DraggableComponent = () => {const [isDragging, setIsDragging] = useState(false);const [startX, setStartX] = useState(null);const [startY, setStartY] = useState(null);const handleTouchStart = (e) => {setStartX(e.touches[0].clientX);setStartY(e.touches[0].clientY);setIsDragging(false);};const handleTouchMove = (e) => {const moveX = e.touches[0].clientX;const moveY = e.touches[0].clientY;if (Math.abs(moveX - startX) > 5 || Math.abs(moveY - startY) > 5) {setIsDragging(true);}};const handleTouchStop = () => {setIsDragging(false)}return (<DraggableonStart={handleTouchStart}onDrag={handleTouchMove}onStop={handleTouchStop}><div style={{ width: '100px', height: '100px', backgroundColor: 'lightblue' }}>Drag me</div></Draggable>);
};export default DraggableComponent;

拖动范围不超过浏览器窗口

// 拖动范围不超过浏览器窗口
<Draggablebounds="body"><div style={{ width: '100px', height: '100px', backgroundColor: 'lightblue' }}>Drag me</div>
</Draggable>

拖动范围不超过某个div盒子内部

import Draggable from 'react-draggable';const App = () => {const boundsRef = useRef(null);return (<div ref={boundsRef} style={{ width: '400px', height: '400px', border: '1px solid black', position: 'relative' }}><Draggable bounds={boundsRef}><div className="draggable-box" style={{ width: '100px', height: '100px', background: 'red' }}>Drag Me</div></Draggable></div>);
};export default App;

使用react-draggable包裹react-select组件时,点击react-select显示的下拉框位置不在下方,位置错乱了如何解决

import React from 'react';
import Draggable from 'react-draggable';
import Select from 'react-select';const customStyles = {menuPortal: base => ({ ...base, zIndex: 9999 }), // 设置z-index确保下拉框在最上层显示
};const App = () => {return (<Draggable><Selectoptions={options}styles={customStyles}menuPortalTarget={document.body}/></Draggable>);
};
```通过设置menuPortalTarget为document.body,可以将下拉框渲染到body节点中,确保其显示在正确的位置。同时,通过自定义样式customStyles,可以设置下拉框的z-index等样式属性。

相关文章:

  • Python 从0开始 一步步基于Django创建项目(11)注册新用户
  • JumpServer 堡垒主机
  • openEuler 22.03 安装 .NET 8.0
  • 11 开源鸿蒙OpenHarmony轻量系统源码分析
  • 【python】pip清华大学镜像
  • 【css】文本过长溢出一行不换行普通css以及antd实现
  • 插入排序、归并排序、堆排序和快速排序的稳定性分析
  • Kubernetes之Projected Volume
  • 物理寻址和功能寻址,服务器不同的应答策略和NRC回复策略
  • 微信小程序页面生命周期和小程序api组件的生命周期
  • 算法刷题笔记(3.25-3.29)
  • 【Git项目部署到本地仓库】
  • 2024-03-28 Java8之Collectors类
  • MybatisPlus速成
  • Hive查询转换与Hadoop生态系统引擎与优势
  • [NodeJS] 关于Buffer
  • dva中组件的懒加载
  • es6
  • Hibernate最全面试题
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PHP 的 SAPI 是个什么东西
  • SpingCloudBus整合RabbitMQ
  • 分布式任务队列Celery
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 记录:CentOS7.2配置LNMP环境记录
  • 力扣(LeetCode)357
  • 前嗅ForeSpider采集配置界面介绍
  • 如何利用MongoDB打造TOP榜小程序
  • 用Python写一份独特的元宵节祝福
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​比特币大跌的 2 个原因
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #QT(TCP网络编程-服务端)
  • (10)STL算法之搜索(二) 二分查找
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (done) 两个矩阵 “相似” 是什么意思?
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)ObjectiveC 深浅拷贝学习
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .Net7 环境安装配置
  • .Net的C#语言取月份数值对应的MonthName值
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @Builder用法
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [AutoSar]BSW_Com02 PDU详解
  • [BUG]Datax写入数据到psql报不能序列化特殊字符