TableHeaderSort.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <template>
  2. <div id="app" style="width:600px">
  3. <ul>
  4. <li v-for="(item,index) in headDto.tableHeaderSortLineDtos" :key="index" class="item" draggable="true" @dragstart="handleDragStart($event, item)" @dragover.prevent="handleDragOver($event, item)" @dragenter="handleDragEnter($event, item)" @dragend="handleDragEnd($event, item)">
  5. <tr>
  6. <td><input autocomplete="off" type="checkbox" class="select-checkbox" v-model="item.visible" @click="isVisible"></td>
  7. <td>
  8. <div>{{item.tableHeaderName}}</div>
  9. </td>
  10. </tr>
  11. </li>
  12. </ul>
  13. </div>
  14. </template>
  15. <script>
  16. import TableHeaderSortResource from "../../api/commom/TableHeaderSortResource.js";
  17. export default {
  18. props: ["dataDto"],
  19. data: function () {
  20. return {
  21. isSelect: true,
  22. dragging: null,
  23. headDto: {
  24. tableName: "",
  25. tableHeaderSortLineDtos: [],
  26. },
  27. };
  28. },
  29. methods: {
  30. isVisible: function () {
  31. var _self = this;
  32. console.log(_self.headDto);
  33. window.setTimeout(function () {
  34. _self.saveOrUpdateheader();
  35. }, 1000);
  36. },
  37. loadHeader: function () {
  38. var _self = this;
  39. var dto;
  40. TableHeaderSortResource.LoadTableHeaderInfo(_self.dataDto.tableName).then(
  41. (successData) => {
  42. if (successData.id == null) {
  43. _self.headDto = {
  44. tableName: _self.dataDto.tableName,
  45. tableHeaderSortLineDtos: _self.dataDto.tableHeaderSortLineDtos,
  46. };
  47. } else {
  48. _self.headDto = {
  49. tableName: _self.dataDto.tableName,
  50. tableHeaderSortLineDtos: successData.tableHeaderSortLineDtos,
  51. };
  52. }
  53. this.$emit("headChange", _self.headDto);
  54. },
  55. (errorData) => {
  56. console.log("失败");
  57. }
  58. );
  59. },
  60. saveOrUpdateheader: function () {
  61. var _self = this;
  62. TableHeaderSortResource.createOrUpdateSort(_self.headDto).then(
  63. (successData) => {
  64. console.log("保存成功");
  65. },
  66. (errorData) => {
  67. console.log("保存失败");
  68. }
  69. );
  70. },
  71. handleDragStart(e, item) {
  72. this.dragging = item;
  73. },
  74. handleDragEnd(e, item) {
  75. this.dragging = null;
  76. },
  77. //首先把div变成可以放置的元素,即重写dragenter/dragover
  78. // DataTransfer 对象用来保存,通过拖放动作,拖动到浏览器的数据。
  79. // 如果dropEffect 属性设定为none,则不允许被拖放到目标元素中。
  80. handleDragOver(e) {
  81. e.dataTransfer.dropEffect = "move"; // e.dataTransfer.dropEffect="move";//在dragenter中针对放置目标来设置!
  82. },
  83. handleDragEnter(e, item) {
  84. e.dataTransfer.effectAllowed = "move"; //为需要移动的元素设置dragstart事件
  85. if (item === this.dragging) {
  86. return;
  87. }
  88. const newItems = [...this.headDto.tableHeaderSortLineDtos];
  89. console.log(newItems);
  90. const src = newItems.indexOf(this.dragging);
  91. const dst = newItems.indexOf(item);
  92. // 替换
  93. newItems.splice(dst, 0, ...newItems.splice(src, 1));
  94. // 让item的颜色等于新交换的颜色
  95. this.headDto.tableHeaderSortLineDtos = newItems;
  96. for (var i = 0; i < this.headDto.tableHeaderSortLineDtos.length; i++) {
  97. var item = this.headDto.tableHeaderSortLineDtos[i];
  98. item.sort = i;
  99. }
  100. var _self = this;
  101. window.setTimeout(function () {
  102. _self.saveOrUpdateheader();
  103. }, 1500);
  104. },
  105. },
  106. mounted: function () {
  107. this.loadHeader();
  108. //为了防止火狐浏览器拖拽的时候以新标签打开,此代码真实有效
  109. document.body.ondrop = function (event) {
  110. event.preventDefault();
  111. event.stopPropagation();
  112. };
  113. },
  114. };
  115. </script>
  116. <style scoped>
  117. ul {
  118. width: 600px;
  119. list-style: none;
  120. padding-bottom: 20px;
  121. }
  122. .item {
  123. cursor: pointer;
  124. height: 30px;
  125. line-height: 24px;
  126. border-radius: 4px;
  127. padding: 10px;
  128. }
  129. </style>