对vue项目el-table表格进行鼠标左右拖动行为功能

1,我是在utils里定义了一个tableMove.js文件,里面代码如下

import Vue from 'vue';
  Vue.directive('tabelMove', {
    // 指令的定义
    bind: function(el, binding, vnode) {
      var odiv = el // 获取当前表格元素

      el.querySelector('.el-table .el-table__body-wrapper').style.cursor = 'pointer'

      var mouseDownAndUpTimer = null
      var mouseOffset = 0
      var mouseFlag = false
      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:当前的vm实例 -- 渲染表格
          vnode.context.$refs.orderTable && vnode.context.$refs.orderTable.doLayout()
        }, 200)
        if (mouseFlag) {
          mouseFlag = false
        } else {
          clearTimeout(mouseDownAndUpTimer) // 清除延迟时间
        }
      }
      odiv.onmouseleave = (e) => {
        setTimeout(() => {
          // vnode.context:当前的vm实例 --  渲染表格
          vnode.context.$refs.orderTable && vnode.context.$refs.orderTable.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.onclick = (e) => {
      }
      // 是否选中文字
      odiv.onselectstart = () => {
        return false
      }
      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
      }
    }
  })



/*1.指令定义: Vue.directive('tabelMove', { ... }) 定义了一个名为tabelMove的Vue自定义指令。

2.指令绑定: 当这个指令被绑定到一个DOM元素上时,bind函数会被调用。bind函数接收三个参数:el(被绑定的元素),binding(绑定对象),vnode(虚拟节点)。

3.变量初始化:

odiv = el:将传入的el(被绑定的元素)赋值给odiv。
设置.el-table .el-table__body-wrapper的cursor样式为pointer,使得鼠标悬停时显示为手形图标。
4.鼠标事件处理:

onmousedown:当鼠标按下时,获取鼠标的当前位置clientX,并设置一个定时器,在80毫秒后设置mouseFlag为true。这主要用于判断鼠标是否确实开始移动,以避免误触。
onmouseup:当鼠标松开时,如果mouseFlag为true,则将其设置为false;否则,清除之前设置的定时器。此外,无论mouseFlag的值如何,都会调用vnode.context.$refs.orderTable.doLayout(),这似乎是重新布局或刷新表格的操作。
onmouseleave:当鼠标离开元素时,执行与onmouseup相似的操作,同时确保mouseFlag为false。
onmousemove:当鼠标移动时,如果mouseFlag为true,则根据鼠标的当前位置和上一次的位置差来滚动表格的内容区域。
5.其他事件处理:

ondragstart 和 ondragend:阻止元素的默认拖动行为。
onclick:目前为空,但预留了点击事件的处理。
onselectstart:阻止文本选择。*/

2,然后在main.js里全局引入tabelMove文件

import Vue from 'vue'
import App from './App'
import './utils/tabelMove.js'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

3,在页面里进行使用

 <el-table  v-tabelMove>  
    <el-table-column type="selection" width="55" align="center"/>
    <el-table-column fixed type="index" label="序号" width="55">
    </el-table-column>
 </el-table>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 中使用 `el-table` 实现列表间的拖拽功能,可以借助 `sortablejs` 插件。`sortablejs` 是一个基于原生 JavaScript 的拖拽排序库,其支持 Vue 等框架。 下面是实现步骤: 1. 安装 `sortablejs` 插件 ```bash npm install sortablejs --save ``` 2. 在 Vue 组件中引入 `sortablejs` ```javascript import Sortable from 'sortablejs'; ``` 3. 在 `mounted` 钩子中初始化 `sortablejs` ```javascript mounted() { const table = document.getElementById('table'); const options = { animation: 150, onEnd: this.onEndHandler }; Sortable.create(table, options); }, ``` 其中,`table` 是 `el-table` 对应的 DOM 元素,`options` 是 `Sortable` 的一些配置项。`onEndHandler` 是当拖拽结束时的回调函数,需要自己实现。 4. 实现 `onEndHandler` 回调函数 ```javascript methods: { onEndHandler(event) { const { oldIndex, newIndex } = event; const newData = [...this.tableData]; const [removed] = newData.splice(oldIndex, 1); newData.splice(newIndex, 0, removed); this.tableData = newData; }, }, ``` 其中,`tableData` 是 `el-table` 的数据源,当拖拽结束后,根据 `oldIndex` 和 `newIndex` 获取被拖拽的元素和目标位置,然后在数据源中重新排序。 5. 在 `el-table` 中添加 `:row-key` 属性 ```html <el-table :data="tableData" :row-key="row => row.id" id="table"> ... </el-table> ``` 这里需要为 `el-table` 指定一个唯一的 `row-key`,以便在拖拽结束后能够正确地更新数据源。 完成以上步骤后,即可在 `el-table` 中实现列表间的拖拽功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值