• 使用element-ui+sortablejs实现表格的拖拽排序


    拖拽表格组件:

    1. <template>
    2. <div ref="wrapper">
    3. <div :key="tableKey">
    4. <slot>slot>
    5. div>
    6. div>
    7. template>
    8. <script>
    9. import sortable from "sortablejs";
    10. export default {
    11. name: "ElTableDraggable",
    12. props: {
    13. handle: {
    14. type: String,
    15. default: ""
    16. },
    17. animate: {
    18. type: Number,
    19. default: 100
    20. }
    21. },
    22. data () {
    23. return {
    24. tableKey: 0,
    25. tableObj: undefined,
    26. };
    27. },
    28. methods: {
    29. //修改参数 目前只用来修改是否可拖拽了
    30. changeOption (name, value) {
    31. this.tableObj.option(name, value)
    32. },
    33. //初始化
    34. makeTableSortAble () {
    35. const table = this.$children[0].$el.querySelector(
    36. ".el-table__body-wrapper tbody"
    37. );
    38. this.tableObj = sortable.create(table, {
    39. handle: this.handle,
    40. animation: this.animate,
    41. //拖拽结束将新的排序数组传回给父组件
    42. onEnd: ({ newIndex, oldIndex }) => {
    43. this.keepWrapperHeight(true);
    44. this.tableKey = Math.random();
    45. const arr = this.$children[0].data;
    46. const targetRow = arr.splice(oldIndex, 1)[0];
    47. arr.splice(newIndex, 0, targetRow);
    48. this.$emit("drop", { targetObject: targetRow, list: arr });
    49. }
    50. });
    51. },
    52. keepWrapperHeight (keep) {
    53. // eslint-disable-next-line prefer-destructuring
    54. const wrapper = this.$refs.wrapper;
    55. if (keep) {
    56. wrapper.style.minHeight = `${wrapper.clientHeight}px`;
    57. } else {
    58. wrapper.style.minHeight = "auto";
    59. }
    60. }
    61. },
    62. mounted () {
    63. this.makeTableSortAble();
    64. },
    65. watch: {
    66. //每次拖拽都重新初始化
    67. tableKey () {
    68. this.$nextTick(() => {
    69. this.makeTableSortAble();
    70. this.keepWrapperHeight(false);
    71. });
    72. }
    73. }
    74. };
    75. script>

    父组件引用:

    1. <script>
    2. import ElTableDraggable from '@/components/Sortable/ElTableDraggable'
    3. export default {
    4. data(){
    5. return{
    6. checkedUpIds: [],//选中的id合集
    7. checkedUpList: [],//选中的数据
    8. upList: [],//全部数据
    9. }
    10. },
    11. methods:{
    12. //拖拽完毕的回调 因为每次拖拽会重新初始化列表 所以需要将拖拽前选中的数据重新选中
    13. dropTable (obj) {
    14. this.$nextTick(() => {
    15. obj.list.forEach((element) => {
    16. //在选中列表里的再去遍历
    17. if (this.checkedUpIds.indexOf(element.id) != -1) {
    18. //还得用原始数据才能选中
    19. this.upList.forEach(element1 => {
    20. if (element1.id== element.id) {
    21. this.$refs.multipleTable.toggleRowSelection(element1, true);
    22. }
    23. })
    24. }
    25. })
    26. })
    27. },
    28. //选中/取消选中事件
    29. selectChange (selection, row) {
    30. this.checkedUpList = selection
    31. if (row) {
    32. //判断是选中还是取消选中
    33. let selected = selection.length && selection.indexOf(row) !== -1;
    34. if (selected) {
    35. this.checkedUpIds.unshift(row.productSku)
    36. } else {
    37. this.checkedUpIds.splice(this.checkedUpIds.indexOf(row.id), 1)
    38. }
    39. } else {
    40. //全选
    41. if (selection.length) {
    42. this.checkedUpIds = []
    43. selection.forEach(element => {
    44. this.checkedUpIds.push(element.id)
    45. })
    46. } else {
    47. //全不选
    48. this.checkedUpIds = []
    49. }
    50. }
    51. },
    52. }
    53. }
    54. script>

  • 相关阅读:
    万达商业再递招股书:上半年派息35亿 腾讯与碧桂园是股东
    开通一个幻兽帕鲁专用服务器多少钱?阿里云挺便宜
    03- 目标检测数据集和标注工具介绍 (目标检测)
    晶圆代工由一家独大,到三足鼎立,再到群雄涿鹿,到底经历了什么?
    多进程multiprocessing
    【数据结构--顺序表】移除元素
    543. 二叉树的直径
    小程序+自定义插件的混合模式
    C++ 智能指针浅析
    入门必读:Python try except异常处理详解
  • 原文地址:https://blog.csdn.net/qq_37628661/article/details/127119446