当前位置:   article > 正文

vue使用vuedraggable拖拽组件,进行组件生成_vue拖拽组件生成前端页面

vue拖拽组件生成前端页面

最近写项目使用到了vuedraggable这个插件,进行组件生成,由于第一次使用,就上网搜相关文章,结果网上基本上都是上下拖拽之类的,没有找到自己想要的结果,然后就根据自己的需求结合相关文档进行了开发

开发完后大概结果视频如下:

vuedraggable拖拽生成组件

静态效果如下:

 第一步:下载依赖:

npm i -S vuedraggable

第二步:在项目中引入:

import draggable from "vuedraggable";

第三步查看相关属性和方法:

属性:

 事件:

 属性和事件使用方法请详看 官网:

中文(国人翻译,可能更新不及时):vue.draggable中文文档 - itxst.com

英文:https://www.itxst.com/vue-draggable/tutorial.html

第四步:在代码里使用 html

  1. <template>
  2. <div>
  3. <div class="">
  4. <draggable
  5. v-model="applyList"
  6. :group="{ name: 'piece', pull: 'clone', put: true }"
  7. animation="100"
  8. :sort="false"
  9. :clone="addComponent"//左边应用组数据
  10. >
  11. <div class="employ" v-for="item in applyList" :key="item.id">
  12. <span class="nr">{{ item.name }}</span>
  13. </div>
  14. </draggable>
  15. </div>
  16. <div class="">
  17. <draggable
  18. v-model="applyList"
  19. :group="{ name: 'piece', pull: 'clone', put: true }"
  20. animation="100"
  21. :sort="false"
  22. :clone="addComponent"//左边应用数据
  23. >
  24. <div class="employ" v-for="item in applyList" :key="item.id">
  25. <span class="nr">{{ item.name }}</span>
  26. </div>
  27. </draggable>
  28. </div>
  29. <div>
  30. <draggable v-model="onList" group="piece" animation="100">//右边空数组
  31. <transition-group :style="style">
  32. <div class="myEmploy" v-for="item in onList" :key="item.id">
  33. <span class="zjNr"
  34. >{{ item.name }}
  35. <div class="ddd">
  36. <draggable
  37. v-model="item.myList"//父级空数组
  38. :group="{
  39. name: 'theChild',
  40. pull: 'clone',
  41. }"
  42. animation="100"
  43. :clone="cloneComponent"
  44. :sort="true"
  45. >
  46. <transition-group :style="style">
  47. <!-- 子应用 -->
  48. <div class="caTion" :key="item.id">
  49. <div
  50. class="suBAppLicaTion"
  51. v-for="(it, idx) in item.myList"//子级空数组
  52. :key="idx"
  53. >
  54. <i
  55. class="el-icon-circle-close myDelete"
  56. @click="onDelete(idx)"
  57. ></i>
  58. <img :src="it.url" alt="" />
  59. <span class="ziNr">{{ it.name }}</span>
  60. </div>
  61. </div>
  62. </transition-group>
  63. </draggable>
  64. </div>
  65. </span>
  66. </div>
  67. </transition-group>
  68. </draggable>
  69. 从左侧拖入或点选组件进行应用组合
  70. </div>
  71. </div>
  72. </template>

js:

  1. <script>
  2. import draggable from "vuedraggable";
  3. export default {
  4. components: {
  5. draggable,
  6. },
  7. data() {
  8. return {
  9. applyList: [
  10. {
  11. name: "前端小脑虎",
  12. id: 1,
  13. },
  14. {
  15. name: "关注我,不迷路",
  16. id: 2,
  17. },
  18. {
  19. name: "vue问题大全",
  20. id: 3,
  21. },
  22. {
  23. name: "欢迎来到深圳",
  24. id: 4,
  25. },
  26. ],
  27. useList: [
  28. {
  29. url: require("../../assets/images/profile.jpg"),
  30. name: "学习呀",
  31. id: 5,
  32. },
  33. {
  34. url: require("../../assets/images/profile.jpg"),
  35. name: "前端耐斯",
  36. id: 6,
  37. },
  38. {
  39. url: require("../../assets/images/profile.jpg"),
  40. name: "前端小脑虎",
  41. id: 7,
  42. },
  43. {
  44. url: require("../../assets/images/profile.jpg"),
  45. name: "深圳欢迎你",
  46. id: 8,
  47. },
  48. ],
  49. list: [
  50. {
  51. url: require("../../assets/images/profile.jpg"),
  52. name: "互连网+",
  53. id: 1,
  54. },
  55. {
  56. url: require("../../assets/images/profile.jpg"),
  57. name: "直装直提",
  58. id: 2,
  59. },
  60. ],
  61. onList: [],
  62. myList: [],
  63. style: "min-height:120px;display: block;",
  64. utilize: false,
  65. AppGroup: false,
  66. };
  67. },
  68. methods: {
  69. // 删除
  70. onDelete(idx) {
  71. this.onList.forEach((item) => {
  72. const id = item.myList[idx].id;
  73. item.myList.splice(idx, 1);
  74. console.log("item", item.myList);
  75. });
  76. },
  77. // 子应用添加
  78. newSubAppLicaTion(item) {
  79. const clone = this.cloneComponent(item);
  80. this.onList.forEach((item) => {
  81. if (item.myList) {
  82. item.myList.push(clone);
  83. } else {
  84. item.myList = [clone];
  85. }
  86. });
  87. },
  88. // 应用组添加
  89. addComponent(item) {
  90. let exist = false;
  91. this.onList.forEach((it) => {
  92. //遍历onList,判断是否当前拖拽的应用组内容是否存在,存在就赋值exist为true并return
  93. if (it.id == item.id) {
  94. exist = true;
  95. return;
  96. }
  97. });
  98. if (exist) {
  99. //根据exist来判断,为true就return,false就push进去
  100. this.$message({
  101. message: "组件里已经有相同的应用组啦,请拖拽其他应用组哦",
  102. type: "warning",
  103. });
  104. return;
  105. } else {
  106. const clone = item;
  107. this.onList.push({ ...clone, myList: [] });
  108. }
  109. },
  110. // 应用复制
  111. cloneComponent(origin) {
  112. let exist = false;
  113. this.onList.forEach((item) => {
  114. item.myList.forEach((it) => {
  115. //遍历myList,判断是否当前拖拽的应用内容是否存在,存在就赋值exist为true并return
  116. if (it.id == origin.id) {
  117. exist = true;
  118. return;
  119. }
  120. });
  121. });
  122. if (exist) {
  123. //根据exist来判断,为true就return,false就push进去
  124. this.$message({
  125. message: "组件里已经有相同的应用啦,请拖拽其他应用哦",
  126. type: "warning",
  127. });
  128. return;
  129. } else {
  130. const clone = origin;
  131. return clone;
  132. }
  133. },
  134. onEnd() {
  135. this.drag = false;
  136. },
  137. save() {},
  138. // 编辑
  139. },
  140. };
  141. </script>

以上就是这个插件在项目中使用的流程 如果有不懂可以私信我

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号