当前位置:   article > 正文

用dragstart、drag、dragend、dragover、drop、dragleave实现针对表格列的顺序进行拖拽排序(附带实现选择某几列数据显示或隐藏)

用dragstart、drag、dragend、dragover、drop、dragleave实现针对表格列的顺序进行拖拽排序(附带实现选择某几列数据显示或隐藏)

 

特性

  1. 可以显示隐藏某一列
  2. 可以圈选显示隐藏所有列(禁用列不受状态影响) 
  3. 可以拖拽列名进行前后排序
  1. <template>
  2. <div :class="$options.name">
  3. <el-dropdown :show-timeout="0" :placement="`bottom`">
  4. <el-link :underline="false" style="cursor: default"
  5. >表格列设置
  6. <el-tooltip
  7. :enterable="false"
  8. effect="dark"
  9. :content="`可以上下拖拽改变列顺序`"
  10. placement="top"
  11. :transition="`none`"
  12. >
  13. <i class="el-icon-question"></i>
  14. </el-tooltip>
  15. <i class="el-icon-arrow-down"></i>
  16. </el-link>
  17. <el-dropdown-menu slot="dropdown" style="transition: none"
  18. ><el-dropdown-item>
  19. <el-checkbox
  20. :indeterminate="checkedHalf"
  21. :disabled="!tableColumns.some((v) => !v.disabled)"
  22. v-model="checkedAll"
  23. @change="changeCheckedAll"
  24. @click.native.stop
  25. >全选</el-checkbox
  26. ></el-dropdown-item
  27. >
  28. <el-dropdown-item
  29. v-for="(item, index) in tableColumns"
  30. :key="index"
  31. :divided="item.divided"
  32. style="padding: 0"
  33. >
  34. <div
  35. :draggable="!item.disabled"
  36. style="
  37. padding: 0 20px;
  38. box-sizing: border-box;
  39. border: 2px dashed transparent;
  40. "
  41. @dragstart="dragstart($event, index)"
  42. @drag="drag"
  43. @dragend="dragend"
  44. @dragover="dragover"
  45. @drop="drop($event, index)"
  46. @dragleave="dragleave"
  47. >
  48. <el-checkbox
  49. :disabled="item.disabled"
  50. v-model="item.checked"
  51. @click.native.stop
  52. >{{ item.label }}</el-checkbox
  53. >
  54. </div></el-dropdown-item
  55. >
  56. </el-dropdown-menu>
  57. </el-dropdown>
  58. <el-table :data="tableData">
  59. <el-table-column type="selection" width="50" />
  60. <el-table-column type="index" label="序号" width="60" />
  61. <!-- 主要列 BEGIN---------------------------------------- -->
  62. <el-table-column
  63. v-for="(a, i) in tableColumns"
  64. v-if="a.checked"
  65. :key="i"
  66. :prop="a.prop"
  67. :label="a.label"
  68. :width="a.width || `auto`"
  69. />
  70. <!-- 主要列 END---------------------------------------- -->
  71. <el-table-column label="操作" width="150">
  72. <template slot-scope="scope">
  73. <el-button size="mini" type="primary">修改</el-button>
  74. <el-button size="mini" type="danger">删除</el-button>
  75. </template>
  76. </el-table-column>
  77. </el-table>
  78. </div>
  79. </template>
  80. <script>
  81. export default {
  82. data() {
  83. return {
  84. // 表格列字段----------------------------------------
  85. checkedHalf: false,
  86. checkedAll: false,
  87. tableColumns: [
  88. { prop: "ZD1", label: "字段名称1", width: 110 },
  89. { prop: "ZD2", label: "字段名称2", width: 200, checked: true, disabled: true },
  90. { prop: "ZD3", label: "字段名称3", width: 110 },
  91. { prop: "ZD4", label: "字段名称4", width: 110 },
  92. { prop: "ZD5", label: "字段名称5", width: 110 },
  93. ],
  94. // ----------------------------------------
  95. tableData: [
  96. {
  97. ZD1: "字段1的值-1",
  98. ZD2: "字段2的值-1",
  99. ZD3: "字段3的值-1",
  100. ZD4: "字段4的值-1",
  101. ZD5: "字段5的值-1",
  102. },
  103. {
  104. ZD1: "字段1的值-2",
  105. ZD2: "字段2的值-2",
  106. ZD3: "字段3的值-2",
  107. ZD4: "字段4的值-2",
  108. ZD5: "字段5的值-2",
  109. },
  110. {
  111. ZD1: "字段1的值-3",
  112. ZD2: "字段2的值-3",
  113. ZD3: "字段3的值-3",
  114. ZD4: "字段4的值-3",
  115. ZD5: "字段5的值-3",
  116. },
  117. {
  118. ZD1: "字段1的值-4",
  119. ZD2: "字段2的值-4",
  120. ZD3: "字段3的值-4",
  121. ZD4: "字段4的值-4",
  122. ZD5: "字段5的值-4",
  123. },
  124. {
  125. ZD1: "字段1的值-5",
  126. ZD2: "字段2的值-5",
  127. ZD3: "字段3的值-5",
  128. ZD4: "字段4的值-5",
  129. ZD5: "字段5的值-5",
  130. },
  131. ], //表格数据
  132. };
  133. },
  134. watch: {
  135. tableColumns: {
  136. handler(newValue, oldValue) {
  137. if (newValue && Object.keys(newValue).length) {
  138. this.checkedHalf =
  139. newValue.some((v) => v.checked) && newValue.some((v) => !v.checked); //部分选中
  140. newValue.every((v) => v.checked) &&
  141. ((this.checkedAll = true), (this.checkedHalf = false)); //全选中
  142. this.checkedHalf && (this.checkedAll = false); //未全选中
  143. }
  144. },
  145. deep: true, //深度监听
  146. immediate: true, //立即执行
  147. },
  148. },
  149. methods: {
  150. changeCheckedAll(checked) {
  151. let allowItems = this.tableColumns.filter((v) => !v.disabled); //未被禁用的选项
  152. this.checkedAll = allowItems.some((v) => !v.checked); //在未被禁用的选项中,只要有一个未勾选,点击“全选”就是全选,否者就是全不选
  153. allowItems.forEach((v) => this.$set(v, "checked", this.checkedAll));
  154. },
  155. // 被拖拽物体的监听事件----------------------------------------
  156. dragstart(e, index) {
  157. e.dataTransfer.setData("fromIndex", index); //传递拖拽起始位置索引
  158. },
  159. drag(e) {
  160. e.currentTarget.style.opacity = 0.618; //被拖拽元素透明
  161. },
  162. dragend(e) {
  163. e.currentTarget.style.opacity = 1; //被拖拽元素恢复透明
  164. },
  165. // 放置区域的监听事件----------------------------------------
  166. dragover(e) {
  167. let et = e.currentTarget;
  168. let lessThanHalf = e.offsetY < et.offsetHeight / 2; //向下拖动鼠标未超过被放置区域一半高度
  169. et.style.borderTopColor = lessThanHalf ? `#409EFF` : `transparent`; //上边线显示
  170. et.style.borderBottomColor = !lessThanHalf ? `#409EFF` : `transparent`; //下边线显示
  171. e.preventDefault();
  172. },
  173. drop(e, index) {
  174. let et = e.currentTarget;
  175. et.style.borderColor = `transparent`;
  176. let lessThanHalf = e.offsetY < et.offsetHeight / 2; //向下拖动鼠标未超过被放置区域一半高度
  177. let fromIndex = e.dataTransfer.getData("fromIndex"); //拖拽起始位置索引
  178. let toIndex = index; //拖拽到的目标位置索引
  179. if (fromIndex == toIndex) return; //一样的位置就不改变顺序了
  180. toIndex =
  181. fromIndex < toIndex
  182. ? lessThanHalf
  183. ? index - 1
  184. : index
  185. : lessThanHalf
  186. ? index
  187. : index + 1; //拖拽到不同的目标位置索引(注意细节:从下往上拖拽 和 从上往下 拖拽索引的大小不一样)
  188. this.$g.array.moveArrayElement(this.tableColumns, fromIndex, toIndex); //移动目标元素
  189. },
  190. dragleave(e) {
  191. e.currentTarget.style.borderColor = `transparent`; //清空边框线
  192. },
  193. },
  194. };
  195. </script>

应用到了将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)-CSDN博客文章浏览阅读84次,点赞2次,收藏3次。【代码】将数组指定索引位置的元素 移动到 目标索引位置(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)https://blog.csdn.net/qq_37860634/article/details/136788107

 用第三方插件实现表格的行拖拽排序基于sortablejs实现拖拽element-ui el-table表格行进行排序-CSDN博客【代码】基于sortablejs实现拖拽element-ui el-table表格行进行排序。https://blog.csdn.net/qq_37860634/article/details/136791080

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

闽ICP备14008679号