当前位置:   article > 正文

el-table拖拽功能实现(3种详细解释)

el-table拖拽

1.el-table自带的列宽拖拽

如图:下方为el-table的属性之一,在下面代码所示的位置加上boder即可,把鼠标放在每个列之间,会出现拖拽的鼠标样式,可以调整列的宽度(但是仅限调整列宽

border是否带有纵向边框booleanfalse
  1. <!-- 表格 -->
  2. <el-table
  3. height="100%"
  4. width="100%"
  5. border
  6. resizable
  7. v-loading="loading"
  8. :data="tableData"
  9. @selection-change="tableSelect"
  10. >

2.实现左右table宽度拖拽

在使用组件的时候,尽量不要修改他,而是通过控制外面的盒子进行控制

2.1 html主要分为3部分(如图):

2.2 css样式:(样式自行设置)

  1. ul,li{
  2. list-style: none;
  3. display: block;
  4. margin:0;
  5. padding:0;
  6. }
  7. .lrbox{
  8. width:100%;
  9. height: 48%;
  10. margin: 1% 0px;
  11. overflow:hidden;
  12. display: flex;
  13. }
  14. .left{
  15. width:calc(50% - 20px);
  16. //注意 calc() 来动态设置宽高,在表达式中运算符的前后必须要有空格
  17. height:100%;
  18. }
  19. .resize {
  20. cursor: col-resize;
  21. background-color: #d6d6d6;
  22. border-radius: 5px;
  23. margin-top: -10px;
  24. width: 10px;
  25. background-size: cover;
  26. background-position: center;
  27. /*z-index: 99999;*/
  28. font-size: 32px;
  29. color: white;
  30. }
  31. .resize:hover {
  32. color: #4444
  33. }
  34. .mid{
  35. width:50%;
  36. height:100%;
  37. }

2.3 下面是js代码:

多个地方使用可以进行封装混入,提高复用率,减少代码冗余

  1. dragControlWidth(divWidth,resizeWidth) { //(最小宽度int,拖动条宽度int)
  2. //获取
  3. var resize = document.getElementsByClassName('resize');
  4. var left = document.getElementsByClassName('left');
  5. var right = document.getElementsByClassName('mid');
  6. var box = document.getElementsByClassName('lrbox');
  7. //对其进行循环,可用于多个左右控制
  8. for (let i = 0; i < resize.length; i++) {
  9. //鼠标按下事件
  10. resize[i].onmousedown = function (e) {
  11. var startX = e.clientX; //指针相对于浏览器页面(或客户区)的水平坐标
  12. resize[i].left = resize[i].offsetLeft; //返回当前元素相对于 offsetParent 节点左边界的偏移像素值
  13. //鼠标移动事件
  14. document.onmousemove = function (e) {
  15. var endX = e.clientX;
  16. var moveLen = resize[i].left + (endX - startX);
  17. var maxT = box[i].clientWidth - resize[i].offsetWidth;
  18. //设置极值范围
  19. if (moveLen < divWidth) {
  20. moveLen = divWidth;
  21. }
  22. if (moveLen > maxT - divWidth){
  23. moveLen = maxT - divWidth;
  24. }
  25. resize[i].style.left = moveLen;
  26. //用for循环是因为相较消耗小
  27. for (let j = 0; j < left.length; j++) {
  28. left[j].style.width = moveLen + 'px';
  29. right[j].style.width = (box[i].clientWidth - moveLen - resizeWidth) + 'px';
  30. }
  31. }
  32. //鼠标抬起事件
  33. document.onmouseup = function (e) {
  34. //结束处理(清除事件)
  35. document.onmousemove = null;
  36. document.onmouseup = null;
  37. resize[i].releaseCapture && resize[i].releaseCapture();
  38. }
  39. resize[i].setCapture && resize[i].setCapture();
  40. return false;
  41. }
  42. }
  43. },

 上方提到了releaseCapturesetCapture ,下面进行简单的解释下呐,嘿嘿

2.4 releaseCapture和setCapture 介绍:

setCapture:

将鼠标事件锁定指定的元素上,当元素捕获了鼠标事件后,该事件只能作用在当前元素上。(上面代码的事件是作用中间的拖动条,拖动条的样式可以自己通过css进行美化,搞出符合自己的想法或者符合需求即可)

使用:

currElement.setCapture(boolean),用于设置是否捕获其子元素鼠标事件

注意:

1.setCapture不可作用于键盘等其它事件,只作用于鼠标事件;

2.setCapture该法是IE浏览器专有;

3.并且只能捕作用在这几个事件上

onmousedown、onmouseup、onmousemove、onclick、ondblclick、onmouseover和onmouseout

releaseCapture:

可以为指定的元素解除事件锁定,与上面的相反,一个锁定一个解锁。

(需要注意使用的是两者必须成对呈现,因为鼠标消息都发给上面锁定的这个窗口,直到调用ReleaseCapture或者调用SetCapture设置另一个窗口为止

另外,还有一个GetCapture,他是专门用来获取是哪个窗口捕获了鼠标事件

2.5 使用了releaseCapturesetCapture两次

还有重要的一点就是代码的后面使用了releaseCapturesetCapture两次

  • 这行代码的目的是检查 resize[i] 元素是否支持 releaseCapture 方法,避免在不支持该方法的浏览器中引发错误
  • 如果 resize[i] 元素支持 releaseCapture 方法,则调用一次 releaseCapture() 来释放鼠标捕获。
  • 使用两次的目的是处理特定情况下的浏览器兼容性问题。在某些浏览器中,需要多次调用 releaseCapture 才能完全释放鼠标捕获。通过使用两次调用,可以确保在各种浏览器环境下都能正确地释放鼠标捕获。

3.利用第3方插件自由拖拽

 Sortable 是一个用于可重新排序的拖放列表JavaScript 库

特征

  • 支持触摸设备和现代浏览器(包括IE9)
  • 可以从一个列表拖动到另一个列表或在同一列表中
  • 移动项目时的 CSS 动画
  • 支持拖动手柄和可选文本(比 voidberg 的 html5sortable 更好)
  • 智能自动滚动
  • 高级掉期检测
  • 流畅的动画
  • 多拖拽支持
  • 支持 CSS 转换
  • 使用原生 HTML5 拖放 API 构建

3.1效果图如下:

3.2使用 NPM 下包及引入:

也可以用pnpm,yarn下载依赖,下载慢可切换源

  1. npm install sortablejs --save
  2. 导入到您的项目中:
  3. import Sortable from 'sortablejs';
  4. 创建新实例
  5. Sortable.createHTMLElementObjectSortable  

3.3CDN:

  1. <!-- jsDelivr :: Sortable :: Latest (https://www.jsdelivr.com/package/npm/sortablejs) -->
  2. <script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>

 3.4代码举例:

3.4.1 使用el-table组件
  1. <template>
  2. <div class="tablebox">
  3. <el-table :data="tableData" row-key="id" border highlight-current-row="">
  4. <el-table-column prop="name" label="你的大名"></el-table-column>
  5. <el-table-column prop="address" label="地理位置"></el-table-column>
  6. <el-table-column prop="date" label="那年时候"></el-table-column>
  7. </el-table>
  8. </div>
  9. </template>
3.4.2 自定义的数据:

为了演示造的数据,正常应该是调用接口获取数据的

  1. <script>
  2. import Sortable from 'sortablejs';
  3. export default {
  4. data() {
  5. return {
  6. tableData: [
  7. {
  8. id: '1',
  9. date: '2023-12-01',
  10. name: 'Juny Long',
  11. address: '地球村 亚洲 中国 湖南'
  12. },
  13. {
  14. id: '2',
  15. date: '2020-12-02',
  16. name: '琳琳1号',
  17. address: '地球村 亚洲 中国 贵州'
  18. },
  19. {
  20. id: '3',
  21. date: '2023-12-03',
  22. name: '零零七',
  23. address: '地球村 亚洲 中国 广东'
  24. },
  25. {
  26. id: '4',
  27. date: '2023-12-04',
  28. name: '龍',
  29. address: '地球村 亚洲 中国 香港'
  30. }
  31. ],
  32. col: [
  33. {
  34. label: '那年时候',
  35. prop: 'date'
  36. },
  37. {
  38. label: '你的大名',
  39. prop: 'name'
  40. },
  41. {
  42. label: '地理位置',
  43. prop: 'address'
  44. }
  45. ],
  46. dropCol: [
  47. {
  48. label: '那年时候',
  49. prop: 'date'
  50. },
  51. {
  52. label: '你的大名',
  53. prop: 'name'
  54. },
  55. {
  56. label: '地理位置',
  57. prop: 'address'
  58. }
  59. ]
  60. }
  61. },

3.5 执行的方法(从而完成拖拽):

具体解释看代码就行(别跟我说看不懂)

  1. mounted() {
  2. //dom加载完成触发
  3. this.rowDrop(); // 行
  4. this.columnDrop(); // 列
  5. },
  6. methods: {
  7. // 行的拖拽
  8. rowDrop() {
  9. // 获取需要拖拽的DOM对象
  10. const tbody = document.querySelector('.el-table__body-wrapper tbody');
  11. //解决指向问题
  12. const that = this;
  13. //创建新实例
  14. Sortable.create(tbody, {
  15. // 结束拖拽
  16. onEnd({ newIndex, oldIndex }) {
  17. // 删除当前行,放到拖拽后的位置
  18. const currentRow = that.tableData.splice(oldIndex, 1)[0];
  19. that.tableData.splice(newIndex, 0, currentRow);
  20. }
  21. })
  22. },
  23. // 列的拖拽
  24. columnDrop() {
  25. // 获取需要拖拽的DOM对象
  26. const wrapperTr = document.querySelector('.el-table__body-wrapper tr');
  27. const that = this;
  28. Sortable.create(wrapperTr, {
  29. //动画
  30. animation: 180,
  31. //延迟
  32. delay: 0,
  33. // 结束拖拽
  34. onEnd: e => {
  35. console.log(e,'e');
  36. // 输出新旧的坐标(就是xy行和列的位置,不明白可以看一下输出的哦)
  37. console.log(e.oldIndex,e.oldDraggableIndex);
  38. console.log(e.newIndex,e.newDraggableIndex)
  39. const oldItem = that.dropCol[e.oldIndex];
  40. that.dropCol.splice(e.oldIndex, 1);
  41. that.dropCol.splice(e.newIndex, 0, oldItem);
  42. }
  43. })
  44. }
  45. }
  46. }
  47. </script>
  48. <style scoped lang="scss">
  49. .tablebox{
  50. padding: 40px;
  51. border-radius:10px ;
  52. background-color: #f1f1ee;
  53. }
  54. </style>

3.6 具体官方文档请点击下方进行跳转:

https://www.npmjs.com/package/sortablejs#cdnicon-default.png?t=N7T8https://www.npmjs.com/package/sortablejs#cdn

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

闽ICP备14008679号