Vue利用draggable实现多选拖拽效果

 更新时间:2022年05月06日 14:48:04   作者:宜简  
这篇文章主要为大家详细介绍了如何利用vue中的draggable插件实现多选拖拽效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

最近产品提出一个排序需求,希望能进行拖拽排序,我一想,vue2插件这么多,sortable.js、draggable分分钟实现了,但是还有一个需求希望能够实现多选拖拽,这个就有点麻烦,查询了许多资料,暂时没有发现能够多选的拖拽组件,如果自己写一个,既耗费时间,实现效果上必然没有draggable这种成熟轮子效果好,于是决定基于draggable做改进。

实现思路

我们知道draggable插件只要设置相同的group名字就能实现分组拖拽,如果我们渲染两个同名分组,控制第二个分组的显示与隐藏,鱼目混珠,就能实现简单的多选拖拽效果

1.通过group="task"设置两个同名分组,同时利用draggable=".card"属性,控制class名称,禁止单选

  <draggable group="task" v-model="dataList" @end="draggerEnd" class=""
        :class="show ? 'order-box-show' : 'order-box'" animation="300" draggable=".card">
        <transition-group>
          <div v-for="(item, index) in dataList" :key="index" class="box" @click="handleSelect(index)"
            :class="item.select || show ? 'card' : ''">{{ item.name }}
          </div>
        </transition-group>
      </draggable>
      <div class="position" v-show="show">
        <draggable group="task" v-model="dataList2" @end="draggerEnd" class="order-box" animation="300">
          <transition-group>
            <div v-for="(item, index) in dataList2" :key="index" class="boxs">
              <div>
                {{ item.name }}
              </div>
            </div>
          </transition-group>
        </draggable>

2.通过v-show="show"控制第二个分组的隐藏与展示,同时对数据做处理,并且在拖拽结束后,要在分组一中找到分组二拖拽过来的初始元素删掉

    const findIndex = this.dataList.findIndex((item => item.name === '选中元素展示区'))
      this.dataList.splice(findIndex, 1)

Demo全部代码

<template>
  <div>
    <div>
      <draggable group="task" v-model="dataList" @end="draggerEnd" class=""
        :class="show ? 'order-box-show' : 'order-box'" animation="300" draggable=".card">
        <transition-group>
          <div v-for="(item, index) in dataList" :key="index" class="box" @click="handleSelect(index)"
            :class="item.select || show ? 'card' : ''">{{ item.name }}
          </div>
        </transition-group>
      </draggable>
      <div class="position" v-show="show">
        <draggable group="task" v-model="dataList2" @end="draggerEnd" class="order-box" animation="300">
          <transition-group>
            <div v-for="(item, index) in dataList2" :key="index" class="boxs">
              <div>
                {{ item.name }}
              </div>
            </div>
          </transition-group>
        </draggable>
      </div>
    </div>
    <el-button style="marginLeft:50px" @click="handleStart">确认</el-button>
  </div>
</template>

<script>
import draggable from 'vuedraggable'
export default {
  components: {
    draggable
  },
  data() {
    return {
      dataList: [
      ],
      dataList2: [{ name: '选中元素展示区' }],
      show: false,
      selectArr: [],
    }
  },
  mounted() {
    for (var i = 0; i < 60; i++) {
      this.dataList.push({ name: i, select: false })
    }
  },
  methods: {
    handleSelect(index) {
      const data = JSON.parse(JSON.stringify(this.dataList))
      data[index].select = true
      this.selectArr.push({ ...data[index] })
      this.dataList = JSON.parse(JSON.stringify(data))
    },
    handleStart(e) {
      if (!this.selectArr.length) {
        return
      }
      this.show = true
      this.selectArr.forEach((item, index) => {
        const Index = this.dataList.findIndex(it => item.name === it.name)
        this.dataList.splice(Index, 1)
      })
    },
    draggerEnd(e) {
      const newIndex = e.newIndex
      this.dataList.splice(newIndex, 0, ...this.selectArr)
      const findIndex = this.dataList.findIndex((item => item.name === '选中元素展示区'))
      this.dataList.splice(findIndex, 1)
      this.show = false
    },


  }
}
</script>

<style lang="scss" scoped>
.order-box {
  padding: 20px 50px;
  display: flex;
  flex-wrap: wrap;

  >span {
    flex: 1;
    display: flex;
    flex-wrap: wrap;
  }

  .box {
    width: 100px;
    height: 50px;
    background: rgb(7, 174, 215);
    margin-right: 10px;
    margin-bottom: 10px;
  }

  .boxs {
    width: 100px;
    height: 50px;
    background: rgb(215, 177, 7);
    margin-right: 10px;
    margin-bottom: 10px;
  }

  .card {
    background: rgb(128, 68, 0) !important;
  }
}

.order-box-show {
  padding: 20px 50px;
  display: flex;
  flex-wrap: wrap;

  >span {
    flex: 1;
    display: flex;
    flex-wrap: wrap;
  }

  .box {
    width: 100px;
    height: 50px;
    background: rgb(7, 174, 215);
    margin-right: 10px;
    margin-bottom: 10px;
  }

  .boxs {
    width: 100px;
    height: 50px;
    background: rgb(215, 177, 7);
    margin-right: 10px;
    margin-bottom: 10px;
  }
}

.position {
  border: 1px solid red;
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  cursor: pointer;
}
</style>

Demo实现效果

到此这篇关于Vue利用draggable实现多选拖拽效果的文章就介绍到这了,更多相关Vue draggable多选拖拽内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue 左滑删除功能的示例代码

    vue 左滑删除功能的示例代码

    这篇文章主要介绍了vue 左滑删除功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Vue 3.0的attribute强制行为理解学习

    Vue 3.0的attribute强制行为理解学习

    这篇文章主要为大家介绍了Vue 3.0的attribute强制行为理解学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Vue 拦截器对token过期处理方法

    Vue 拦截器对token过期处理方法

    下面小编就为大家分享一篇Vue 拦截器对token过期处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • vue内点击url下载文件的最佳解决方案分享

    vue内点击url下载文件的最佳解决方案分享

    这篇文章主要给大家介绍了关于vue内点击url下载文件的最佳解决方案,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • 详解Vue2 watch监听props的值

    详解Vue2 watch监听props的值

    再次遇到监听子组件收到父组件传过来的值,如果这个值变化,页面中的值发现是不会跟着同步变化的,本文给大家介绍Vue2 watch监听props的值,感兴趣的朋友一起看看吧
    2023-12-12
  • vue控制滚动条滑到某个位置的方法实例

    vue控制滚动条滑到某个位置的方法实例

    当容器有滚动条时,有时需要将滚动条滑到某个位置,下面这篇文章主要给大家介绍了关于vue控制滚动条滑到某个位置的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Vue.js 中的 v-model 指令及绑定表单元素的方法

    Vue.js 中的 v-model 指令及绑定表单元素的方法

    这篇文章主要介绍了Vue.js 中的 v-model 指令及绑定表单元素的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • vue项目实现记住密码到cookie功能示例(附源码)

    vue项目实现记住密码到cookie功能示例(附源码)

    本篇文章主要介绍了vue项目实现记住密码到cookie功能示例(附源码),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • vue2.0构建单页应用最佳实战

    vue2.0构建单页应用最佳实战

    这篇文章主要为大家分享了vue2.0构建单页应用最佳实战案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Vue+Vuex实现自动登录的知识点详解

    Vue+Vuex实现自动登录的知识点详解

    在本篇文章里小编给大家整理的是关于Vue+Vuex实现自动登录的知识点详解,需要的朋友们可以学习下。
    2020-03-03

最新评论