如何用antdesign-vue实现拖拽排序,代码是什么
Admin 2022-06-14 群英技术资讯 935 次浏览
本来想在网上看看有没有基于antdesign做的,然后发现是真的少啊!废话不多说,先上图:
首先先来认识一下这个插件: sortablejs
大家可以去细读一下它的api文档:
这边我就着重介绍一下我用到的api。
1.group
可以传入对象,参数值为name
,pull
,put
,
name:如果是要两个列表下进行拖动的话,name的值必须为一样;
pull:pull用来定义从这个列表容器移动出去的设置,true/false/‘clone'/function
put:put用来定义往这个列表容器放置列表单元的的设置,true/false/[‘foo',‘bar']/function;
2.animation
ms, number 单位:ms,定义排序动画的时间;
3. handle
: 格式为简单css选择器的字符串,使列表单元中符合选择器的元素成为拖动的手柄,只有按住拖动手柄才能使列表单元进行拖动(你想让哪个元素拖动就绑定这个元素的class);
4. onStart:function(evt){}
开始拖拽的回调方法;
5. onUpdate:function(evt){}
列表内元素顺序更新的回调方法;
6. onAdd:function(evt){}
元素从一个列表拖拽到另一个列表的回调方法;
7. onRemove:function(evt){}
元素从列表中移除进入另一个列表的回调方法;
这个需求用到这些api也就足够了。
1.第一步先初始化sortable
方法,因为我们的需求是两个表格拖拽,所以初始化2个方法。
html代码
<s-table ref="table" size="default" class="left-table" rowKey="key" :columns="columns" :data="loadData"> </s-table> <s-table class="sort-table" ref="table2" size="default" class="left-table" rowKey="key" :columns="columns" :data="loadData"> </s-table>
具体的columns 和loadData就不多余阐述。
JS代码
import Sortable from 'sortablejs' methods:{ // 初始化 sortable 实现拖动 initSortable () { var that = this var el = this.$el.querySelector('.sort-table tbody') Sortable.create(el, { handle: '.ant-table-row', animation: 150, group: { name: 'name', pull: true, put: true }, onUpdate: function (evt) { }, // 开始拖拽的时候 onStart: function (evt) { }, onAdd: function (evt) { }, onRemove: function (evt) { } }) }, initSortable1 () { var that = this var el = this.$el.querySelector('.left-table tbody') Sortable.create(el, { handle: '.ant-table-row', animation: 150, group: { name: 'name', pull: true, put: true }, onUpdate: function (evt) { }, // 开始拖拽的时候 onStart: function (evt) { }, onAdd: function (evt) { }, onRemove: function (evt) { } }) }, }
关于handle
所取的class,因为我们是要对antdesign表格的每一行进行拖拽,所以要选取到他每一行的class。
至此两个table之间就可以实现拖拽效果,但仅仅只是拖拽效果。
因为这样拖拽之后,两边的数据源并没有发生变化,而且明明已经拖拽过来之后,另一边的表格的展示页会存在错误:
排序是我右边表格特有的,但是这边的表格是不需要这个排序的,而且如果拖拽成功的话为什么还会显示暂无数据呢,最后左边表头的CheckBox
也无法选中。所以到此为止只是有拖拽效果而已。
2.在拖拽动作之后,把左右两边的数据源重新赋值,这里有两种实现思路:
考虑到性能消耗,我就选择了第二种:
1)定义左右两边的数据源数组
data(){ return{ unMatchedList: [], // 左边未匹配的数据 dataList: [], // 右边已匹配的数据 pullIndex :'',//原数组拖拽元素的下标 } }
2)在每一次remove
或者add
的时候更新数据源,这里只写了一个表格拖拽的方法,另一个只要把that.dataList
和that.unMatchedList
左右两边的数据源赋值调换一下就行,就不贴重复代码了
// 开始拖拽的时候 onStart: function (evt) { that.pullIndex = evt.oldIndex }, onAdd: function (evt) { //evt.newIndex 移入到新数组的下标 //pullIndex 原数组拖拽元素的下标 that.dataList.splice(evt.newIndex, 0, that.unMatchedList[that.pullIndex]) that.dataList.forEach((item, index) => { item.sort = index + 1 }) //通知table视图更新 that.$nextTick(() => { that.$refs.table2 && this.$refs.table2.refresh(true) that.$refs.table && this.$refs.table.refresh(true) }) }, onRemove: function (evt) { that.dataList.splice(evt.oldIndex, 1) that.dataList.forEach((item, index) => { item.sort = index + 1 }) that.$nextTick(() => { that.$refs.table2 && this.$refs.table2.refresh(true) that.$refs.table && this.$refs.table.refresh(true) }) } })
3)实现同一个表格上下拖拽排序
initSortable () { var that = this var el = this.$el.querySelector('.sort-table tbody') Sortable.create(el, { handle: '.ant-table-row', animation: 150, group: { name: 'name', pull: true, put: true }, //这里千万不要用onEnd 方法 onUpdate: function (evt) { var o = evt.oldIndex var n = evt.newIndex if (o === n) { return } that.sortListAndUpdate(that.dataList, o, n) }, }) }, // 对数据进行排序,要求 o(oldIndex) 和 n(newIndex) 从 0开始 sortList (list, o, n) { var newTableData = JSON.parse(JSON.stringify(list)) var data = newTableData.splice(o, 1, null) newTableData.splice(o < n ? n + 1 : n, 0, data[0]) newTableData.splice(o > n ? o + 1 : o, 1) return newTableData }, /** * 对数据排序并更新 table, 要求 o(oldIndex) 和 n(newIndex) 从 0开始 */ sortListAndUpdate (list, o, n) { var newTableData = this.sortList(list, o, n) newTableData.forEach((item, index) => { item.sort = index + 1 }) this.$nextTick(() => { this.dataList = newTableData that.$refs.table2 && this.$refs.table2.refresh(true) }) },
这边我们选用onUpdate
方法来排序,不要用onEnd
方法,因为只要你有拖拽效果,都会去触发onEnd
方法,导致左右拖拽完后又会触发一次排序。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了基于element-ui封装表单金额输入框的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
目前关于cocos开发俄罗斯方块的文章几乎寥寥无几,因此本文将主要介绍如何通过CocosCreator Typescript制作简单的俄罗斯方块游戏,代码具有一定价值,感兴趣的同学可以学习一下
目录vue-cli3配置全局scss报错vue-cli3配置全局scss变量1. 找到vue.config.js文件2. 在文件内编写如下代码3. 重启项目,即可使用vue-cli3配置全局scss报错在vue.config.js配置的时候用prependData不要用datasass: { // 根据自己样式文件的
搜索功能可以帮助我们更快的获取到我们想要的信息,那么我们做网站时如何实现一个搜索功能呢?这篇文章就以JavaScript实现百度搜索为例,介绍一下实现原理以及具体代码。
进程间怎么进行通信?下面本篇文章给大家介绍一下Nodejs进程间通信的原理,希望对大家有所帮助!
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008