应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue3 element plus table+Sortable.js 行拖动,表格拖动

3977人阅读 2021/3/23 16:23 总访问:5182782 评论:0 收藏:0 手机
分类: 前端

要先安装好Sortable.js依赖

  1. cnpm install sortable.js

实现拖动的代码如下

可以直接复制运行

  1. <template>
  2. <div class="app-container">
  3. <el-card>
  4. <el-table :data="state.tableData" style="width: 100%">
  5. <el-table-column prop="date" label="Date" width="180" />
  6. <el-table-column prop="name" label="Name" width="180" />
  7. <el-table-column prop="address" label="Address" />
  8. </el-table>
  9. </el-card>
  10. </div>
  11. </template>
  12. <script lang="ts" setup>
  13. import { defineAsyncComponent, reactive, toRefs, onMounted, ref } from 'vue'
  14. import Sortable from 'sortablejs'
  15. const state = reactive({
  16. tableData: [
  17. {
  18. date: '2016-05-03',
  19. name: 'Tom-1',
  20. address: 'No. 189, Grove St, Los Angeles',
  21. },
  22. {
  23. date: '2016-05-02',
  24. name: 'Tom-2',
  25. address: 'No. 189, Grove St, Los Angeles',
  26. },
  27. {
  28. date: '2016-05-04',
  29. name: 'Tom-3',
  30. address: 'No. 189, Grove St, Los Angeles',
  31. },
  32. {
  33. date: '2016-05-01',
  34. name: 'Tom-4',
  35. address: 'No. 189, Grove St, Los Angeles',
  36. },
  37. ]
  38. })
  39. //行拖拽
  40. const dragSort = () => {
  41. let that = this;
  42. // 首先获取需要拖拽的dom节点
  43. const el1 = document.querySelectorAll('.el-table__body-wrapper')[0].querySelectorAll('table > tbody')[0];
  44. Sortable.create(el1, {
  45. disabled: false, // 是否开启拖拽,false为开启
  46. ghostClass: 'sortable-ghost', //拖拽样式
  47. animation: 150, // 拖拽延时,效果更好看
  48. group: { // 是否开启跨表拖拽
  49. pull: false,
  50. put: false
  51. },
  52. onEnd: (evt: any) => { //进行数据的处理,拖拽实际并不会改变绑定数据的顺序
  53. console.log("拖动结束了,", evt)
  54. // 可以获取拖动前与拖动后的序号
  55. const { newIndex, oldIndex } = evt
  56. console.log(oldIndex, newIndex)
  57. // 数据源不会变的哦
  58. console.log(state.tableData)
  59. }
  60. });
  61. }
  62. onMounted(() => {
  63. // 实现行拖拽。这个方法一般都要放到数据回来之后,比如数据是通过接口回来的
  64. dragSort()
  65. })
  66. </script>
  67. <style scoped="scoped" lang="scss">
  68. </style>

进行绑定的数据源处理,拖拽实际并不会改变绑定数据的顺序

一般存储改造后的数据就可以了,调用存储方法存储一下就行了。这里要特别注意el-table的row-id属性这个必需要添加,否则进行数据源操作后数据顺序会错乱哦

  1. <template>
  2. <div class="app-container">
  3. <el-card>
  4. <el-table :data="state.tableData" row-key="id" style="width: 100%">
  5. <el-table-column prop="date" label="Date" width="180" />
  6. <el-table-column prop="name" label="Name" width="180" />
  7. <el-table-column prop="address" label="Address" />
  8. </el-table>
  9. </el-card>
  10. </div>
  11. </template>
  12. <script lang="ts" setup>
  13. import { defineAsyncComponent, reactive, toRefs, onMounted, ref } from 'vue'
  14. import Sortable from 'sortablejs'
  15. const state = reactive({
  16. dictTableKey:1,
  17. tableData: [
  18. {
  19. id:"1",
  20. date: '2016-05-03',
  21. name: 'Tom-1',
  22. address: 'No. 189, Grove St, Los Angeles',
  23. },
  24. {
  25. id:"2",
  26. date: '2016-05-02',
  27. name: 'Tom-2',
  28. address: 'No. 189, Grove St, Los Angeles',
  29. },
  30. {
  31. id:"3",
  32. date: '2016-05-04',
  33. name: 'Tom-3',
  34. address: 'No. 189, Grove St, Los Angeles',
  35. },
  36. {
  37. id:"4",
  38. date: '2016-05-01',
  39. name: 'Tom-4',
  40. address: 'No. 189, Grove St, Los Angeles',
  41. },
  42. ]
  43. })
  44. //行拖拽
  45. const dragSort = () => {
  46. let that = this;
  47. // 首先获取需要拖拽的dom节点
  48. const el1 = document.querySelectorAll('.el-table__body-wrapper')[0].querySelectorAll('table > tbody')[0];
  49. Sortable.create(el1, {
  50. disabled: false, // 是否开启拖拽,false为开启
  51. ghostClass: 'sortable-ghost', //拖拽样式
  52. animation: 150, // 拖拽延时,效果更好看
  53. group: { // 是否开启跨表拖拽
  54. pull: false,
  55. put: false
  56. },
  57. onEnd: (evt: any) => { //进行数据的处理,拖拽实际并不会改变绑定数据的顺序
  58. console.log("拖动结束了,", evt)
  59. // 可以获取拖动前与拖动后的序号
  60. const { newIndex, oldIndex } = evt
  61. console.log(oldIndex, newIndex)
  62. // 数据源不会变的哦
  63. console.log("改造前的数据源", state.tableData)
  64. // 这样可以把拖动前的那一行取出来
  65. // const currRow = state.tableData[oldIndex]
  66. // 把拖动前的那一行干掉并且取出来
  67. const currRow = state.tableData?.splice(oldIndex, 1)[0]
  68. // 把拖动前的那一行放到拖动后的位置
  69. state.tableData?.splice(newIndex, 0, currRow)
  70. // 一般存储改造后的数据就可以了,调用存储方法存储一下就行了。
  71. }
  72. });
  73. }
  74. onMounted(() => {
  75. // 实现行拖拽。这个方法一般都要放到数据回来之后,比如数据是通过接口回来的
  76. dragSort()
  77. })
  78. </script>
  79. <style scoped="scoped" lang="scss"></style>

如果不想改变数据源,可以复制一份数据源出来改造:
当然这种情况还是比较少的,一般都直接操作数据源了,存储也好存储,不然可能还要维护多份数据

  1. onEnd: (evt: any) => { //进行数据的处理,拖拽实际并不会改变绑定数据的顺序
  2. console.log("拖动结束了,", evt)
  3. // 可以获取拖动前与拖动后的序号
  4. const { newIndex, oldIndex } = evt
  5. console.log(oldIndex, newIndex)
  6. // 数据源不会变的哦
  7. console.log("改造前的数据源",state.tableData)
  8. // 这样可以把拖动前的那一行取出来
  9. // const currRow = state.tableData[oldIndex]
  10. // 复制一份数据出来改造
  11. let copyData = JSON.parse(JSON.stringify(state.tableData))
  12. // 把拖动前的那一行干掉并且取出来
  13. const currRow = copyData?.splice(oldIndex, 1)[0]
  14. // 把拖动前的那一行放到拖动后的位置
  15. copyData?.splice(newIndex, 0, currRow)
  16. console.log("改造后的数据源",copyData)
  17. // 一般用保存后的数据,调用存储方法存储一下就行了
  18. //state.tableData = copyData
  19. }

dom节点可以通过vue3的ref来获取,特别是封装成组件后每个组件里边的表格都需要拖动的情况

  1. <div ref="tableDataWrappeRef">
  2. <el-card>
  3. <el-table :data="state.tableData" style="width: 100%">
  4. <el-table-column prop="date" label="Date" width="180" />
  5. <el-table-column prop="name" label="Name" width="180" />
  6. <el-table-column prop="address" label="Address" />
  7. </el-table>
  8. </el-card>
  9. </div>

ts部分:

  1. // dom节点可以通过vue3的ref来获取,特别是封装成组件后每个组件里边的表格都需要拖动的
  2. const el1 = tableDataWrappeRef.value.querySelectorAll('.el-table__body-wrapper')[0].querySelectorAll('table > tbody')[0];

注意ref要放到dom对象上面比如div,不要放到组件上面,也就是不要放到el-table上面,比如不要这么写:
这样放到组件上面获取不到dom节点哦

  1. <el-card ref="tableDataWrappeRef">
  2. <el-table :data="state.tableData" style="width: 100%">
  3. <el-table-column prop="date" label="Date" width="180" />
  4. <el-table-column prop="name" label="Name" width="180" />
  5. <el-table-column prop="address" label="Address" />
  6. </el-table>
  7. </el-card>

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

css弹性盒子flex布局

css弹性盒子由于版本不同浏览器问题造成了一些不同的写法display:flexbox;在google浏览器中如果使用下面的写法就不行displa...

可输入下拉文本框据输入动态加载数据 jquery-editable-select

用到一个jquery-editable-select的控件github地址:https://github.com/indrimuska/jquery-editable-select这个插件的原理是...

.net mvc分部页.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

css中单位pxemrem和vh/vw的理解

&gt;px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。em是相对长度单位。相对于当前对象内文本的字...

让IIS支持webp格式图片让IIS支持vtt格式iis设置mime类型iis配置支持的类型

webp格式图片可以让图片体积变小。也让下载图片变得更加困难一点 在线制作webp工具 https://www.upyun.com/webp?utm_mediu...

网页上传文件断点续传的实现无视文件大小上传以及datatables基本用法

首先明白js是客户带执行代码,c#是服务器上执行代码。本地文件需要用到js处理,服务器端接受c#代码处理1.HTML页面,文件信...

如何使用图标像使用文字一样使用文本图标的方法

1.首先在Iconfont-阿里巴巴矢量图标库上面找到你需要的图标然后加入你的购物车然后选择图标;注意:每个类型的图标会大小不...

使用七牛云的cdn服务提高图片的加载速度

CDN介绍CDN的全称是Content Delivery Network,即内容分发网络。CDN加速主要是加速静态资源,如网站上面上传的图片、媒体,...

通俗易懂什么是.NET?什么是.NET Framework?什么是.NET Core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

JS监听input、keydown有输入法时打字完成后触发事件

在给输入框绑定input或keydown事件时预期效果是有输入法时,输入中文后触发事件,不希望输一个字母就触发一次事件可以用到c...

修改了css后让浏览器从缓存中更新

当我们修改了css后,如果不做一些操作,浏览器是不会自动更新我们的样式文件的。除非是过期或者用户手动刷新清理缓存等。所...

C MVC RedirectToAction跳转时候传递参数Action之间传值

MVC Action之间传值,页面跳转传值方法一:路由传值很简单直接使用 RedirectToAction(string actionName, string controller...

当你工作遇到以下几种状态时请果断跳槽走人

已经有想跳槽的念头,但是一直磨磨蹭蹭、犹犹豫豫的混日子,这种念头或者一直持续,或者是不是冒出头来占据你的思维了。于...

C与Java二进制编码转换补码

在C#与Java接口对接时,需要将图片转化为二进制编码传输,这时候发现c#转换出来的编码的值是0~255的范围,而java方需要的是...