el-table树形列表拖拽排序(sortablejs)

  • Post author:
  • Post category:其他


思路:

首先el-table上面row-class-name绑定要传的id,

然后将树形结构的数据转换成平铺的列表结构,

拖拽结束后的监听事件

onEnd

内可以获取到

通过拖拽可以获取到 旧数据 与 新数据对象以及拖拽后平铺的数据顺序,

这时可以通过拖拽后平铺的数据顺序配合parentId来知道当前层级的顺序和id

将这排好顺序的id数组传给后端,后端返回最新的数据

拖拽中事件监听

onMove

内可以阻止树形结构内的子集拖拽出去。

1.引入sortablejs

npm install sortablejs --save

2.组件中使用

import Sortable from 'sortablejs';
<el-table :data="menuList" row-key="menuId" :row-class-name="tableClassNmae" :expand-row-keys="expandRowKeys" v-if="showFlag"></el-table>
tableClassNmae(row){
   return 'id=' + row.row.id + ''
}

// 将树数据转化为平铺数据
function treeToTile(treeData, childKey = 'children') {
  const arr = []
  const expanded = data => {
    if (data && data.length > 0) {
      data.filter(d => d).forEach(e => {
        arr.push(e)
        expanded(e[childKey] || [])
      })
    }
  }
  expanded(treeData)
  return arr
}


let activeRows = reactive([]);
let flag = true;
let expandRowKeys=ref([]) //展开行的id,底下用的是拖拽行的parentId,其实就是应该展开的行
let showFlag=ref([true])
let menuList=ref([]) //表格数据
onmounted(()=>{
  //获取需要添加拖拽的组件
  const el = document.querySelector(".el-table__body-wrapper tbody");
  //设置拖拽的参数
  const ops = {
    animation: 200, //动画时长
    handle: ".el-table__row", //可拖拽区域class
    ghostClass: "ghost", //拖拽位置样式class
    dataIdAttr: "class", //配合row-class-name设置使用
    //拖拽中事件监听
    onMove: ({ dragged, related }) => {
      activeRows = treeToTile(props.tdata) // 把树形的结构转为列表再进行拖拽  
      const oldRow = activeRows[dragged.rowIndex] //旧位置数据
      const newRow = activeRows[related.rowIndex] //被拖拽的新数据
      if (oldRow.parentId !== newRow.parentId) {
        flag = false
      } else {
        flag = true
      }

      return flag
    }, 
   //拖拽后事件监听
    onEnd(evt) {
      activeRows = treeToTile(props.tdata) // 把树形的结构转为列表再进行拖拽  
      const oldRow = activeRows[evt.oldIndex] // 移动的那个元素
      var arr = sortable2.toArray(); //获取排序后的平铺数据顺序
      for (let index = 0; index < arr.length; index++) {
        arr[index] = arr[index].match(/(?<=\bid=)[\d]+/g)[0];
      }
      let aa = activeRows.filter(d => d.parentId != oldRow.parentId).map(d => d.id);
      let bb = (arr.filter(d => aa.indexOf(d) == -1))
    if (evt.oldIndex !== evt.newIndex) {
      if (flag) {
       //调用后台接口传出bb排好序的数组,让后端返回排好的数据,在请求成功的回调里执行如下操作
        showFlag.value=false;  //刷新拖拽后的结构
           nextTick(()=>{
           showFlag.value=true;   //刷新拖拽后的结构
           menuList.value=res.data;  //重新赋值
           expandRowKeys.value=[...e.parentId]  //拖拽后让原有的行展开
       }) 
           expandRowKeys=[...oldRow.parentId] //让选中行展示
       }
      }
    },
  };
  // //初始化拖拽表格
  var sortable2 = Sortable.create(el, ops);
})



版权声明:本文为TZ1284063988原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。