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

【dnd-kit】react前端做一个可以垂直拖动的无序列表

背景和效果

需要做一个垂直拖动的无序列表。因项目中其他模块已经使用了dnd-kit, 为保持一致,使用的也是dnd-kit。效果如下:

可拖拽列表示例

资料

React生态中主流拖拽库的深度对比与选型指南

选型决策矩阵

代码

importReact,{useState}from'react';import{DndContext,closestCenter,PointerSensor,useSensor}from'@dnd-kit/core';import{SortableContext,verticalListSortingStrategy,useSortable}from'@dnd-kit/sortable';import{CSS}from'@dnd-kit/utilities';constmockData=[{id:"1",name:"项目一"},{id:"2",name:"项目二"},{id:"3",name:"项目三"},{id:"4",name:"项目四"},{id:"5",name:"项目五"},{id:"6",name:"项目六"},]constDragableList=()=>{const[items,setItems]=useState(mockData);constsensor=useSensor(PointerSensor,{activationConstraint:{distance:5,},});// 可排序列表项组件constSortableItem=({item})=>{const{attributes,listeners,setNodeRef,transform,transition,isDragging,}=useSortable({id:item.id});conststyle={transform:CSS.Transform.toString(transform),// 决定拖拽效果transition,opacity:isDragging?0.5:1,cursor:'grab',padding:'12px',margin:'8px 0',backgroundColor:'#f8f9fa',border:'1px solid #dee2e6',borderRadius:'4px',userSelect:'none',};return(<div ref={setNodeRef}style={style}{...attributes}{...listeners}>// 如果拖拽的模块更复杂,写在这个return里{item.name}</div>);};consthandleDragEnd=(event)=>{const{active,over}=event;if(active.id!==over?.id){setItems((items)=>{constoldIndex=items.findIndex(item=>item.id===active.id);constnewIndex=items.findIndex(item=>item.id===over.id);// 重新排列数组constnewItems=[...items];const[movedItem]=newItems.splice(oldIndex,1);newItems.splice(newIndex,0,movedItem);returnnewItems;});}};return(<div style={{padding:'20px',maxWidth:'400px',margin:'0 auto'}}><h2>可拖拽列表</h2><DndContext sensors={[sensor]}collisionDetection={closestCenter}onDragEnd={handleDragEnd}><SortableContext items={items.map((item)=>item.id)}strategy={verticalListSortingStrategy}>{items.map((item)=>(<SortableItem key={item.id}item={item}/>))}</SortableContext></DndContext><div style={{marginTop:'20px',fontSize:'14px',color:'#6c757d'}}><p>拖拽说明:</p><ul><li>点击并拖动项目可重新排序</li><li>当前项目数:{items.length}</li></ul></div></div>);};exportdefaultDragableList;

复杂组件

// 可排序列表项组件constSortableItem=({item})=>{const{attributes,listeners,setNodeRef,transform,transition,isDragging,}=useSortable({id:item.id});conststyle={transform:CSS.Transform.toString(transform),// 决定拖拽效果transition,opacity:isDragging?0.5:1,cursor:'grab',padding:'12px',margin:'8px 0',backgroundColor:'#f8f9fa',border:'1px solid #dee2e6',borderRadius:'4px',userSelect:'none',};return(<div ref={setNodeRef}style={style}{...attributes}{...listeners}><Tooltip><Popconfirm title="确定删除这条属性吗?"onConfirm={()=>deleteAttr()}conCancel={(e)=>{console.log(e)}}><Button>删除</Button></Popconfirm></Tooltip></div>);};
http://www.jsqmd.com/news/1119692/

相关文章:

  • E-Viewer深度体验:重新定义Windows平台漫画浏览体验
  • 终极指南:如何用yuzu模拟器在PC上流畅玩转任天堂Switch游戏
  • 从零到一:raylib游戏开发库终极入门指南
  • 5分钟用AI+Selenium打造智能Web自动化测试工具,降低脚本编写门槛
  • 计算机毕业设计之基于jsp考研在线复习平台
  • 《大模型实战指南》—— 面向软件开发者的系统性入门6
  • 视频融合平台的建设和应用:构建多源协同、智能驱动的新一代视频中枢
  • Gemini Advanced订阅价值评估与合规使用指南
  • 无刷直流电机驱动系统:从基础结构到先进控制策略解析
  • 解决方案:如何5分钟构建企业级国标视频监控平台
  • E-Hentai资源获取工具:革新性批量下载的效率革命
  • 一个半导体设备,速度要快,精度要高,结果要精确,这个如何设计
  • E-Hentai资源管理工具:开源授权的批量资源本地化解决方案
  • 基建配套预制构件怎么选?2026年7月预制检查井厂家推荐参考
  • 百度文库文档净化脚本:让PDF保存变得简单纯粹
  • OpenClaw机械抓取系统:核心组件与工业应用解析
  • 5步打造专属漫画浏览体验:E-Viewer高效使用指南
  • E-Viewer完整使用手册:高效浏览同人作品的Windows客户端
  • Hydra RDP爆破实战:避开五大常见错误,提升渗透测试效率
  • 如何免费提升BT下载速度300%:trackerslist终极指南
  • 输电线路相关故障诊断技术研究
  • Qwen3实测全解析:4B到32B模型在多平台部署与中文任务表现
  • 第167章 公开(墨子)
  • 《大模型实战指南》—— 面向软件开发者的系统性入门2
  • biliTickerBuy终极指南:如何在B站会员购实现多日期抢票的完整教程
  • Ubuntu 搭建 SASL+SVN 服务
  • STM32F103C8T6的USB—CDC虚拟端口组件(HAL)
  • 3步搞定批量图片下载:让效率提升10倍的免费工具
  • 特征融合技术提升小目标检测性能:原理、实现与工程实践
  • PM的游戏思维