Vue3 实现拖拽排序

àì夳堔傛蜴生んèń 2023-09-27 20:48 76阅读 0赞

Vue3 实现拖拽排序

我们使用的拖拽事件有:

  • draggable:设置为可拖拽状态,true
  • dragstart:开始拖拽
  • dragover:在拖拽过程中
  • drop:在拖拽完成时,将拖拽的元素替换到目标位置
  • dragend 在拖拽结束时,通过dragEnd函数将dragItem变量重置为null。

效果图

  • 7a6984e6c0044ecda109d60ad3332dd2.png

话不多说,直接撸代码

  1. <template>
  2. <div>
  3. <div class="drag-item"
  4. v-for="item in list"
  5. :key="item.id"
  6. :draggable="true"
  7. @dragstart="dragStart(item, $event)"
  8. @dragover="dragOver($event)"
  9. @drop="drop(item, $event)"
  10. @dragend="dragEnd(item)"
  11. >
  12. {
  13. { item.name }}
  14. </div>
  15. </div>
  16. </template>
  17. <script setup lang="ts">
  18. import { ref } from 'vue';
  19. //数据
  20. const list = ref([
  21. { id: 1, name: 'Apple' },
  22. { id: 2, name: 'Banana' },
  23. { id: 3, name: 'Orange' },
  24. { id: 4, name: 'Grape' },
  25. { id: 5, name: 'Mango' }
  26. ]);
  27. //创建dragItem变量,用于保存正在拖拽的元素
  28. let dragItem = ref(null) ;
  29. //在拖拽开始时,通过dragStart函数将当前拖拽的元素保存到dragItem变量中,
  30. // 并将拖拽的数据以字符串形式存储在数据传输对象中。
  31. function dragStart(item, event) {
  32. dragItem.value = item;
  33. //设置拖拽操作的效果为移动,
  34. //这里也可以说一下拖拽的几个效果
  35. // 'none': 不允许拖拽操作。
  36. // 'copy': 拖拽操作会复制被拖拽的数据。
  37. // 'move': 拖拽操作会移动被拖拽的数据。
  38. // 'link': 拖拽操作会创建一个指向被拖拽数据的链接。
  39. // 在设置 effectAllowed 属性后,可以在 dragstart 和 dragover 事件中使用 dropEffect 属性来指定拖拽操作的效果。
  40. event.dataTransfer.effectAllowed = 'move';
  41. //并将拖拽的数据以字符串形式存储在数据传输对象中。
  42. // 其中,item是一个JavaScript对象,通过JSON.stringify()方法将其转换为字符串。
  43. event.dataTransfer.setData('text/plain', JSON.stringify(item));
  44. }
  45. //在拖拽过程中,使用dragOver函数监听dragover事件,
  46. // 并调用event.preventDefault()方法,以允许元素被拖拽到新的位置。
  47. function dragOver(event:any) {
  48. event.preventDefault();
  49. event.dataTransfer.dropEffect = 'move';
  50. }
  51. //在拖拽完成时,使用drop函数将拖拽的元素替换到目标位置,并更新list数组。
  52. function drop(item:any, event:any) {
  53. event.preventDefault();
  54. /**
  55. * 从数据传输对象中获取之前通过 setData() 方法存储的数据,
  56. * 通过 JSON.parse() 方法将其转换为对象。
  57. * 用于获取在拖拽操作中传递的数据。
  58. */
  59. const data = JSON.parse(event.dataTransfer.getData('text/plain'));
  60. console.log('data',data)
  61. console.log('item',item)
  62. //通过 findIndex() 方法查找 list 数组中第一个满足条件的元素的索引,这里的条件是该元素的 id 属性等于 item 对象的 id 属性。
  63. //被替换的元素
  64. const index1 = list.value.findIndex(i => i.id === item.id);
  65. //通过 findIndex() 方法查找 data 对象在 list 数组中的索引
  66. const index2 = list.value.findIndex(i => i.id === data.id);
  67. list.value[index1] = data;
  68. list.value[index2] = item;
  69. }
  70. //在拖拽结束时,通过dragEnd函数将dragItem变量重置为null。
  71. function dragEnd(item) {
  72. dragItem.value = null;
  73. }
  74. </script>
  75. <style scoped>
  76. .drag-item {
  77. margin: 10px;
  78. padding: 10px;
  79. background-color: #f0f0f0;
  80. cursor: move;
  81. color:red
  82. }
  83. </style>

发表评论

表情:
评论列表 (有 0 条评论,76人围观)

还没有评论,来说两句吧...

相关阅读