使用dnd-kit在react下实现一个可拖动排序的列表

472 阅读2分钟

react-dnd-kit 是一个灵活且高性能的拖放库,专为 React 应用设计,允许开发者轻松实现复杂的拖放交互。在这个教程中,我们将学习如何使用 react-dnd-kit 创建一个简单的拖放示例。


1. 安装 react-dnd-kit

首先,确保你有一个 React 项目。如果还没有,可以使用 Create React App 创建一个新项目:

bash
复制代码
npx create-react-app my-dnd-app
cd my-dnd-app

接下来,安装dnd相关模块:

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

2. 创建一个可排序列表

为了使列表项可以排序,我们需要使用 @dnd-kit/sortable。以下是如何实现的:

修改 DraggableList.js,添加排序逻辑:

javascript
复制代码
/* eslint-disable react/prop-types */

import React from 'react';


import { DndContext,  useDroppable, } from '@dnd-kit/core';
import { CSS } from '@dnd-kit/utilities';
import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
import { SortableContext, useSortable, arrayMove } from '@dnd-kit/sortable';

const DraggableItem = ({ id, children }) => {
  const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id });
  return (
    <div
      ref={setNodeRef}
      {...listeners}
      {...attributes}
      style={{
        padding: '8px',
        margin: '4px',
        background: 'lightblue',
        cursor: 'grab',
        transform: CSS.Transform.toString(transform),
        transition,
      }}
    >
      {children}
    </div>
  );
};

const DroppableArea = ({ children }) => {
  const { setNodeRef } = useDroppable({ id: 'droppable' });
  return (
    <div ref={setNodeRef} style={{ padding: '16px', border: '2px dashed lightgray' }}>
      {children}
    </div>
  );
};

const DraggableList = () => {
  const [items, setItems] = React.useState(['Item 1', 'Item 2', 'Item 3']);
  const 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);
      });
    }
  };

  return (
    <DndContext onDragEnd={handleDragEnd} modifiers={[restrictToVerticalAxis]}>
      <DroppableArea>
        <SortableContext items={items} onDragEnd={handleDragEnd}>
          {items.map((item) => (
            <DraggableItem key={item} id={item}>
              {item}
            </DraggableItem>
          ))}
        </SortableContext>
      </DroppableArea>
    </DndContext>
  );
};

export default DraggableList;

3. 使用组件

src/App.js 中使用 DraggableList 组件:

javascript
复制代码
import React from 'react';
import { DndContext } from '@dnd-kit/core';
import DraggableList from './DraggableList';

function App() {
  return (
    <DndContext>
      <h1>Drag and Drop List</h1>
      <DraggableList />
    </DndContext>
  );
}

export default App;

4. 运行项目

在项目根目录下,启动开发服务器:

bash
复制代码
npm start

打开浏览器访问 http://localhost:3000,你会看到一个可拖动排序的列表。


总结

通过这个教程,你学习了如何使用 react-dnd-kit 创建一个简单的拖放列表,并实现了排序功能。react-dnd-kit 提供了强大的 API,使得实现复杂的拖放交互变得简单而高效。

接下来,你可以探索更多高级特性,比如自定义拖动效果、实现多个拖放区域等,以丰富你的应用交互体验。