image.png

背景介绍:工作需求 | 需要 实现页面自定义 的功能,其中有一部分需要配置页面的层级,越靠上的 z-index 越大,位于靠下的控件之上显示。页面层级区域,就好比图层,这些图层需要支持拖拽。该需求计划使用 vuedraggable 来实现。

先搭建一个简单的 vue2 工程,写一个简单的 demo,自行体验一下该组件的效果,先对 vue draggable 组件有一个初步的了解,比如 vue draggable 能做什么、该如何做。然后再添加到业务中……

demo 最终效果演示:
demo.gif

因为要实现自定义页面的需求,业务需求需要包含层级的控制功能。层级,就是如果自定义组件重叠了,那么层级高的在层级低的上边显示。层级的控制,需要支持拖拽的功能。

参考资料

安装 vuedraggable
  • yarn add vuedraggable
  • npm i -S vuedraggable

vuedraggable 属性

image.png

vuedraggable 事件

image.png

源码
  1. <template>
  2. <div id="app">
  3. <!-- <img alt="Vue logo" src="./assets/logo.png"> -->
  4. <button @click="addItem">addItem</button>
  5. <draggable
  6. v-model="myArray"
  7. @start="drag = true"
  8. :force-fallback="true"
  9. animation="300"
  10. chosen-class="drag-chosen"
  11. ghost-class="drag-ghost"
  12. >
  13. <div v-for="(item, index) in myArray" :key="index" class="drag-item">
  14. {{ item.name }}
  15. </div>
  16. </draggable>
  17. <pre>{{ myArrayWithZIndex }}</pre>
  18. </div>
  19. </template>
  20. <script>
  21. import draggable from "vuedraggable";
  22. export default {
  23. name: "App",
  24. components: {
  25. draggable,
  26. },
  27. data() {
  28. return {
  29. myArray: [
  30. {
  31. name: "item1"
  32. },
  33. {
  34. name: "item2"
  35. },
  36. {
  37. name: "item3"
  38. },
  39. ],
  40. };
  41. },
  42. computed: {
  43. myArrayWithZIndex() {
  44. const len = this.myArray.length;
  45. return this.myArray.map((it, index) => {
  46. it.zIndex = len - index;
  47. return it;
  48. });
  49. },
  50. },
  51. methods: {
  52. addItem() {
  53. const len = this.myArray.length;
  54. this.myArray.unshift({
  55. name: "item" + (len + 1),
  56. id: len + 1,
  57. });
  58. },
  59. },
  60. };
  61. </script>
  62. <style>
  63. #app {
  64. width: 50vw;
  65. margin: 60px auto 0;
  66. color: #2c3e50;
  67. display: flex;
  68. align-items: center;
  69. justify-content: space-around;
  70. }
  71. .drag-item {
  72. border: 1px solid #ddd;
  73. padding: 20px 10px;
  74. cursor: pointer;
  75. }
  76. .drag-chosen {
  77. border-color: #50b0ad;
  78. }
  79. .drag-ghost {
  80. background-color: #50b0ad;
  81. color: #fff;
  82. }
  83. </style>