react经验15:拖拽排序组件dnd-kit的使用经验

应用场景

列表中的成员可鼠标拖拽改变顺序

实施步骤

前置引入

import type { DragEndEvent } from '@dnd-kit/core'
import { DndContext } from '@dnd-kit/core'
import {
    arrayMove,
    /*垂直列表使用verticalListSortingStrategy,
	横向列表使用horizontalListSortingStrategy
	*/
    verticalListSortingStrategy,
    SortableContext,
    useSortable,
} from '@dnd-kit/sortable'
import { CSS } from '@dnd-kit/utilities'
import React from "react"
//这个也是根据列表朝向选择vertical或horizontal
import { restrictToVerticalAxis } from "@dnd-kit/modifiers"

定义列表成员,这里用的ts

//组件外定义
declare interface DraggableTabPaneProps extends React.HTMLAttributes<HTMLLIElement> {
    'data-item-key': string
}
const DraggableListNode = ({ children, ...props }: DraggableTabPaneProps) => {
    const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition } = useSortable({
        id: props['data-item-key'],
    })

    const style: React.CSSProperties = {
        ...props.style,
        transform: CSS.Translate.toString(transform),
        transition,
    }

    return (
        <li {...props} ref={setNodeRef} style={style} {...attributes}>
            {
                React.Children.map(children, child => {
                    //这里是指定一个拖拽触发的手柄,如果需要整个列表项触发拖拽,就不要这个
                    if ((child as React.ReactElement<HTMLElement>).props.className.includes('handlemove')) {
                        return React.cloneElement(child as React.ReactElement, {
                            ...listeners,
                            ref: setActivatorNodeRef,
                        })
                    }
                    return child
                })
            }
        </li>
    )
}

渲染列表

//组件内定义
const data=[
	{key:1,content:'列表项1'},
	{key:2,content:'列表项2'}]
const [items,setItems]=useState(data)
//组件输出部分
<ul>
   <DndContext modifiers={[restrictToVerticalAxis]} onDragEnd={handleDragEnd}>
   		<SortableContext items={items.map((i) => i.key)} strategy={verticalListSortingStrategy}>
   			{//上一步声明的DraggableListNode取代了原生的li标签
				items.map(item=>(
					<DraggableListNode className="listitem" key={item.key} data-item-key={item.key}>
						<span className="handlemove">自定义拖拽手柄</span>
						{item.content}
					</DraggableListNode>
				))
			}
   		</SortableContext>
   </DndContext>
</ul>

处理拖拽结束事件,改变列表项的顺序

//组件内定义
function handleDragEnd({ active, over }: DragEndEvent) {
   if (active.id !== over?.id) {
       const activeIndex = items.findIndex((i) => i.key === active.id)
       const overIndex = items.findIndex((i) => i.key === over?.id)
       const newlist= arrayMove(items, activeIndex, overIndex)
       setItems(newlist)

   }
}

以上。

相关推荐

  1. react经验15:排序组件dnd-kit使用经验

    2024-05-12 07:42:07       35 阅读
  2. react列表排序组件

    2024-05-12 07:42:07       65 阅读
  3. React 元素教程 react-dnd 实现

    2024-05-12 07:42:07       63 阅读
  4. react经验13使用react封装富文本组件

    2024-05-12 07:42:07       41 阅读
  5. react经验10:与jquery配合使用

    2024-05-12 07:42:07       51 阅读
  6. react经验14:动态修改第三方组件样式

    2024-05-12 07:42:07       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-12 07:42:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-12 07:42:07       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-12 07:42:07       82 阅读
  4. Python语言-面向对象

    2024-05-12 07:42:07       91 阅读

热门阅读

  1. vue.js 介绍

    2024-05-12 07:42:07       31 阅读
  2. React Router DOM BrowserRouter

    2024-05-12 07:42:07       36 阅读
  3. Pycharm所有快捷键的使用

    2024-05-12 07:42:07       25 阅读
  4. 【DevOps】Linux 网络命令netstat详解

    2024-05-12 07:42:07       30 阅读
  5. ensp简单ac+ap+sta无线配置和脚本

    2024-05-12 07:42:07       25 阅读
  6. ubuntu删除opencv

    2024-05-12 07:42:07       30 阅读
  7. 华为OD介绍

    2024-05-12 07:42:07       31 阅读
  8. 网易灵犀办公企业邮箱的IMAP和POP3服务器地址

    2024-05-12 07:42:07       28 阅读
  9. Github2024-05-11 开源项目日报 Top10

    2024-05-12 07:42:07       37 阅读
  10. C语言经典例题-2

    2024-05-12 07:42:07       36 阅读
  11. 算法题① —— 数组专栏

    2024-05-12 07:42:07       28 阅读