Element的el-table实现拖拽改变某一行的高度

13 篇文章 2 订阅
文章介绍了一种方法,通过在Vue.js项目中创建一个名为dragTable.js的JS文件,自定义一个Vue指令来实现ElementUI的el-table组件支持纵向拖拽改变行的高度。作者通过监听鼠标事件并处理CSS样式,实现了拖拽行高度的功能。
摘要由CSDN通过智能技术生成

Element的el-table实现拖拽改变某一行的高度

刚看到这个需求的时候感觉也不难,就在官网看了一下文档,官方只支持横向拖拽改变某一列的宽度,并不支持纵向拖拽改变其高度。
于是就自己封装了一个指令

  • 在项目中创建一个js文件dragTable.js,将一下代码复制进去,然后在使用页面引入这个js文件,然后在el-table标签中直接使用
  • import dragTable from './dragTable.js'
  • v-drag-table
import Vue from 'vue';

let resizeable = false
let mousedown = false
let newindex = null
let targetTd = null
Vue.directive('dragTable', {
  inserted: function(el,binding,vnode,prevVnode) {
    /* 获取头部td集合,这边是测试表格,只有一个所以直接el-table__body 的0,后续可以在<el-table> 加class,
    再用querySelector
    */
    let tblObj = el.getElementsByClassName("el-table__body");
    //如果不用数组,最后遍历的时候不能有【】这个来选取元素
    let headerRows = [];
    for (const item of tblObj) {
      for (const itemElement of item.rows) {
        headerRows[itemElement] = itemElement.cells[0]
      }
    }
    // 去头部的位置
    let headerTds = el.getElementsByClassName("el-table__body")[0]
      .rows[0];
    let screenYStart = 0;
    let tdHeight = 0;

    for (let i = 0; i < headerRows.length; i++) {
      //添加头部单元格事件
      addListener(headerRows[i], "mousedown", onmousedown);
      addListener(headerRows[i], "mousemove", onmousemove);
    }
    //鼠标点击触发事件
    document.onmousedown = function(event) {
      //如果不是tanle就不给他托
      if(!event.target._prevClass || (event.target._prevClass && event.target._prevClass.indexOf('table') === -1)){
        return
      }
      //获取当前行数下标
      let tr = event.target.parentElement
      let td = event.target.parentElement.parentElement.children
      let index = 0
      for (const item of td) {
        item.setAttribute('id',index++)
      }
      newindex = tr.getAttribute('id')
      if (resizeable) {
        let evt = event || window.event;
        mousedown = true;
        screenYStart = evt.screenY;
        tdHeight = targetTd.offsetHeight
      }
    };
    //鼠标拖拽触发事件
    document.onmousemove = function(event) {
      //如果不是table就不给他托
      if(!event.target._prevClass || (event.target._prevClass && event.target._prevClass.indexOf('table') === -1)){
        return
      }
      let evt = event || window.event;
      let srcObj = getTarget(evt);
      //rowIndex是未定义!!!cellIndex是好用的。我应该获取的是tr的rowindex
      //获取偏移 这里是鼠标的偏移
      let offsetY = evt.offsetY;
      if (mousedown) {
        let newHeight = tdHeight + (evt.screenY - screenYStart) + "px"; //计算后的新的宽度,原始td+偏移
        for (const item of tblObj) {
          let trlist = item.getElementsByTagName('tbody')[0].children
          let trIndex = parseInt(newindex)
          trlist[trIndex < 0 ? 0 : trIndex].style.height = newHeight
        }
      } else {
        //修改光标样式,ele原来头部的不能影响,于是有一些offset位置的判断,如有更好的方式请留言
        srcObj.style.cursor = '';
        if (
          srcObj.offsetHeight - evt.offsetY <= 4 &&
          srcObj.offsetWidth - evt.offsetX > 4
        ) {
          srcObj.style.cursor = '';
          targetTd = srcObj
          resizeable = true;
          srcObj.style.cursor = "row-resize"; //修改光标样式
        } else if (evt.offsetY <= 4 && evt.offsetX > 4) {
          srcObj.style.cursor = '';
          if (srcObj.parentNode.rowIndex) {
            resizeable = true;
            // srcObj.style.cursor = "row-resize";
          }
        } else if (
          srcObj.offsetHeight - evt.offsetY > 4 &&
          srcObj.offsetWidth - evt.offsetX <= 4
        ) {
          srcObj.style.cursor = '';
          srcObj.style.cursor = "column-resize"; //修改光标样式
        }
        else if (evt.offsetY > 4 && evt.offsetX <= 4) {
          srcObj.style.cursor = '';
          if (srcObj.parentNode.rowIndex) {
            // srcObj.style.cursor = "column-resize";
          }
        } else {
          srcObj.style.cursor = '';
          resizeable = false;
          srcObj.style.cursor = "default";
        }
      }
    };
    //放开鼠标恢复原位
    document.onmouseup = function(event) {
      resizeable = false;
      mousedown = false;
      document.body.style.cursor = "default";
    };
    // 得到目标值事件
    function getTarget(evt) {
      return evt.target || evt.srcElement;
    }
    // 添加监听
    function addListener(element, type, listener, useCapture) {
      //这是两种写法,对应不同浏览器
      element.addEventListener
        ? element.addEventListener(type, listener, useCapture)
        : element.attachEvent("on" + type, listener);
    }
  },
});


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
el-tableElement UI框架中的一个表格组件,可以用来展示数据。如果需要实现拖拽排序,可以使用el-table内置的sortable属性和drag-sorting事件。 sortable属性可以让表格的行拥有拖拽排序的能力,使用方法如下: ```html <el-table :data="tableData" :sortable="true"> <!-- 表格列 --> </el-table> ``` drag-sorting事件可以监听行拖拽时的变化,使用方法如下: ```html <el-table :data="tableData" :sortable="true" @drag-sorting="handleDragSort"> <!-- 表格列 --> </el-table> ``` 在事件处理函数中,可以通过参数获取拖拽前和拖拽后的行的数据,然后进行排序操作: ```javascript methods: { handleDragSort(from, to) { const movedData = this.tableData.splice(from, 1)[0]; this.tableData.splice(to, 0, movedData); } } ``` 以上代码中,我们首先通过splice方法将拖拽前的行数据移除,然后再通过splice方法将该行数据插入到拖拽后的位置。 完整的代码示例: ```html <template> <el-table :data="tableData" :sortable="true" @drag-sorting="handleDragSort"> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> <el-table-column prop="gender" label="Gender"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: 'John', age: 20, gender: 'Male' }, { name: 'Mary', age: 25, gender: 'Female' }, { name: 'Tom', age: 18, gender: 'Male' }, ] } }, methods: { handleDragSort(from, to) { const movedData = this.tableData.splice(from, 1)[0]; this.tableData.splice(to, 0, movedData); } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有思想的前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值