vue实现拖拽元素互换位置

实现两个盒子内元素位置任意互换,主要原理是在标签上加入draggable可移动属性,dragstart拖拽开始,记录下拖拽的索引和所在的盒子,方便后边操作数组,dragenter拖拽移入元素时触发,通过移入的元素,判断索引和所在的盒子,进行位置互换,dragover拖拽移除元素执行,由于咱们这个是dragenter进行互换的,所以没有用到

css部分

.list {
      list-style: none;
      display: flex;
      height: 200px;
      background-color: #CCC;
      margin-bottom: 100px;
      padding-top: 50px;
      .drag-move {
        transition: transform 0.3s;
      }
      .list-item {
        cursor: move;
        width: 240px;
        background: #EA6E59;
        border-radius: 4px;
        color: #FFF;
        margin-bottom: 6px;
        margin-right: 50px;
        height: 50px;
        line-height: 50px;
        text-align: center;
      }
      .bottom-item{
        background: #6595ee;
      }
      .default-item{
        cursor: move;
        width: 240px;
        border: 1px dashed #666;
        border-radius: 4px;
        color: #666;
        margin-bottom: 6px;
        margin-right: 50px;
        height: 50px;
        line-height: 50px;
        text-align: center;
      }
    }

body部分

<div id="app">
    <transition-group name="drag" class="list" tag="ul">
      <li
        @dragstart="dragstart(index,'top')"
        @dragenter="dragenter($event, index,'top')"
        @dragover.prevent
        @drop="dragdrop($event, index)"
        draggable
        v-for="(item, index) in list1"
        :key="item.label"
        class="list-item"
      >
        {{ item.label }}
      </li>
      <li v-if="list1.length == 0"
        @dragstart="dragstart(0,'top')"
        @dragenter="dragenter($event, 0,'top')"
        @dragover.prevent
        @ondrop="dragdrop($event, 0)"
        key="移动添加"
        class="default-item"
        >
        移动添加
      </li>
    </transition-group>
    <transition-group name="drag" class="list" tag="ul">
      <li
        @dragstart="dragstart(index,'bot')"
        @dragenter="dragenter($event, index,'bot')"
        @dragover.prevent
        @ondrop="dragdrop($event, index)"
        draggable
        v-for="(item, index) in list2"
        :key="item.label"
        class="list-item bottom-item"
      >
        {{ item.label }}
      </li>
      <li v-if="list2.length == 0"
        @dragstart="dragstart(0,'bot')"
        @dragenter="dragenter($event, 0,'bot')"
        @dragover.prevent
        @ondrop="dragdrop($event, 0)"
        key="移动添加"
        class="default-item"
        >
      移动添加
      </li>
    </transition-group>
  </div>

js部分

data(){
        return{
          list1: [
            { label: "元素1" },
            { label: "元素2" },
            { label: "元素3" },
            { label: "元素4" },
            { label: "元素5" },
            { label: "元素6" },
          ],
          list2: [],
          dragIndex: "",
          startIndex: "",
          startName: "",
        }
      },
      methods: {
        dragstart(index, name) {
          this.startName = name
          this.startIndex = index
          this.dragIndex = index;
          console.log(index,'开始')
        },
        dragdrop(e, index){
          console.log(index, '结束')
        },
        dragenter(e, index, name) {
          console.log(this.dragIndex,index, '移动')
          // 上边的盒子内移动
          if(this.startName == 'top' && name == 'top'){
            const moving = this.list1[this.dragIndex];
            this.list1.splice(this.dragIndex, 1);
            this.list1.splice(index, 0, moving);
          }
          // 从上往下移动
          if(this.startName == 'top' && name == 'bot'){
            const moving = this.list1[this.dragIndex];
            this.list1.splice(this.dragIndex, 1);
            this.list2.splice(index, 0, moving);
          }
          // 下边的盒子内移动
          if(this.startName == 'bot' && name == 'bot'){
            const moving = this.list2[this.dragIndex];
            this.list2.splice(this.dragIndex, 1);
            this.list2.splice(index, 0, moving);
          }
          // 网上边的盒子移动
          if(this.startName == 'bot' && name == 'top'){
            const moving = this.list2[this.dragIndex];
            this.list2.splice(this.dragIndex, 1);
            this.list1.splice(index, 0, moving);
          }
          // 排序变化后目标对象的索引变成源对象的索引
          this.startName = name
          this.dragIndex = index
        },
      }
实现div内元素拖拽,可以使用vue-draggable插件。该插件提供了一个可拖拽的列表组件,支持拖拽排序、拖拽复制等功能。 下面是一个简单的示例: 1. 安装vue-draggable插件 ``` npm install vuedraggable --save ``` 2. 在组件中使用vuedraggable组件 ``` <template> <div> <draggable v-model="list"> <div v-for="item in list" :key="item.id">{{ item.name }}</div> </draggable> </div> </template> <script> import draggable from &#39;vuedraggable&#39; export default { components: { draggable }, data() { return { list: [ { id: 1, name: &#39;Item 1&#39; }, { id: 2, name: &#39;Item 2&#39; }, { id: 3, name: &#39;Item 3&#39; }, { id: 4, name: &#39;Item 4&#39; } ] } } } </script> ``` 在上面的示例中,我们使用了vuedraggable组件,并将列表数据绑定到v-model中。列表中的每个元素都被包装在一个div中,并使用v-for指令进行渲染。 3. 实现元素互换位置实现元素互换位置,我们需要在vuedraggable组件上添加一个属性:`swap`。该属性指定一个函数,用于交换两个元素位置。 ``` <template> <div> <draggable v-model="list" :swap="swap"> <div v-for="item in list" :key="item.id">{{ item.name }}</div> </draggable> </div> </template> <script> import draggable from &#39;vuedraggable&#39; export default { components: { draggable }, data() { return { list: [ { id: 1, name: &#39;Item 1&#39; }, { id: 2, name: &#39;Item 2&#39; }, { id: 3, name: &#39;Item 3&#39; }, { id: 4, name: &#39;Item 4&#39; } ] } }, methods: { swap(event) { const draggedIndex = event.draggedContext.index const targetIndex = event.relatedContext.index const temp = this.list[draggedIndex] this.list.splice(draggedIndex, 1) this.list.splice(targetIndex, 0, temp) } } } </script> ``` 在上面的示例中,我们定义了一个名为`swap`的函数,该函数接收一个事件对象作为参数。事件对象包含拖拽元素索引、目标元素索引等信息。我们可以根据这些信息来实现元素互换位置。 具体实现中,我们首先获取被拖拽元素的索引`draggedIndex`和目标元素的索引`targetIndex`,然后使用数组的splice方法将被拖拽元素从列表中删除,并插入到目标元素的前面。 通过以上的步骤,我们就可以轻松地实现div内元素拖拽互换位置了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值