draggable插件——实现元素的拖动排序——拖动和不可拖动的两种情况处理

最近在写后台管理系统的时候,遇到一个需求,就是关于拖动排序的功能。

我之前是写过一个关于拖动表格的功能,此功能可以实现表格中的每一行数据上下拖动实现排序的效果。
vue------实现表格的拖拽排序功能------技能提升

但是目前我这边的需求是实现属性的拖动,直接上图:

比如上图,我要拖动【管制卡号】到【客供】的后面

话不多说,直接上代码:

解决步骤1:安装vuedraggable插件

js 复制代码
npm install vuedraggable@2.24.3  //我这边安装的是这个版本,你也可以直接安装最新版本的,就是不指定版本号就是最新版本了

解决步骤2:局部页面使用

组件引入

js 复制代码
import draggable from 'vuedraggable';

组件中的注册

js 复制代码
components: { draggable },

效果图中左侧属性的渲染:
this.枚举列表 = ['测试','样板/批量','新单/返单']

js 复制代码
<a-checkbox-group
  v-model="canDragArr"
>
  <draggable
    @start.stop="dragStart"
    @end.stop="dragEnd"
    @update.stop="onUpdate"
  >
    <transition-group type="transition" name="field_list">
      <a-checkbox
        v-for="item1 in 枚举列表"
        :key="item1"
        :value="item1"
        style="min-width: 100px"
        >{{ item1 }}</a-checkbox
      >
    </transition-group>
  </draggable>
</a-checkbox-group>

分析上面的代码:

关于拖动排序,要用到的函数有:【@start】【@end】【@update】

对应的函数:

js 复制代码
dragStart() {
  //
},
dragEnd() {
  //
},
/**
 * draggable拖拽组件对象重新排序
 */
onUpdate({ newIndex, oldIndex }) {
  const newColumnsList = [];
  // 防止页面变化
  const columnsList = JSON.parse(
    JSON.stringify(this.枚举列表)
  );
  newColumnsList[newIndex] = columnsList[oldIndex];
  columnsList.splice(oldIndex, 1);
  columnsList.forEach((value, index) => {
    if (newColumnsList[index]) {
      newColumnsList[index + 1] = value;
    } else {
      newColumnsList[index] = value;
    }
  });
  console.log('newColumnsList', newColumnsList);
},

上面代码中的newColumnsList就是拖动排序后的数组了。。。

如果是部分参数不想支持拖动,怎么处理?

draggable插件是有属性可以设置不可拖动的。就是------filter

比如要将枚举列表中的【测试】一项设置为不可拖动的,则可以设置如下:

js 复制代码
<draggable
  @start.stop="dragStart"
  @end.stop="dragEnd"
  filter=".unDrag"
  @update.stop="onUpdate"
>
  <transition-group type="transition" name="field_list">
    <a-checkbox
      v-for="item1 in 枚举列表"
      :key="item1"
      :value="item1"
      :class="[
        item1=='测试' ? 'unDrag' : '',
      ]"
      style="min-width: 100px"
      >{{ item1 }}</a-checkbox
    >
  </transition-group>
</draggable>

但是这样就有一个问题,【测试】属性不可拖动了,但是其他的属性可以拖动到【测试】的前后,这样也不是我们想要的。

我们想要的效果是下面的这种:

所以最后我的处理办法是,将枚举列表分为可拖动和不可拖动两种。

完成!!!多多积累,多多收获!!!

相关推荐
雪芽蓝域zzs14 小时前
Prettier (代码格式化)配置详解
前端·vue.js
晴天1614 小时前
Gradio 与 Streamlit:Python 快速构建 Web 应用的双子星-Day28
开发语言·前端·python
码哥DFS14 小时前
LRU缓存
前端·javascript·缓存
mldong14 小时前
一条命令,十分钟:jeeflow 工作流应用的六语言一键部署
前端·后端·架构
zzzzzz31015 小时前
别急着把页面做成舞台:从 react-bits 看动画组件该怎么选
javascript·react.js·开源
运维全栈笔记17 小时前
Vue + Spring Boot 前后端分离项目部署笔记(若依 RuoYi-Vue 3.9.2)
运维·服务器·vue.js·spring boot·笔记·开源·开源软件
ly76891 天前
HTML5 从入门到工程实践:语义化、表单、多媒体、性能与项目规范详解
前端·html·html5
人民广场吃泡面1 天前
前端该重视的编程思想
前端