循环渐进的玩转拖拽vue-draggable-plus

我们在做分组拖拽的时候,会用到VueDraggable,它是基于Sortablejs , 但我们想实现一些功能,可能很难在它的文档上找到相应的api,所以下面使用几个需求(双组拖拽,大小限制,头部尾部默认项,),深度理解这个VueDraggable组件库的用法

官方文档:

https://alfred-skyblue.github.io/vue-draggable-plus/guide/

下面例子基于vue3.0 setup组件

首先我们实现一个简单的双列表拖拽排序

下载引入

import { VueDraggable } from 'vue-draggable-plus'
<template>
    <div class="conatiner">
        <div class="left">
            <VueDraggable v-model="list1" animation="1000" ghostClass="ghost" group="people">
                <div v-for="item in list1" :key="item.id" class="item mover">
                    {{ item.name }}
                </div>
            </VueDraggable>
        </div>
        <div class="right">
            <VueDraggable v-model="list2" group="people" animation="1000" ghostClass="ghost">
                <div v-for="item in list2" :key="item.id" class="item mover">
                    {{ item.name }}
                </div>
            </VueDraggable>
        </div>
    </div>
</template>
  
<script setup>
import { ref } from 'vue'
import { VueDraggable } from 'vue-draggable-plus'
const list1 = ref([
    {
        name: '巴适的板',
        id: '1'
    },
    {
        name: '劳资蜀道山',
        id: '2'
    },
    {
        name: '雄起',
        id: '3'
    },
    {
        name: '弯脚杆',
        id: '4'
    }
])
const list2 = ref([
    {
        name: '火锅',
        id: '1-1'
    },
    {
        name: '串串',
        id: '2-2'
    },
    {
        name: '钵钵鸡',
        id: '3-3'
    },
    {
        name: '夺夺粉',
        id: '4-4'
    }
])
</script>

<style lang="less">
.conatiner {
    display: flex;
    justify-content: space-evenly;

    >div {
        border: 1px solid rgb(237, 199, 199);
        min-width: 300px;
    }


    .item {
        cursor: pointer;
        margin: 10px;
        border: 1px solid #e6e6ff;

    }

    .graggable {
        min-width: 300px;
    }

    .footer {
        padding-top: 30px;
        padding-bottom: 30px;
    }
}
</style>

其中属性含义 :

  • v-model // 数据源
  • animation=“1000” // 动画
  • group=“people”// 分组,相同名称可以相互拖拽

效果图

下面我们加一个拖拽限制,第二个盒子超过5个就拒绝拖拽进入该盒子

配置:

:group="{ name: 'people', pull: true, put: list2.length < 5 }"

template改变如下:

<template>
    <div class="conatiner">
        <div class="left">
            <VueDraggable v-model="list1" animation="1000" ghostClass="ghost" group="people">
                <div v-for="item in list1" :key="item.id" class="item mover">
                    {{ item.name }}
                </div>
            </VueDraggable>
        </div>
        <div class="right">
            <VueDraggable v-model="list2" :group="{ name: 'people', pull: true, put: list2.length < 5 }" animation="1000"
                ghostClass="ghost">
                <div v-for="item in list2" :key="item.id" class="item mover">
                    {{ item.name }}
                </div>
            </VueDraggable>
        </div>
    </div>
</template>

效果图:

下面我们在拖拽下加一个默认底部

作用:默认底部不支持拖拽,满足默写需求,另外当拖拽容器内没有拖拽元素时也可以拖拽进入

template变化如下:

<template>
    <div class="conatiner">
        <div class="left">
            <VueDraggable v-model="list1" animation="1000" class="graggable" ghostClass="ghost" draggable=".mover"
                :group="{ name: 'people', pull: true, put: true }" @update="onUpdate" @add="onAdd" @remove="remove">

                <div v-for="item in list1" :key="item.id" class="item mover">
                    {{ item.name }}
                </div>
                <div class="footer">
                    尾部
                </div>
            </VueDraggable>
        </div>
        <div class="right">
            <VueDraggable v-model="list2" class="graggable" :group="{ name: 'people', pull: true, put: list2.length < 6 }"
                :options="{ preventOnFilter: false }" animation="1000" ghostClass="ghost" @update="onUpdate" @add="onAdd"
                @remove="remove">
                <div v-for="item in list2" :key="item.id" class="item mover">
                    {{ item.name }}
                </div>
                <div class="footer">
                    尾部
                </div>
            </VueDraggable>
        </div>
    </div>
</template>

加一些底部css样式

<style lang="less">
.conatiner {
    display: flex;
    justify-content: space-evenly;

    >div {
        border: 1px solid rgb(237, 199, 199);
        min-width: 300px;
    }


    .item {
        cursor: pointer;
        margin: 10px;
        border: 1px solid #e6e6ff;

    }

    .graggable {
        min-width: 300px;
    }

    .footer {
        padding-top: 30px;
        padding-bottom: 30px;
    }
}
</style>

效果图:
请添加图片描述

好了,上面就是VueDraggable的隐藏用法了,如果你还有更多的需求可以查阅

http://www.sortablejs.com/options.html

因为该组件是基于Sortable.js,所以配置也可以传入进去,
如果有帮助到你的话,点个赞再走吧!感谢

u=4041271334,3825689698&fm=253&fmt=auto&app=138&f=JPEG.webp

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue-draggable-plus是基于Vue.js的可拖拽组件库。它是基于vuedraggable的扩展,提供了更多的功能和选项来满足不同的需求。使用Vue-draggable-plus可以方便地实现拖拽功能,并且可以对属性重复添加问题进行处理。 安装Vue-draggable-plus,可以使用以下命令: ``` yarn add vue-draggable-plus npm install vue-draggable-plus --save ``` 在处理属性重复添加问题时,可以通过监听拖拽事件来判断右侧属性列表中是否已存在相同属性。在拖拽事件中,可以通过事件参数获取相关的数据信息。例如,通过`e.draggedContext.element`可以获取拖动元素绑定的数据对象,通过`e.relatedContext.list`可以获取目标列表的数据。可以使用这些数据进行简单的对比,如果已存在相同属性,则返回false,终止拖动动作。 Vue-draggable-plus提供了丰富的事件和选项,可以根据具体的需求进行定制和配置。通过合理地使用这些功能和选项,可以实现属性重复添加问题的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [关于vue使用vue-draggable实现图片拖拽效果(项目中使用简单描述)](https://blog.csdn.net/m0_60602811/article/details/127106131)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vuedraggable实战:结合具体应用场景实现列表内拖拽排序、列表间移动、复制,介绍、安装、使用、坑点及解决...](https://blog.csdn.net/seawaving/article/details/128083596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值