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

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)}
}

以上。

http://www.lryc.cn/news/346740.html

相关文章:

  • Webpack模块联邦:微前端架构的新选择
  • CMake 学习笔记(访问Python)
  • 【ruoyi】docker部署 captchaImage接口 FontConfiguration空指针异常
  • P1443 马的遍历
  • AI学习指南概率论篇-贝叶斯推断
  • 大数据测试
  • 金融业开源软件应用 管理指南
  • SolidWorks 齿轮配合
  • 鸿蒙开发-ArkTS语言-XML
  • 网安面经之文件上传漏洞
  • 如何使用 WavLM音频合成模型
  • 学习java第六十七天
  • Linux(Ubuntu24.04) 安装 MinIO
  • 视频汇聚边缘网关EasyCVR硬件设备无法访问域名,解析失败该如何处理?
  • 差速机器人模型LQR 控制仿真(c++ opencv显示)
  • 探索设计模式的魅力:权力集中,效率提升,中心化模式的优势与挑战
  • uniapp0基础编写安卓原生插件之编写安卓页面在uniapp上显示(摄像头调用)
  • fastapi数据库连接池的模版
  • 如何批量将十六进制数据转成bin文件
  • 知识付费程序源码_30秒轻松搭建知识付费小程序_免费试用,知识付费工具有哪些?哪个比较好用?
  • 【系统架构师】-案例篇(九)容器化、CDN与微服务
  • OpenAI工作原理及核心机制
  • JVM调优-调优原则和原理分析
  • dell服务器安装ubuntu18.04桌面版教程
  • 医疗图像处理2023年CVPR:Label-Free Liver Tumor Segmentation-无标签肝肿瘤分割
  • 远程桌面如何连接?
  • Centos 停服倒计时!你的操作系统何去何从?
  • ITMS-91053: Missing API declaration
  • iOS 裁剪图片
  • 算法训练营第60天|LeetCode 647.回文子串 516.最长回文子序列