elective-preference-drag.vue 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <template>
  2. <!-- 拖拽demo-->
  3. <transition-group name="drag" class="list" tag="ul">
  4. <template v-if="!disabled">
  5. <li v-for="(item, index) in selectedList" :key="item.groupId">
  6. <span>{{ `第${index + 1}志愿:` }}</span>
  7. <span class="list-item move"
  8. @dragenter="dragenter($event, index)"
  9. @dragover="dragover($event, index)"
  10. @dragstart="dragstart(index)"
  11. draggable="true"
  12. >{{ item.groupName }}</span>
  13. <el-button style="cursor: pointer" @click="del(index)" size="mini" type="danger">删除</el-button>
  14. </li>
  15. </template>
  16. <template v-else>
  17. <li v-for="(item, index) in selectedList" :key="item.groupId">
  18. <span>{{ `第${index + 1}志愿:` }}</span>
  19. <span class="list-item">{{ item.groupName }}</span>
  20. </li>
  21. </template>
  22. </transition-group>
  23. </template>
  24. <script>
  25. export default {
  26. props: {
  27. selectedList: Array,
  28. disabled: {
  29. type: Boolean,
  30. default: false
  31. }
  32. },
  33. data() {
  34. return {
  35. dragIndex: '',
  36. enterIndex: ''
  37. }
  38. },
  39. methods: {
  40. dragstart(index) {
  41. this.dragIndex = index
  42. },
  43. dragenter(e, index) {
  44. e.preventDefault()
  45. // 避免源对象触发自身的dragenter事件
  46. if (this.dragIndex !== index) {
  47. const source = this.selectedList[this.dragIndex]
  48. this.selectedList.splice(this.dragIndex, 1)
  49. this.selectedList.splice(index, 0, source)
  50. // 排序变化后目标对象的索引变成源对象的索引
  51. this.dragIndex = index
  52. }
  53. },
  54. del(index) {
  55. this.selectedList[index].selected = false
  56. this.selectedList.splice(index, 1)
  57. },
  58. dragover(e, index) {
  59. e.preventDefault()
  60. }
  61. }
  62. }
  63. </script>
  64. <style lang="scss" scoped>
  65. .list {
  66. padding-left: 0;
  67. list-style: none;
  68. .drag-move {
  69. transition: transform .3s;
  70. }
  71. li {
  72. font-size: 14px;
  73. margin-bottom: 6px;
  74. }
  75. .move {
  76. cursor: move;
  77. }
  78. .list-item {
  79. display: inline-block;
  80. margin: 0 10px;
  81. width: 160px;
  82. background: #42b983;
  83. border-radius: 4px;
  84. font-size: 14px;
  85. color: #FFF;
  86. height: 30px;
  87. line-height: 30px;
  88. text-align: center;
  89. }
  90. }
  91. </style>