当前位置:   article > 正文

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

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

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

代码如下:

一、创建utils/底下文件

  1. const crosswise_drag_table = function (Vue){
  2. // 全局添加table左右拖动效果的指令
  3. Vue.directive('tableMove', {
  4. bind: function (el, binding, vnode) {
  5. let odiv = el // 获取当前表格元素
  6. // 修改样式小手标志
  7. // el.style.cursor = 'pointer'
  8. el.querySelector('.el-table .el-table__body-wrapper').style.cursor = 'pointer'
  9. let mouseDownAndUpTimer = null
  10. let mouseOffset = 0
  11. let mouseFlag = false
  12. let bindRef = binding.value[0] //绑定的表格的ref属性
  13. odiv.onmousedown = (e) => {
  14. const ePath = composedPath(e)
  15. // 拖拽表头不滑动
  16. if (ePath.some(res => {
  17. return res && res.className && res.className.indexOf('el-table__header') > -1
  18. })) return
  19. if (e.which !== 1) return
  20. mouseOffset = e.clientX
  21. mouseDownAndUpTimer = setTimeout(function () {
  22. mouseFlag = true
  23. }, 80)
  24. }
  25. odiv.onmouseup = (e) => {
  26. setTimeout(() => {
  27. // 解决拖动列宽行不对齐问题--渲染表格
  28. vnode.context.$refs[bindRef].doLayout()
  29. }, 200)
  30. if (mouseFlag) {
  31. mouseFlag = false
  32. } else {
  33. clearTimeout(mouseDownAndUpTimer) // 清除延迟时间
  34. }
  35. }
  36. odiv.onmouseleave = (e) => {
  37. setTimeout(() => {
  38. // 解决拖动列宽行不对齐问题--渲染表格
  39. vnode.context.$refs[bindRef].doLayout()
  40. }, 200)
  41. mouseFlag = false
  42. }
  43. odiv.onmousemove = (e) => {
  44. if (e.which !== 1) return
  45. const divData = odiv.querySelector('.el-table .el-table__body-wrapper')
  46. if (mouseFlag && divData) {
  47. // 设置水平方向的元素的位置
  48. divData.scrollLeft -= (-mouseOffset + (mouseOffset = e.clientX))
  49. }
  50. }
  51. // 解决有些时候,在鼠标松开的时候,元素仍然可以拖动;
  52. odiv.ondragstart = (e) => {
  53. e.preventDefault()
  54. }
  55. odiv.ondragend = (e) => {
  56. e.preventDefault()
  57. }
  58. // 是否拖拽可选中文字
  59. odiv.onselectstart = () => {
  60. return false
  61. }
  62. //浏览器Event.path属性不存在
  63. function composedPath(e) {
  64. // 存在则直接return
  65. if (e.path) {
  66. return e.path
  67. }
  68. // 不存在则遍历target节点
  69. let target = e.target
  70. e.path = []
  71. while (target.parentNode !== null) {
  72. e.path.push(target)
  73. target = target.parentNode
  74. }
  75. // 最后补上document和window
  76. e.path.push(document, window)
  77. return e.path
  78. }
  79. }
  80. })
  81. }
  82. export default crosswise_drag_table

二、在main.js中引入

  1. // 横向拖拽表格
  2. import crosswise_drag_table from '@/utils/crosswiseDragTable'
  3. Vue.use(crosswise_drag_table )

三、在vue文件中使用

  1. <el-table
  2. ref='table_drag'
  3. v-table-move="['table_drag']"
  4. >
  5. </el-table>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/355531
推荐阅读
相关标签
  

闽ICP备14008679号