• ElementuiPlus的table组件实现行拖动与列拖动


    借助了插件sortablejs。这种方法只适合做非树状table。如果想实现树状table,并且可拖动。可以试一下aggridVue3这个插件

    1. <script setup lang="ts">
    2. import Sortable from 'sortablejs'
    3. import { onMounted, ref } from 'vue'
    4. // 只适合做平级的table行和列拖动
    5. const oldList = ref()
    6. const newList = ref()
    7. // 表头
    8. const tableItems = ref([
    9. {
    10. label: '姓名',
    11. prop: 'name',
    12. },
    13. {
    14. label: '性别',
    15. prop: 'gender',
    16. },
    17. {
    18. label: '年龄',
    19. prop: 'age',
    20. },
    21. ])
    22. // 表体数据
    23. const tableData = ref(
    24. [
    25. {
    26. id: 1,
    27. name: '李四',
    28. gender: '男',
    29. age: 20,
    30. },
    31. {
    32. id: 2,
    33. name: '王五',
    34. gender: '未知',
    35. age: 18,
    36. },
    37. {
    38. id: 3,
    39. name: '张三',
    40. gender: '男',
    41. age: 22,
    42. },
    43. ]
    44. )
    45. // 行拖拽
    46. const rowDrop = function () {
    47. // 要拖拽元素的父容器 tbody
    48. const tbody = document.querySelector('.draggable .el-table__body-wrapper tbody')
    49. Sortable.create(tbody, {
    50. // 可被拖拽的子元素
    51. draggable: ".draggable .el-table__row",
    52. onEnd({ newIndex, oldIndex }) {
    53. // newIndex 拖动到的新的索引
    54. // oldIndex 没拖动前的索引
    55. const currRow = tableData.value.splice(oldIndex, 1)[0]
    56. tableData.value.splice(newIndex, 0, currRow)
    57. }
    58. });
    59. }
    60. // 列拖拽
    61. const columnDrop = function () {
    62. // 要拖拽元素的父容器 头部的tr
    63. const wrapperTr = document.querySelector('.draggable .el-table__header-wrapper tr');
    64. Sortable.create(wrapperTr, {
    65. animation: 180,
    66. delay: 0,
    67. onEnd: (evt: any) => {
    68. const oldItem = newList.value[evt.oldIndex];
    69. newList.value.splice(evt.oldIndex, 1);
    70. newList.value.splice(evt.newIndex, 0, oldItem);
    71. }
    72. })
    73. }
    74. onMounted(() => {
    75. oldList.value = JSON.parse(JSON.stringify(tableItems.value))
    76. newList.value = JSON.parse(JSON.stringify(tableItems.value))
    77. columnDrop()
    78. rowDrop()
    79. })
    80. script>

    效果如下

    我试了加操作列,通过el-table-column的默认插槽进行实现,但是列拖动的时候,操作列的内容一直在最后一列,并没有跟着移动

    代码如下,如果不需要列拖动的话,可以采取这种方式

    1. <script setup lang="ts">
    2. import Sortable from 'sortablejs'
    3. import { onMounted, ref } from 'vue'
    4. // 只适合做平级的table行和列拖动
    5. const oldList = ref()
    6. const newList = ref()
    7. // 表头
    8. const tableItems = ref([
    9. {
    10. label: '姓名',
    11. prop: 'name',
    12. },
    13. {
    14. label: '性别',
    15. prop: 'gender',
    16. },
    17. {
    18. label: '年龄',
    19. prop: 'age',
    20. },
    21. {
    22. label: '操作',
    23. prop: 'operate',
    24. },
    25. ])
    26. // 表体数据
    27. const tableData = ref(
    28. [
    29. {
    30. id: 1,
    31. name: '李四',
    32. gender: '男',
    33. age: 20,
    34. },
    35. {
    36. id: 2,
    37. name: '王五',
    38. gender: '未知',
    39. age: 18,
    40. },
    41. {
    42. id: 3,
    43. name: '张三',
    44. gender: '男',
    45. age: 22,
    46. },
    47. ]
    48. )
    49. // 行拖拽
    50. const rowDrop = function () {
    51. // 要拖拽元素的父容器 tbody
    52. const tbody = document.querySelector('.draggable .el-table__body-wrapper tbody')
    53. Sortable.create(tbody, {
    54. // 可被拖拽的子元素
    55. draggable: ".draggable .el-table__row",
    56. onEnd({ newIndex, oldIndex }) {
    57. // newIndex 拖动到的新的索引
    58. // oldIndex 没拖动前的索引
    59. const currRow = tableData.value.splice(oldIndex, 1)[0]
    60. tableData.value.splice(newIndex, 0, currRow)
    61. }
    62. });
    63. }
    64. // 列拖拽
    65. const columnDrop = function () {
    66. // 要拖拽元素的父容器 头部的tr
    67. const wrapperTr = document.querySelector('.draggable .el-table__header-wrapper tr');
    68. Sortable.create(wrapperTr, {
    69. animation: 180,
    70. delay: 0,
    71. onEnd: (evt: any) => {
    72. const oldItem = newList.value[evt.oldIndex];
    73. newList.value.splice(evt.oldIndex, 1);
    74. newList.value.splice(evt.newIndex, 0, oldItem);
    75. }
    76. })
    77. }
    78. onMounted(() => {
    79. oldList.value = JSON.parse(JSON.stringify(tableItems.value))
    80. newList.value = JSON.parse(JSON.stringify(tableItems.value))
    81. columnDrop()
    82. rowDrop()
    83. })
    84. script>

    还有一种解决办法就是,把操作放到弹窗操作,比如双击某一行的时候,弹出弹窗,传入这行的数据,在弹窗里面进行操作,这样就不需要添加操作内一列了。行拖动和列拖动也都能使用

  • 相关阅读:
    数电课程设计
    系统架构师备考倒计时13天(每日知识点)
    PR-视频加介绍背景
    软件测试面试(五)
    ML之LoR:基于信用卡数据集利用LoR逻辑回归算法实现如何开发通用信用风险评分卡模型之以toad框架全流程讲解
    爬虫之Scrapy架构
    外卖机构怎么使用数字科技节省了工资支出
    Mysql事务
    【随笔记】SCI 简介(分区、查询网站、出版社、OA、影响因子)
    Ubuntu20配置Mysql常用操作
  • 原文地址:https://blog.csdn.net/qq_52845451/article/details/134205694