拖拽组件的王者,dnd-kit。抛弃React-dnd吧

拖拽组件的王者,dnd-kit。抛弃React-dnd吧

React身为web开发SPA的超级大户,相信大家都用过react-dnd和react- beautiful-dnd完成过一些复杂场景下的拖拽功能。

但是这两个库的灵活性以及暴露的数据与dnd-kit相比还是有点差距。可能是梦兽编程个人感受吧,如有差不多的感觉可以评论区说说你的看法。

react-dnd已经是一个非常不错的依赖库,但是dnd-kit设计起来更加现代化,轻量级,高性能,容易访问和扩展到web应用中。

它可以让你很容易Jira工作台看板的功能。

安装

要在 React 项目中使用 Dnd Kit,首先需要安装其核心库。可以通过以下命令进行安装:

bash 复制代码
npm install @dnd-kit/core

此外,Dnd Kit 还提供了其他可选的包,如修饰器(modifiers)和排序包(sortable package),这些可以根据需要安装。

基本概念

Dnd Kit 的核心是三个主要的组件:DndContextDraggableDroppable

  • DndContext:作为父组件,管理拖放操作的上下文环境。
  • Draggable:表示可以拖动的元素。
  • Droppable:表示可以放置拖动元素的目标区域。

这三个组件使用起来会比react-dnd更加方便。

使用方法

实现拖放功能的基本步骤如下:

  1. 创建 Draggable 组件 :定义一个可拖动的元素,并使用 useDraggable 钩子来提供拖动功能。
  2. 创建 Droppable 组件 :定义一个可放置的区域,并使用 useDroppable 钩子来处理元素的放置逻辑。
  3. 组合组件 :将 DraggableDroppable 组件放置在 DndContext 内部,以确保它们之间的正确交互。

示例

以下是一个简单的拖放示例,展示了如何使用 Dnd Kit 创建一个可拖动的按钮和一个可放置的区域:

jsx 复制代码
import React from "react";
import { DndContext } from "@dnd-kit/core";

import { Draggable } from "./Draggable";
import { Droppable } from "./Droppable";

function App() {
  return (
    <DndContext>
      <Draggable />
      <Droppable />
    </DndContext>
  );
}
rust 复制代码
// Draggable.jsx
import React from 'react';
import { useDraggable } from '@dnd-kit/core';

export function Draggable(props) {
    const { attributes, listeners, setNodeRef, transform } = useDraggable({
        id: 'draggable',
    });
    
    // attributes: 一个对象,包含使组件可拖动所需的 HTML 属性
		// listeners: 包含用户拖动组件时触发的事件监听器的对象
		// setNodeRef: 用于设置组件 DOM 节点引用的函数
		// transform: 一个对象,包含组件当前的 x 和 y 移位(以像素为单位)
    
    const style = transform ? {
        transform: `translate3d(${transform.x}px, ${transform.y}px, 0)`,
    } : undefined;

    return (
        <button ref={setNodeRef} style={style} {...listeners} {...attributes}>
            {props.children}
        </button>
    );
}
rust 复制代码
import React from 'react';
import { useDroppable } from '@dnd-kit/core';

export function Droppable(props) {
    const { isOver, setNodeRef } = useDroppable({
        id: 'droppable',
    });
    
    // isOver: 布尔值,表示可拖动组件当前是否位于可下垂组件的上方
    // setNodeRef: 用于设置组件 DOM 节点引用的函数
    
    const style = {
        color: isOver ? 'blue' : undefined,
    };

    return (
        <div ref={setNodeRef} style={style}>
            {props.children}
        </div>
    );
}

最后添加end事件在DndContext中

rust 复制代码
 function handleDragEnd(event) {
    const {active, over} = event;
    
    if (active.id !== over.id) {
      setItems((items) => {
        const oldIndex = items.indexOf(active.id);
        const newIndex = items.indexOf(over.id);
        
        return arrayMove(items, oldIndex, newIndex);
      });
    }
  }
  
  // 需要注意的是 id 需要在 使用 useDroppable 提前注册
  useDroppable({
  id: props.id,
  data: {
    index: props.index,
  },
  })
  
  // 如果你需要提取data的话是 active.data.current.index 
  

样式和自定义

Dnd Kit 提供了强大的 API,允许开发者自定义拖动元素的外观和行为。通过 CSS 样式和自定义钩子,可以轻松实现个性化的拖放效果。

rust 复制代码
// 拖动的过程我吗可以拿到setNodeRef,Dom的引用进行Dom操作

<button ref={setNodeRef}></button>

setNodeRef.current.style.xxxx = 'xxxxx';

结语

Dnd Kit 是一个高效、灵活且易于使用的 React 拖放工具包。它不仅适用于简单的拖放场景,也能够应对复杂的交互需求。无论你是初学者还是经验丰富的开发者,Dnd Kit 都是一个值得尝试的现代前端工具。

相关推荐
星语卿20 分钟前
Vuetify:构建优雅Vue应用的Material Design组件库
前端·javascript·vue.js
wangbing112531 分钟前
界面规范11-对话框
javascript·vue.js·elementui
roman_日积跬步-终至千里1 小时前
【系统架构设计(25)】Web应用服务器与现代架构
前端·架构·系统架构
yshhuang1 小时前
在Windows上搭建开发环境
前端·后端
littleplayer1 小时前
Redux在iOS中的使用
前端
跟橙姐学代码1 小时前
Python里的“管家婆”:带你玩转os库的所有神操作
前端·python·ipython
jingling5551 小时前
uniapp | 快速上手ThorUI组件
前端·笔记·前端框架·uni-app
UrbanJazzerati1 小时前
可拖拽的进度条组件实战:实现思路与Demo
前端·面试
Cache技术分享1 小时前
188. Java 异常 - Java 异常处理规范
前端·后端