el-table实现表格内部横向拖拽效果

2024.4.2今天我学习了如何对el-table表格组件实现内部横向拖拽的效果,效果:

代码如下:

一、创建utils/底下文件

javascript 复制代码
const crosswise_drag_table = function (Vue){
  // 全局添加table左右拖动效果的指令
  Vue.directive('tableMove', {
    bind: function (el, binding, vnode) {
      let odiv = el // 获取当前表格元素
      // 修改样式小手标志
      // el.style.cursor = 'pointer'
      el.querySelector('.el-table .el-table__body-wrapper').style.cursor = 'pointer'
      let mouseDownAndUpTimer = null
      let mouseOffset = 0
      let mouseFlag = false
      let bindRef = binding.value[0] //绑定的表格的ref属性
      odiv.onmousedown = (e) => {
        const ePath = composedPath(e)
        // 拖拽表头不滑动
        if (ePath.some(res => {
          return res && res.className && res.className.indexOf('el-table__header') > -1
        })) return
        if (e.which !== 1) return
        mouseOffset = e.clientX
        mouseDownAndUpTimer = setTimeout(function () {
          mouseFlag = true
        }, 80)
      }
      odiv.onmouseup = (e) => {
        setTimeout(() => {
          // 解决拖动列宽行不对齐问题--渲染表格
          vnode.context.$refs[bindRef].doLayout()
        }, 200)
        if (mouseFlag) {
          mouseFlag = false
        } else {
          clearTimeout(mouseDownAndUpTimer) // 清除延迟时间
        }
      }

      odiv.onmouseleave = (e) => {
        setTimeout(() => {
          // 解决拖动列宽行不对齐问题--渲染表格
          vnode.context.$refs[bindRef].doLayout()
        }, 200)
        mouseFlag = false
      }

      odiv.onmousemove = (e) => {
        if (e.which !== 1) return

        const divData = odiv.querySelector('.el-table .el-table__body-wrapper')
        if (mouseFlag && divData) {
          // 设置水平方向的元素的位置
          divData.scrollLeft -= (-mouseOffset + (mouseOffset = e.clientX))
        }
      }

      // 解决有些时候,在鼠标松开的时候,元素仍然可以拖动;
      odiv.ondragstart = (e) => {
        e.preventDefault()
      }

      odiv.ondragend = (e) => {
        e.preventDefault()
      }

      // 是否拖拽可选中文字
      odiv.onselectstart = () => {
        return false
      }

      //浏览器Event.path属性不存在
      function composedPath(e) {
        // 存在则直接return
        if (e.path) {
          return e.path
        }
        // 不存在则遍历target节点
        let target = e.target
        e.path = []
        while (target.parentNode !== null) {
          e.path.push(target)
          target = target.parentNode
        }
        // 最后补上document和window
        e.path.push(document, window)
        return e.path
      }
    }
  })
}


export default crosswise_drag_table

二、在main.js中引入

javascript 复制代码
// 横向拖拽表格
import  crosswise_drag_table   from '@/utils/crosswiseDragTable'

Vue.use(crosswise_drag_table   )

三、在vue文件中使用

javascript 复制代码
<el-table 
  ref='table_drag'
  v-table-move="['table_drag']"
>

</el-table>
相关推荐
kyriewen3 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
free354 小时前
从 0 实现一个 Tiny JavaScript VM:项目架构拆解
javascript
暴走的小呆4 小时前
Vue 2 中 Object 的变化侦测:从 getter/setter 到 Dep、Watcher、Observer
vue.js
英勇无比的消炎药4 小时前
TinyVue v-auto-tip: 文本超长自动提示的优雅方案
vue.js
徐小夕6 小时前
我们开源了一款“框架无关”的思维导图编辑器,3分钟集成到任意系统
前端·javascript·github
PBitW6 小时前
GPT训练我的第三天,明白了应该咋说满分回答!😕😕😕
前端·javascript·面试
像我这样帅的人丶你还6 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端
labixiong7 小时前
还原一个完整符合规范的 Promise(二)
前端·javascript
时光足迹7 小时前
腾讯云 TRTC UniApp SDK 从入门到上线
前端·vue.js·uni-app
时光足迹7 小时前
uni-app 里把加密视频嵌入页面播放?我分析了 4 种方案,只有 1 种接近完美
前端·vue.js·uni-app