Vue3+TS实现多个按钮分别拖到各自对应的位置,并只能按照顺序拖拽

具体实现代码如下:

<template>
  <div>
   /**
     * 三个可以拖动的按钮
     */
    <div class="item" draggable="true" @dragstart="dragStart({ id: 'item1', targetId: 'target1' })">Item 1</div>
    <div class="item" draggable="true" @dragstart="dragStart({ id: 'item2', targetId: 'target2' })">Item 2</div>
    <div class="item" draggable="true" @dragstart="dragStart({ id: 'item3', targetId: 'target3' })">Item 3</div>
    /**
     * 三个可以拖动的按钮分别对应的目标位置
     */
    <div class="target" id="target1" @drop="drop({ id: 'target1', allowedItems: ['item1'] })" @dragover.prevent="dragOver">Target 1</div>
    <div class="target" id="target2" @drop="drop({ id: 'target2', allowedItems: ['item2'] })" @dragover.prevent="dragOver">Target 2</div>
    <div class="target" id="target3" @drop="drop({ id: 'target3', allowedItems: ['item3'] })" @dragover.prevent="dragOver">Target 3</div>
  </div>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';

interface DraggedItem {
  id: string;
  targetId: string;
}

interface Target {
  id: string;
  allowedItems: string[];
}

export default defineComponent({
  setup() {
    const draggedItem = ref<DraggedItem | null>(null);
    const allowedItems = ['item1', 'item2', 'item3'];
    // 定义当前拖拽的索引
    let currentDragIndex = 0;

    const dragStart = (item: DraggedItem) => {
      if (item.id === allowedItems[currentDragIndex]) {
        draggedItem.value = item;
      } else {
        console.log(`Item ${item.id} 拖拽顺序不正确`);
      }
    };

    const dragOver = (event: DragEvent) => {
      event.preventDefault();
      if(event.dataTransfer){
        event.dataTransfer.dropEffect = 'move';
      }
    };

    const drop = (target: Target) => {
      if (draggedItem.value?.id === allowedItems[currentDragIndex]) {
        const allowedItems = target.allowedItems;

        // 检查目标是否允许拖拽的项目
        if (allowedItems.includes(draggedItem.value?.id || '')) {
          console.log(`Item ${draggedItem.value?.id} 被拖拽到 Target ${target.id}`);
          draggedItem.value = null;
          currentDragIndex++;
        } else {
          console.log(`Item ${draggedItem.value?.id} 不能被拖拽到 Target ${target.id}`);
        }
      }
    };

    return {
      draggedItem,
      dragStart,
      dragOver,
      drop,
    };
  },
});
</script>
<style scoped>
.target {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  margin: 10px;
}
</style>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值