vuedraggable 实现拖拽功能

本文详细介绍了如何使用 Vue.js 的 vuedraggable 插件创建一个拖放小应用。通过示例代码展示了如何设置组件、监听拖放事件以及禁用拖动等操作,帮助读者理解如何将元素从右侧选项区拖拽到左侧目标区域,并在成功拖动后改变颜色,同时避免重复拖动。

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

在这里插入图片描述

项目需求

简单实现一个vue拖拽小案例,右侧选项区拖拽到左侧目标区域,拖动成功的不能再次拖动,并改变颜色。

安装 vuedraggable 插件

cnpm i -S vuedraggable

页面直接引用

import draggable from “vuedraggable”;

components: { draggable },

源码参考

<template>
  <div class="container">
    <div class="content">
      <div class="targetContent">
        <draggable
          :list="resultlists"
          group="article"
          :disabled="disabled"
          @start="targetStart"
          @end="targetEnd"
          class="targetCard"
          style="height: 100px"
        >
          <div
            v-for="resultlists in resultlists"
            :key="resultlists.id"
            class="list-complete-item"
          >
            <div class="list-complete-item-handle">{
   
   {
   
    resultlists.name }}</div>
          </div>
        </draggable>
      </div>
      <div class="optionsContent">
        <draggable
          :list="targetLists"
          :options="{
   
   
            group: {
   
    name: optionsName, pull: 'clone' },
            sort: false,
          }"
          filter=".undraggable"
          @end="optionEnd"
          class="dragArea"
        >
          <div
            v-
### 使用 `vue-draggable` 实现多选拖拽功能 为了实现多选拖拽功能,可以通过扩展 `vue-draggable` 的基本特性来满足需求。通常的做法是在组件内部维护一个多选状态,并通过事件处理函数控制哪些项被选中以及如何批量操作这些项。 #### 多选模式下的配置选项 当启用多选模式时,需要考虑几个重要的属性设置: - **group**:用于指定分组名称以便于区分不同类型的可拖拽区域。 - **multiDrag**:开启此参数允许一次选择多个元素进行拖拽[^1]。 ```html <draggable v-model="items" group="people" @start="drag=true" @end="drag=false" :move="checkMove"> <div v-for="(element, index) in items" :key="index">{{ element.name }}</div> </draggable> ``` #### 自定义样式与交互逻辑 为了让用户体验更加友好,在视觉上也需要做相应的调整。比如给已选中的条目加上特殊的边框或者背景颜色;同时提供快捷键(如Shift键)辅助连续选取相邻的记录。 对于多选的支持还可以借助额外的状态管理工具 Vuex 或者简单的本地变量存储当前的选择集。每当用户点击某个项目时更新这个集合,并在释放鼠标按钮之后执行实际的数据迁移动作。 #### 示例代码片段 这里给出一段简化版的例子展示如何利用 `vue-draggable` 结合 multiDrag 属性完成多选拖拽的效果: ```javascript // main.js or component script section import { Draggable } from 'vuedraggable'; export default { components: { draggable: Draggable, }, data() { return { selectedItems: [], // 存储已被标记为待移动物品的对象数组 items: [ { name: 'John' }, { name: 'Joao'}, { name: 'Jean'} ] }; }, methods: { handleSelectionChange(item){ const selectedIndex = this.selectedItems.indexOf(item); if (selectedIndex === -1 ) { this.selectedItems.push(item); } else { this.selectedItems.splice(selectedIndex , 1 ); } }, checkMove(evt){ let relatedContext = evt.relatedContext; let draggedElement = relatedContext.draggedContext.element; // Only allow dragging of pre-selected elements. if (!this.selectedItems.includes(draggedElement)){ return false; } return true; } } }; ``` ```html <!-- template part --> <div id="app"> <draggable v-model="items" tag="ul" :options="{ multiDrag:true}" @change="logEvent('change')" @choose="logEvent('choose')" @unchoose="logEvent('unchoose')" @sort="logEvent('sort')"> <!-- Each list item can be clicked to toggle selection status --> <li v-for="item in items" :class="[selectedItems.includes(item)?'active':'']" @click="handleSelectionChange(item)"> {{ item.name }} </li> </draggable> </div> ``` 上述例子展示了基础框架下如何集成多选机制到现有的 `vue-draggable` 应用程序当中去。需要注意的是具体实现细节可能依据项目的复杂度有所不同,因此建议开发者根据实际情况灵活调整方案[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值