• vue2使用vuedraggable实现拖拽删除添加重置功能


    需求:要输入xx阶段,之后输入后显示但是要可以自己手动排序和删除,以免写错了,并且做了判断,如果重复输入的话会提示,不会让他添加,点击重置功能后一键清空所有输入


    1.效果

    2.下载插件

    我直接下的最新版

    npm install vuedraggable

    3.页面导入注册

    1. 导入
    2. import Draggable from "vuedraggable";
    3. 注册
    4. components: {
    5. Draggable
    6. },

    4.讲解部分代码(完整代码最下面)

    4.1添加内容

    some方法:相当于||运算符,只要在数组中有一个是符合判断条件的那么返回的就为ture

    1. addStage() {
    2. if (this.formLabelAlign.stage) {
    3. // 使用some方法遍历数组,如果存在相同值则返回true,否则返回false
    4. const isDuplicate = this.listStage.some((item) => {
    5. return item.name === this.formLabelAlign.stage;
    6. });
    7. if (isDuplicate) {
    8. // 如果存在相同值,则提示错误并返回false
    9. this.$message.error("输入重复,请重新输入!");
    10. return false;
    11. } else {
    12. // 否则,将新元素添加到数组中
    13. this.listStage.push({ name: this.formLabelAlign.stage});
    14. }
    15. } else {
    16. this.$message.error("施工阶段不允许为空!!");
    17. }
    18. },

    4.2单个删除

    这边比对的是index索引值,只要索引值相同那么就查到元素在数组中的索引值,之后再删除

    indexOf:方法返回的是要查找的元素在数组中的索引位置,如果没找到则返回-1。

    splice:方法,第一个是要删除的索引位置,第二个是从该位置删几个元素

    1. deleteEle(ind) {
    2. this.listStage.forEach((item,index) => {
    3. if(ind === index){
    4. const index = this.listStage.indexOf(item);
    5. this.listStage.splice(index, 1);
    6. }
    7. });
    8. },

     4.3样式

    这几个都是插件自带的样式,可以自行更改

    1. .list-complete-item.sortable-chosen {
    2. background: #4ab7bd;
    3. }
    4. .list-complete-item.sortable-ghost {
    5. background: #30b08f;
    6. }
    7. .list-complete-enter,
    8. .list-complete-leave-active {
    9. opacity: 0;
    10. }

    5.完整代码

    样式和我录的会有差别哈,这是我特地剪切出来的,不是原版,操作是没问题的,样式需要自行更改。

    1. <template>
    2. <div class="content-box">
    3. <div class="container">
    4. <el-button @click="openDialog()">打开弹窗el-button>
    5. <el-dialog
    6. title="添加类型"
    7. :visible.sync="addProjectTypeDiglog"
    8. width="30%"
    9. >
    10. <el-form label-position="left" label-width="80px" :model="formLabelAlign">
    11. <el-form-item label="类型">
    12. <el-input v-model="formLabelAlign.name">el-input>
    13. el-form-item>
    14. <el-form-item label="阶段">
    15. <div class="from_item">
    16. <el-input
    17. v-model="formLabelAlign.stage"
    18. placeholder="请输入阶段"
    19. >el-input>
    20. <el-button type="success" @click="addStage()" size="small" plain
    21. >添加
    22. >
    23. <el-button
    24. type="primary"
    25. size="small"
    26. @click="templateStage()"
    27. plain
    28. >模版
    29. >
    30. <el-button type="info" size="small" @click="resetStage()" plain
    31. >重置
    32. >
    33. div>
    34. el-form-item>
    35. el-form>
    36. <draggable :list="listStage" class="list-group" ghost-class="ghost">
    37. <div
    38. v-for="(element, index) in listStage"
    39. :key="index"
    40. class="list-complete-item"
    41. >
    42. <div class="list-complete-item-handle">
    43. {{ element.name }}
    44. div>
    45. <div style="position: absolute; right: 0px">
    46. <span
    47. style="float: right; margin-top: -25px; margin-right: 15px"
    48. @click="deleteEle(index)"
    49. >
    50. <i style="color: #ff4949" class="el-icon-delete" />
    51. span>
    52. div>
    53. div>
    54. draggable>
    55. <span slot="footer" class="dialog-footer">
    56. <el-button @click="addProjectTypeDiglog = false">取 消el-button>
    57. <el-button type="primary" @click="sureStage()">确 定el-button>
    58. span>
    59. el-dialog>
    60. div>
    61. div>
    62. template>
    63. <script>
    64. import Draggable from "vuedraggable";
    65. export default {
    66. components: {
    67. Draggable
    68. },
    69. data() {
    70. return {
    71. addProjectTypeDiglog: false,//添加工程类型的弹窗
    72. templateDialog:false,//模版弹窗
    73. formLabelAlign: {
    74. name: "",
    75. stage: "",
    76. type: "",
    77. },
    78. listStage: [{ name: "John",id:0 }, { name: "Joao",id:1 }, { name: "Jean",id:2 }],
    79. index:2
    80. };
    81. },
    82. mounted() {
    83. },
    84. methods: {
    85. openDialog(){
    86. this.addProjectTypeDiglog=true;
    87. },
    88. addStage() {
    89. if (this.formLabelAlign.stage) {
    90. // 使用some方法遍历数组,如果存在相同值则返回true,否则返回false
    91. const isDuplicate = this.listStage.some((item) => {
    92. return item.name === this.formLabelAlign.stage;
    93. });
    94. if (isDuplicate) {
    95. // 如果存在相同值,则提示错误并返回false
    96. this.$message.error("输入重复,请重新输入!");
    97. return false;
    98. } else {
    99. // 否则,将新元素添加到数组中
    100. this.listStage.push({ name: this.formLabelAlign.stage});
    101. }
    102. } else {
    103. this.$message.error("施工阶段不允许为空!!");
    104. }
    105. },
    106. deleteEle(ind) {
    107. this.listStage.forEach((item,index) => {
    108. if(ind === index){
    109. const index = this.listStage.indexOf(item);
    110. this.listStage.splice(index, 1);
    111. }
    112. });
    113. },
    114. resetStage() {
    115. this.listStage = [];
    116. },
    117. }
    118. };
    119. script>
    120. <style lang="scss" scoped>
    121. // 拖拽的样式设置
    122. .list-group {
    123. .list-complete-item {
    124. // width: 80%;
    125. cursor: pointer;
    126. position: relative;
    127. font-size: 16px;
    128. padding: 10px 12px;
    129. margin: 0 0 4px 80px;
    130. border: 1px solid #bfcbd9;
    131. transition: all 1s;
    132. }
    133. .list-complete-item-handle {
    134. overflow: hidden;
    135. text-overflow: ellipsis;
    136. white-space: nowrap;
    137. margin-right: 50px;
    138. }
    139. .list-complete-item.sortable-chosen {
    140. background: #4ab7bd;
    141. }
    142. .list-complete-item.sortable-ghost {
    143. background: #30b08f;
    144. }
    145. .list-complete-enter,
    146. .list-complete-leave-active {
    147. opacity: 0;
    148. }
    149. }
    150. style>

    文章到此结束,希望对你有所帮助~~有问题可以在评论区联系我

  • 相关阅读:
    2. gin中间件注意事项、路由拆分与注册技巧
    Qt实现一个漂亮的等待加载界面
    学习OpenCV(蝴蝶书/C++)相关——2.MacOS下使用LLDB调试cpp程序
    FreeRTOS两个死机原因(中断调用接口异常)【杂记】
    [NPUCTF2020]Mersenne twister
    Antd Pro项目接入qiankun微前端
    测试9年,面试华为要薪1万,华为员工:公司没这么低工资的岗
    线性代数-3
    铁路关基保护新规发布!铁路软件供应链安全洞察与治理思路
    ClickHouse多级磁盘和冷热数据分离实践
  • 原文地址:https://blog.csdn.net/qq_44278289/article/details/132898757