使用vuedraggable实现从左向右拖拽

这篇博客介绍了如何使用 Vue.js 的 vuedraggable 库来实现从左侧列表向右侧列表拖拽组件的功能。重点在于设置 draggable 的 group、clone 和 put 属性,以确保拖拽过程中组件的正确行为。同时,博主提供了详细的代码示例,包括左右两侧列表的定义以及拖动事件的监听和处理。注意,拖入右侧的组件会进行深复制,以保持数据独立性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 功能描述

使用vuedraggable实现从左边框中拖拽到右边的框中,左边的框不能随意拖拽改变位置,不能向左边框中拖拽组件。右边框中的组件可以拖动位置,但不能拖入到左边框里。

注意事项如下:

(1)draggable的group中的name属性必须一致;

(2)左边框中的draggable必须含有以下属性,group中的pull:'clone'属性表示可以生成新的组件;group中的put:false属性表示不能向里面拖拽组件;{sort: false}属性表示不能更改组件的位置。

(3)左边框中的draggable中的clone="cloneItem"表示组件被拖拽到右边框中后,将生成的是新的组件,如果修改右边组件的数据不会影响左边组件的数据。cloneItem实现的是对每个组件的深复制。如果要实现修改两边框中的任何组件,两边组件都会同步变化,则需要删除clone="cloneItem"属性。

(4)右边框中的draggable中的start属性是监听开始拖动组件,add是监听添加组件,可以根据情况调用其中的数据。

(5)从左边框拖入右边框中判断单个数据是否合法,可以使用move属性,如果,左侧单个数据不合法返回false,则无法添加到右侧框中。

2 截图

3 源代码

<template>
  <div class="my_draggle">
    <div class="md_title">使用vuedraggable实现从左到右拖拽</div>
    
    <div class="md_con">
      <draggable
        class="mdc_left"
        v-model="originDataArr"
        v-bind="{sort: false}"
        v-bind:group="{ name:'person', pull:'clone', put:false }"
        v-bind:clone="cloneItem">

        <div v-for="(item,index) in originDataArr" v-bind:key="index">
          <span>{{item.name}}</span>&nbsp;&nbsp;
          <span>{{item.sex}}</span>
        </div>

      </draggable>

      <draggable
        class="mdc_right"
        v-model="newDataArr"
        v-bind:group="{name:'person'}"
        v-on:start="dragItem"
        v-on:add="addItem">
        <div v-for="(item,index) in newDataArr" v-bind:key="index">
          <span><img v-bind:src="item.icon" /></span>&nbsp;&nbsp;
          <span>{{item.name}}</span>&nbsp;&nbsp;
          <span>{{item.sex}}</span>
        </div>
      </draggable>
    </div>
  </div>
</template>

<script>

import draggable from "vuedraggable"

export default {
  name: 'MyDraggle',
  components:{
    draggable
  },
  props: {
    msg: String
  },
  data: function(){
    return{
      originDataArr: new Array(),
      newDataArr: new Array()
    }
  },

  mounted: function(){
    this.initData();
  },

  methods: {
    initData: function(){
      this.originDataArr = [
        {name:"张三", age: 15, sex: "男", icon: require("@/assets/logo.png")},
        {name:"李四", age: 15, sex: "男", icon: require("@/assets/logo.png")},
        {name:"王五", age: 15, sex: "男", icon: require("@/assets/logo.png")},
        {name:"小花", age: 15, sex: "女", icon: require("@/assets/logo.png")}
      ]
    },

    cloneItem: function(val){
      // 深复制一个节点
      return JSON.parse(JSON.stringify(val)) 
    },

    dragItem: function(widget){
      console.log(widget);
    },

    addItem: function(widget){
      console.log(widget);
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.my_draggle{
  position: relative;
}

.md_title{
  font-size: 24px;
  height: 60px;
}

.md_con>div{
  width: 600px;
  height: 600px;
  display: inline-block;
  border: 1px solid #CCCCCC;
  border-radius: 10px;
  vertical-align: top;
}

.mdc_left>div{
  height: 40px;
  line-height: 40px;
  margin-top: 6px;
  border: 1px solid #CCCCCC;
  cursor: move;
  margin: 10px 20px;
}

.mdc_left>div:hover{
  box-shadow: 1px 2px 4px #CCCCCC;
}

.mdc_right>div{
  height: 40px;
  line-height: 40px;
  margin-top: 6px;
  border: 1px solid #CCCCCC;
  cursor: move;
  margin: 10px 20px;
}

.mdc_right>div:hover{
  box-shadow: 1px 2px 4px #CCCCCC;
}

.mdc_right>div>span{
  display: inline-block;
  vertical-align: top;
}

.mdc_right>div>span>img{
  height: 30px;
}

</style>

### Vue3 中使用 vuedraggable 实现拖拽功能的示例 在 Vue3 中实现拖拽功能,可以使用 `vuedraggable` 组件。以下是详细的实现方法和代码示例: #### 安装 vuedraggable 首先需要安装适用于 Vue3 的 `vuedraggable` 版本: ```bash npm install vuedraggable@next ``` 确保安装的是支持 Vue3 的版本[^2]。 #### 引入 vuedraggable 在项目中引入 `vuedraggable` 并注册为组件: ```javascript import { defineComponent } from "vue"; import draggable from "vuedraggable"; export default defineComponent({ components: { draggable, }, }); ``` #### 使用 vuedraggable 以下是一个简单的拖拽列表示例,展示如何在 Vue3 中使用 `vuedraggable`: ```vue <template> <div> <h3>可拖拽列表</h3> <draggable v-model="items" @end="onDragEnd" class="drag-area"> <div v-for="(item, index) in items" :key="index" class="drag-item"> {{ item }} </div> </draggable> </div> </template> <script> import { defineComponent } from "vue"; import draggable from "vuedraggable"; export default defineComponent({ components: { draggable, }, data() { return { items: ["Item 1", "Item 2", "Item 3", "Item 4"], }; }, methods: { onDragEnd(event) { console.log("拖拽结束", event); }, }, }); </script> <style scoped> .drag-area { min-height: 100px; border: 1px solid #ccc; padding: 10px; } .drag-item { margin: 5px 0; padding: 8px; background-color: #f9f9f9; border: 1px solid #ddd; cursor: move; } </style> ``` 上述代码创建了一个可拖拽的列表,用户可以通过拖拽改变列表项的顺序。当拖拽结束时,会触发 `onDragEnd` 方法,并输出拖拽事件的相关信息[^3]。 #### 高级特性 `vuedraggable` 提供了丰富的特性,例如支持触摸设备、智能滚动、跨列表拖拽等。以下是一些常用属性的说明: - `v-model`:绑定数据源。 - `@start`:拖拽开始时触发。 - `@end`:拖拽结束时触发。 - `group`:定义拖拽组,用于跨列表拖拽。 - `move`:控制是否允许拖拽某个元素[^2]。 #### 删除功能示例 如果需要实现拖拽到垃圾桶图标位置进行删除的功能,可以参考以下代码: ```vue <template> <div> <h3>可拖拽列表</h3> <draggable v-model="items" group="people" @end="onDragEnd" class="drag-area"> <div v-for="(item, index) in items" :key="index" class="drag-item"> {{ item }} </div> </draggable> <div class="trash-bin" @drop="handleDrop" @dragover.prevent> <span>垃圾桶</span> </div> </div> </template> <script> import { defineComponent } from "vue"; import draggable from "vuedraggable"; export default defineComponent({ components: { draggable, }, data() { return { items: ["Item 1", "Item 2", "Item 3", "Item 4"], }; }, methods: { onDragEnd(event) { console.log("拖拽结束", event); }, handleDrop(event) { const draggedElement = event.dataTransfer.getData("text/plain"); this.items = this.items.filter((item) => item !== draggedElement); }, }, }); </script> <style scoped> .drag-area { min-height: 100px; border: 1px solid #ccc; padding: 10px; } .drag-item { margin: 5px 0; padding: 8px; background-color: #f9f9f9; border: 1px solid #ddd; cursor: move; } .trash-bin { margin-top: 20px; width: 100px; height: 50px; line-height: 50px; text-align: center; background-color: red; color: white; border-radius: 5px; } </style> ``` 上述代码实现了将列表项拖拽到垃圾桶图标位置进行删除的功能[^1]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值