Vue table表单拖拽

业务需求:

因为数据展示使用的是 elementUITable进行数据展示的,现在的需求是通过拖拽表单进行表单排序。同时,动态修改表单中的数据排列顺序。查阅了好多资料,也翻看了好多github上别人封装好的表单插件,但是最终都不是自己想要的,其中主要原因就是,后台管理系统页面中,同一个窗口可能涉及到多个表单拖拽排序,与此同时,使用部分插件就有可能导致数据更新不及时,或者下次在使用的时候,数据无论如何赋值就是更新不成功,导致最终渲染的要拖拽的表单一会有数据,一会无数据的,体验很不好。

解决方案:

选取了好多封装好的插件,都没有达到自己想要的效果。偶然间看到有人提示使用原生拖拽的方式来解决表单托拖拽排序的问题。最终,我采用 sortablejs 结合原生DOM节点操作的方式,对表单元素数据进行剪切、拼接处理等方式,最终达到理想效果。

操作步骤:

  • 首先安装 sortablejs 插件
yarn add sortablejs
  • 引用 sortablejs 插件(全局使用,或组件内使用)
import Sortable from "sortablejs";
  • Table 相关代码
<template>
<div class="drag_table">
<!-- row-key 排序依据的参数,此处不能使用 index 作为排序的依据 -->
<!-- highlight-current-row:单击选中行高亮 -->
<el-table :data="dragList" ref="dragTable" row-key="id" border stripe highlight-current-row>
<el-table-column label="序号" type="index" width="50" align="center"></el-table-column>
<el-table-column label="ID" prop="id" align="center"></el-table-column>
<el-table-column label="姓名" prop="name" show-overflow-tooltip></el-table-column>
<!-- 性别判断,使用 prop 属性 -->
<el-table-column label="性别" prop="sex">
<template slot-scope="scope">
<el-tag>{{ scope.row.sex === 0 ? '女' : '男' }}</el-tag>
</template>
</el-table-column>
<!-- 从排序表单中移除表单元素 -->
<el-table-column label="操作" width="66" align="center">
<template slot-scope="scope">
<el-button type="danger" icon="el-icon-delete" plain @click="delItem(scope.$index)">移除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>
  • JavaScript逻辑代码
// 引入排序插件
import Sortable from "sortablejs"; export default {
name: "DragTable",
data() {
return {
sortable: null /* 表单拖拽 */ ,
dragList: [{
id: 1,
name: '张三',
sex: 1
}, {
id: 2,
name: '李四',
sex: 0
}, {
id: 3,
name: '王五',
sex: 0
}, {
id: 4,
name: '赵六',
sex: 1
}]
}
},
mounted() {
// 等待数据渲染完成再加初始化拖拽表单
this.$nextTick(() => {
this.initSortTable();
});
},
methods: {
// 移除数据
delItem(index) {
this.dragList.splice(index, 1)
},
// 初始化拖拽表单
initSortTable() {
// const elTag = this.$refs['dragTable'].$el.querySelectorAll(".el-table__body-wrapper > table > tbody")[0]; // 获取 el-table
const tableTag = this.$refs['dragTable'].$el; // 获取 tbody 节点
const elTbody = tableTag.querySelectorAll(".el-table__body-wrapper > table > tbody")[0];
// 拖拽排序
this.sortable = Sortable.create(elTbody, {
onEnd: evt => {
const tempIndex = this.dragList.splice(evt.oldIndex, 1)[0];
this.dragList.splice(evt.newIndex, 0, tempIndex);
}
});
}
},
}

Vue 表单拖拽排序的更多相关文章

  1. vue el-transfer新增拖拽排序功能---sortablejs插件

    <template> <!-- target-order="unshift"必须设置,如果不设置的话后台穿的value值得顺序会被data重置 -  --> ...

  2. vue实现拖拽排序

    基于vue实现列表拖拽排序的效果 在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果:这里提供一种简单的实现方案. 此例子基于vuecli3 首先,我们先了解一下js原生拖动事件: 在拖动目标 ...

  3. vue列表拖拽排序功能实现

    1.实现目标:目标是输入一个数组,生成一个列表:通过拖拽排序,拖拽结束后输出一个经过排序的数组. 2.实现思路: 2.1是使用HTML5的drag功能来实现,每次拖拽时直接操作Dom节点排序,拖拽结束 ...

  4. vue中基于sortablejs与el-upload实现文件上传后拖拽排序

    今天做冒烟测试的时候发现商品发布有一个拖拽图片排序功能没做,赶紧加上 之前别的同事基于 vuedraggable 实现过这个功能,我这里自己深度封装了 el-upload ,用这种方式改动很大,而且感 ...

  5. RecyclerView拖拽排序和滑动删除实现

    效果图 如何实现 那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...

  6. zTree的拖拽排序

    ztree本身是可以支持拖拽的,但是却没有找到明确的支持拖拽的排序,也就是说,在拖拽过程中,需要自定义维护拖拽后的顺序并保存至后台. 在这样一个比较常规的需求情况下,网上也有朋友给出了一些解决方案,比 ...

  7. php接口实现拖拽排序功能

    列表拖拽排序是一个很常见的功能,但是后端接口如何处理却是一个令人纠结的问题 如何实现才能达到效率最高呢 先分析一个场景,假如有一个页面有十条数据,所谓的拖拽就是在这十条数据来来回回的拖,但是每次拖动都 ...

  8. html5 Sortable.js 拖拽排序源码分析

    最近公司项目经常用到一个拖拽 Sortable.js插件,所以有空的时候看了 Sortable.js 源码,总共1300多行这样,写的挺完美的.   本帖属于原创,转载请出名出处. 官网http:// ...

  9. 基于Vue实现可以拖拽的树形表格(原创)

    因业务需求,需要一个树形表格,并且支持拖拽排序,任意未知插入,github搜了下,真不到合适的,大部分树形表格都没有拖拽功能,所以决定自己实现一个.这里分享一下实现过程,项目源代码请看github,插 ...

随机推荐

  1. ASP.NET Core 3.1 WebAPI的跨域问题

    1.nuget要加上 Microsoft.AspNetCore.Cors 中间件. 2.在Startup类里先定义一个全局变量. private readonly string AllowSpecif ...

  2. 前端Web APIS

    day01 - Web APIs 学习目标: 能够通过ID来获取元素能够通过标签名来获取元素能够通过class来获取元素能够通过选择器来获取元素能够获取body和html元素能够给元素注册事件能够修改 ...

  3. python sqlite3简单操作

    python sqlite3简单操作(原创)import sqlite3class CsqliteTable: def __init__(self): pass def linkSqlite3(sel ...

  4. Fitness - 05.23

    倒计时222天 运动40分钟,共计8组,4.2公里.拉伸10分钟. 每组跑步3分钟(6.5KM/h),走路2分钟(5.5KM/h). 终于赶在姨妈前完成第3周的跑步训练了,可喜可贺~~ 下周预计要休息 ...

  5. 几个Graphics函数

    1.Graphics.Blit:Copies source texture into destination render texture with a shader 声明: 1.public sta ...

  6. nginx如何限制并发连接请求数?

    简介 限制并发连接数的模块为:http_limit_conn_module,地址:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.ht ...

  7. Linux 基础指令2

    管道符| 先执行第一个命令后执行第二个 eg:查看文件中间几行: head -n1 文件名| tail -n2 :先查看文件前n1行,然后在n1行中的后n2行 tail -n1 文件名| head - ...

  8. 如何使用zabbix监控公网环境的云服务器(从小白到高级技术顾问!!!)

    问题:当我们在本地部署了一台Zabbix服务器后,想要对云上的服务器做监控.但是zabbix一个在内网,云服务器一个在公网,网络环境不同该如何解决?能否检测到云服务器数据? 思路:使用NAT技术,将本 ...

  9. 轻轻松松学CSS:媒体查询

    轻轻松松学CSS:利用媒体查询创建响应式布局 媒体查询,针对不同的媒体类型定制不同的样式规则.在网站开发中,可以创建响应式布局. 一.初步认识媒体查询在响应式布局中的应用 下面实例在屏幕可视窗口尺寸大 ...

  10. linux 文件类型和权限

    linux 文件类型和权限 ls -l 显示: [user@wyf-201 ~]$ ll total 0 -rw-rw-r--. 1 user user 0 Aug 27 10:49 1.txt dr ...