Vue 表单拖拽排序
Vue table表单拖拽
业务需求:
因为数据展示使用的是 elementUI 的 Table进行数据展示的,现在的需求是通过拖拽表单进行表单排序。同时,动态修改表单中的数据排列顺序。查阅了好多资料,也翻看了好多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 表单拖拽排序的更多相关文章
- vue el-transfer新增拖拽排序功能---sortablejs插件
<template> <!-- target-order="unshift"必须设置,如果不设置的话后台穿的value值得顺序会被data重置 - --> ...
- vue实现拖拽排序
基于vue实现列表拖拽排序的效果 在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果:这里提供一种简单的实现方案. 此例子基于vuecli3 首先,我们先了解一下js原生拖动事件: 在拖动目标 ...
- vue列表拖拽排序功能实现
1.实现目标:目标是输入一个数组,生成一个列表:通过拖拽排序,拖拽结束后输出一个经过排序的数组. 2.实现思路: 2.1是使用HTML5的drag功能来实现,每次拖拽时直接操作Dom节点排序,拖拽结束 ...
- vue中基于sortablejs与el-upload实现文件上传后拖拽排序
今天做冒烟测试的时候发现商品发布有一个拖拽图片排序功能没做,赶紧加上 之前别的同事基于 vuedraggable 实现过这个功能,我这里自己深度封装了 el-upload ,用这种方式改动很大,而且感 ...
- RecyclerView拖拽排序和滑动删除实现
效果图 如何实现 那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...
- zTree的拖拽排序
ztree本身是可以支持拖拽的,但是却没有找到明确的支持拖拽的排序,也就是说,在拖拽过程中,需要自定义维护拖拽后的顺序并保存至后台. 在这样一个比较常规的需求情况下,网上也有朋友给出了一些解决方案,比 ...
- php接口实现拖拽排序功能
列表拖拽排序是一个很常见的功能,但是后端接口如何处理却是一个令人纠结的问题 如何实现才能达到效率最高呢 先分析一个场景,假如有一个页面有十条数据,所谓的拖拽就是在这十条数据来来回回的拖,但是每次拖动都 ...
- html5 Sortable.js 拖拽排序源码分析
最近公司项目经常用到一个拖拽 Sortable.js插件,所以有空的时候看了 Sortable.js 源码,总共1300多行这样,写的挺完美的. 本帖属于原创,转载请出名出处. 官网http:// ...
- 基于Vue实现可以拖拽的树形表格(原创)
因业务需求,需要一个树形表格,并且支持拖拽排序,任意未知插入,github搜了下,真不到合适的,大部分树形表格都没有拖拽功能,所以决定自己实现一个.这里分享一下实现过程,项目源代码请看github,插 ...
随机推荐
- Hello,Vue
Vue版本 Vue完整版 有编译器compiler,体积大功能多,可以直接把html字符串变成DOM节点 视图,此处为html字符串,写在index.html里或者写在new Vue构造选项templ ...
- Nuxt.js 踩坑记录(3) Net.connection xxxx
浏览器报的是Net.connection啥的错误 项目运行时报错这个 [HPM] Error occurred while trying to proxy request article from l ...
- Mac上Safari不能关键字搜索
今天打开Mac,用Safari浏览器搜索的时发现不能进行关键字搜索,搜索栏只能打开网址. 现在问题已经解决,只要删除Safari上的cookies就可以了.操作步骤如下: Safari ->pr ...
- 赫然:Windows Live Writer 批量博客更新软件使用教程
http://www.wocaoseo.com/thread-144-1-1.html 推广人员需要使用多个博客,一个一个登陆更新是很麻烦的事情,网上的桌面批量更新博客软件也不少,今天在此推荐大家使用 ...
- 从后端到前端之Vue(六)表单组件
表单组件 做项目的时候会遇到一个比较头疼的问题,一个大表单里面有好多控件,一个一个做设置太麻烦,更头疼的是,需求还总在变化,一会多选.一会单选.一会下拉的,变来变去的烦死宝宝了. 那么怎么解决这个问题 ...
- vue 里bus的使用
兄弟组件之间进行传值(非父子组件): 安装:npm install vue-bus 在main.js中引入vue-bus import Vue from 'vue'; import VueBus fr ...
- oa项目面试准备
熟悉项目在ssm框架下的编程流程,了解mysql html spring springmvc mybatis技术.了解过springboot编程. 在上个寒假跟着培训机构用springboot框架编写 ...
- Spark RDD中Runtime流程解析
一.Runtime架构图 (1)从Spark Runtime的角度讲,包括五大核心对象:Master.Worker.Executor.Driver.CoarseGrainedExecutorBack ...
- python笔记-dumps()与loads()的使用
json.dumps是将一个Python数据类型列表进行json格式的编码解析, 示例如下: >>> import json #导入python 中的json模块 >>& ...
- observeParents的使用
observeParents参数 是布尔类型 默认false 在tab切换选项中有轮播图,切换后轮播图就不播了,并且显示也出现了问题,就可以使用observeParents 用法为 <scri ...