react拖拽组件dnd-kit拖拽事件与点击事件冲突问题解决

记录在拖拽功能中拖拽组件与点击事件冲突,导致点击事件无法触发,点击只会触发拖拽事件。

需求:目前需要在拖拽组件上添加一个功能按钮,点击功能按钮进行编辑删除等操作,但是点击功能按钮无法触发点击事件。

问题复现效果如下:

可以看到点击事件也绑定了,点击按钮,页面上的文字没有却没有更新。

事件捕获用过都不行、寻找了很多办法无果,dnd-kit官方文档给出了Sensors传感器的概念,功能大概意思就是比如鼠标按下拖拽组件需要移动多少个像素才触发拖拽事件、或者是等待多少毫秒触发拖拽事件。

例如我写的传感器如下,鼠标按下需要移动5个像素才激活拖拽事件, 这样当地点击功能按钮时,鼠标没有移动,自然就触发了点击事件。

//拖拽传感器,在移动像素5px范围内,不触发拖拽事件
    const sensors = useSensors(
        useSensor(MouseSensor,{
            activationConstraint: {
                distance: 5, // 按住不动移动5px 时 才进行拖拽, 这样就可以触发点击事件
            },
        })
    )

传感器如何应用:应用起来也非常简单,在DndContext标签上加个sensors属性就应用好了

import {DndContext,useSensors,useSensor,MouseSensor} from "@dnd-kit/core";
import {Droppable} from "./Droppable";
import {Draggable} from "./Draggable";


function App() {
  return (
    <DndContext sensors={sensors}>
      <Draggable /> //拖拽组件
      <Droppable /> //可落下的容器组件
    </DndContext>
  )
}

dnd-kit拖拽组件的使用方法在我上一篇文章中https://blog.csdn.net/A15029296293/article/details/134141264

解决后效果如下:

### React DnD-Kit 使用指南 #### 一、简介 `dnd-kit` 是一款现代、轻量级、高性能、可访问且易于扩展的拖放工具包,专为 React 设计[^1]。它提供了丰富的功能来实现复杂的拖拽交互场景。 --- #### 二、安装方法 要使用 `dnd-kit`,可以通过以下命令将其安装到项目中: ```bash npm install @dnd-kit/core @dnd-kit/sortable ``` 此操作会将核心库以及用于排序的功能模块安装至您的项目环境[^2]。 --- #### 三、基本概念 以下是 `dnd-kit` 的一些重要概念及其作用: - **Draggable**: 可被拖动的对象。 - **Droppable**: 接收拖动物体的目标区域。 - **Sensor**: 负责检测用户的输入行为(如鼠标移动或触摸事件),并触发相应的动作。 - **Modifier**: 提供额外的行为控制能力,比如限制拖动范围或者调整位置。 这些基础构建块共同构成了完整的拖拽体验框架体系结构。 --- #### 四、简单示例代码 下面展示了一个简单的例子,演示如何利用 `@dnd-kit/core` 和 `@dnd-kit/sortable` 创建列表项重新排列功能的应用程序片段: ```javascript import React from 'react'; import { DndContext, closestCenter, useSortable, SortableContext, } from '@dnd-kit/core'; import { arrayMove } from '@dnd-kit/sortable'; function Item({ id }) { const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id }); const style = { transform: transform ? `translate3d(${transform.x}px, ${transform.y}px, 0)` : '', transition, }; return ( <div ref={setNodeRef} {...listeners} {...attributes} style={style}> {id} </div> ); } export default function App() { const items = ['Item 1', 'Item 2', 'Item 3']; const handleSortEnd = ({ active, over }: any) => { if (over && active.id !== over.id) { console.log('Sorted:', active.id, 'to position of', over.id); // 更新状态逻辑... } }; return ( <DndContext onDragEnd={handleSortEnd} collisionDetection={closestCenter}> <SortableContext items={items.map((_, index) => String(index))}> {items.map((item, index) => ( <Item key={index} id={String(index)} /> ))} </SortableContext> </DndContext> ); } ``` 上述代码定义了一组可以互相交换顺序的条目集合,并通过监听器捕获结束后的变化情况以便进一步处理业务需求。 --- #### 五、官方文档资源链接 对于更深入的学习实践指导,请参考其官方网站上的详尽教程资料:[https://docs.dndkit.com/](https://docs.dndkit.com/) --- #### 六、其他方案对比分析 相较于传统的 `react-dnd` 解决方案而言,`dnd-kit` 更加注重性能优化方面的工作成果表现优异;同时支持多层嵌套布局管理等功能特性,在实际开发过程中能够带来更加流畅自然的操作感受效果显著提升用户体验满意度水平高度一致保持良好兼容性特点突出优势明显值得推荐尝试采用作为首选技术选型之一考虑因素综合评估之后得出结论认为非常合适当前主流前端工程项目当中广泛推广应用价值极高前景广阔未来潜力无限好
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值