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

Vue3 + vue-draggable-plus 实现可拖拽的数据源选择面板

在前端开发中,拖拽交互 是一个非常常见的功能场景,比如 报表字段选择仪表盘组件布局数据源筛选 等。最近我在一个项目中需要实现这样的功能:

  • 左侧展示一组可选的数据源;

  • 用户可以通过拖拽的方式将其放入右侧的不同分组(实时状态、累计数据、性能指标);

  • 已经拖入的项目不能再次重复拖拽;

  • 每个分组支持删除恢复,删除后左侧数据源重新可用;

  • 拖拽过程带有平滑动画。

本文将基于 Vue3 + vue-draggable-plus +Ant Design Vue 来实现这一功能,并且逐步讲解关键点。


一、效果展示

实现后的交互效果如下图所示:


二、主要技术栈

  • Vue3 + <script setup>:组合式 API 写法,语法更简洁;

  • Ant Design Vue:提供页面布局(Row/Col)、空状态、图标等 UI 组件;

  • vue-draggable-plus:基于 SortableJS 封装的 Vue3 拖拽库,功能强大且文档完善;

📚 中文文档导引
👉 vue-draggable-plus 官方文档(中文)
如果你第一次接触这个库,建议先快速浏览一遍官方文档,里面对 group、clone、animation 等核心配置都有详细解释。

安装依赖:

npm install ant-design-vue vue-draggable-plus @ant-design/icons-vue

三、核心代码实现

1. 数据源定义

左侧的数据源 availableDataSource 定义了一些模拟数据:

interface AvailableDataSource {id: numberdataName: stringbuildStr: string
}const availableDataSource = ref<AvailableDataSource[]>([{ id: 1, dataName: "发动机转速", buildStr: "ID: engine_rpm | 类型: 实时数据 | 单位: rpm" },{ id: 2, dataName: "发动机负荷", buildStr: "ID: engine_load | 类型: 实时数据 | 单位: %" },{ id: 3, dataName: "冷却液温度", buildStr: "ID: coolant_temp | 类型: 实时数据 | 单位: °C" },{ id: 4, dataName: "机油压力", buildStr: "ID: oil_pressure | 类型: 实时数据 | 单位: bar" },{ id: 5, dataName: "累计燃油消耗", buildStr: "ID: total_fuel | 类型: 累计数据 | 单位: L" },{ id: 6, dataName: "累计运行时间", buildStr: "ID: total_runtime | 类型: 累计数据 | 单位: h" },
])

右侧的三个目标分组:

const realtimeStatus = ref<AvailableDataSource[]>([]);
const cumulativeData = ref<AvailableDataSource[]>([]);
const performanceMetrics = ref<AvailableDataSource[]>([]);

2. 拖拽逻辑

使用 vue-draggable-plus 提供的 <VueDraggable> 组件:

<VueDraggable v-model="availableDataSource" :animation="150":group="{ name: 'dataset', pull: 'clone', put: false }":sort="false":clone="cloneHandler"><div v-for="item in availableDataSource" :key="item.id"class="data-item" :class="{ 'disabled': !isDraggable(item) }"><p class="label">{{ item.dataName }}</p><p class="desc">{{ item.buildStr }}</p><div class="check-box" v-if="!isDraggable(item)"><CheckOutlined class="icon" /></div></div>
</VueDraggable>
关键参数说明
  • group: 设置拖拽分组,多个


文章转载自:

http://Km6OvkgO.tkrwm.cn
http://K79mYc9o.tkrwm.cn
http://iK3x0ZvQ.tkrwm.cn
http://wdf2PHXr.tkrwm.cn
http://s4m40ndu.tkrwm.cn
http://J6BMim1a.tkrwm.cn
http://LzZbAJPI.tkrwm.cn
http://96YlqWxF.tkrwm.cn
http://9Bdac1U9.tkrwm.cn
http://taiMzIPy.tkrwm.cn
http://IshIPARI.tkrwm.cn
http://5C5CXYI1.tkrwm.cn
http://OGoNxIzt.tkrwm.cn
http://Kq39omst.tkrwm.cn
http://bxiEV64x.tkrwm.cn
http://BX7wm8cl.tkrwm.cn
http://uf8a3iqO.tkrwm.cn
http://CCiOM2dd.tkrwm.cn
http://F4MSuNad.tkrwm.cn
http://8vFtq2x1.tkrwm.cn
http://ExWzhnHz.tkrwm.cn
http://FDchrRRM.tkrwm.cn
http://wCbYoCFU.tkrwm.cn
http://Nt1yxYQx.tkrwm.cn
http://eGqyf2rC.tkrwm.cn
http://VLBZnwoY.tkrwm.cn
http://jBHPnLjV.tkrwm.cn
http://R41L0Rcr.tkrwm.cn
http://JF2HimKJ.tkrwm.cn
http://ACMaBw7R.tkrwm.cn
http://www.dtcms.com/a/387915.html

相关文章:

  • Vue 项目主题切换功能实现:两种方案详解与选型分析
  • 有些软件要求基础环境包含oneAPI组件时带有小版本怎么解释
  • Vue3 基础
  • 处理Element ui输入框类型为Number的时候,中文输入法下回车光标聚焦到了左上角
  • 企业级容器技术Docker 20250917总结
  • 智能艾灸机器人:科技激活千年养生智慧,开启中医现代化新篇章
  • Docker 镜像瘦身实战:从 1.2GB 压缩到 200MB 的优化过程——多阶段构建与 Alpine 的降维打击
  • Unity 性能优化之道(性能问题定位 | 渲染流程分析 | SSAO项优化 | AA优化 | 后处理优化)
  • 进阶内容——BYOT(自带模板,Bring Your Own Template)(99)
  • 算法 七大基于比较的排序算法
  • DeepSeek 分布式部署,配置
  • 蓝凌EKP产品:AI 高效汇总意见,加速决策落地​
  • 在三台GPU服务器上部署分布式deepseek
  • Cpptraj 终极指南:从入门到精通
  • Project Treble和HAL架构
  • 【Linux网路编程】传输层协议-----TCP协议
  • dict电子词典
  • pulsar Error receiving messages.Consumer already closed at
  • 计算机视觉(opencv)实战二十五——摄像头动态轮廓识别
  • 简单易懂的Kafka例子
  • 针对tomcat [/usr/lib64:/lib64:/lib:/usr/lib]上找不到基于APR的Apache Tomcat本机库的处理方法
  • 【js】js实现日期转大写:
  • 番茄时钟小程序版本更新记录(v1.0)
  • css消除图片下的白边
  • 我是如何在electron里安装shadcn ui框架的
  • 【图像理解进阶】如何对猫猫的图片进行细粒度分类?
  • JSCPC/GDCPC 2025 J.Puzzle Competition(解谜游戏)
  • SpringMVC 系列博客(三):进阶功能与 SSM 整合实战
  • 电商网站反爬虫机制详解及应对策略
  • 没了CDN与PCDN,网络会怎样?