vuedraggable插件实现clone拷贝拖拽案例

<!--  vuedraggable插件实现clone拷贝拖拽案例 -->
<template>
  <div>
    <div class="container">
      <!--
      end 当拖拽结束时触发
      pull: 'clone' 表示允许克隆被拖动的元素
        pull v 拖
      move 自定义控制哪些元素可以拖拽或不允许拖拽
        值为methods中的方法,表示拖拽过程中

      -->
      <div class="box">
        <draggable v-model="arr1" @end="end1" :options="{group: {name: 'itxst', pull: 'clone'}, sort: true}"
                   animation="300" :move="onMove" class="height-100">
          <transition-group tag="div" class="height-100">
            <div :class="item.id === 1? 'item forbid':'item'" v-for="item in arr1" :key="item.id">{{item.name}}</div>
          </transition-group>
        </draggable>

      </div>
      <div class="box">
        <draggable v-model="arr2" @end="end2" group="itxst" animation="300" :move="onMove" class="height-100">
          <transition-group tag="div" class="height-100">
            <div :class="item.id === 12? 'item2 forbid':'item2'" v-for="item in arr2" :key="item.id">{{item.name}}</div>
          </transition-group>
        </draggable>
      </div>
    </div>


  </div>
</template>

<script>

  //导入draggable组件
  import draggable from 'vuedraggable'

  export default {
    name: "Bar",
    components: {
      draggable,
    },
    data() {
      return {
        //定义要被拖拽对象的数组
        arr1: [
          {id: 1, name: 'www.itxst.com(不允许停靠)'},
          {id: 2, name: 'www.jd.com'},
          {id: 3, name: 'www.baidu.com'},
          {id: 5, name: 'www.google.com'},
          {id: 4, name: 'www.taobao.com(不允许拖拽)'}
        ],
        arr2: [
          {id: 11, name: '常用菜单'},
        ],
        moveId: -1
      }
    },
    methods: {
      //左边往右边拖动时的事件
      end1(e) {
        // e是end事件
        // console.log(e);

        // e.newDraggableIndex是被拖拽组件在新分组中的下标
        // console.log(e.newDraggableIndex);

        var that = this;
        var items = that.arr2.filter(function (m) {
          return m.id === that.moveId;
        });

        // 如果左边
        // console.log(items.length);
        if (items.length < 2) return;
        this.arr2.splice(e.newDraggableIndex, 1);
      },
      //右边往左边拖动时的事件
      end2(e) {
        //console.log(e);
        var that = this;
        var items = that.arr1.filter(function (m) {
          return m.id === that.moveId;
        });

        //如果左边
        //console.log(items.length);
        if (items.length < 2) return;
        this.arr1.splice(e.newDraggableIndex, 1)
      },
      //move回调方法
      onMove(e, originalEvent) {
        console.log('onMove e::',e);
        // e.relatedContext 将停靠对象所在上下文
        // e.relatedContext.element 将停靠的对象
        // e.relatedContext.element.id 可获得将停靠的对象的某个属性的值
        this.moveId = e.relatedContext.element.id;

        if(e.relatedContext.element.id ===1) return false; // 返回 false 表示阻止停靠
        // draggedContext 被拖拽的元素
        // draggedContext.element 被拖拽的元素对应的对象
        // draggedContext.element.id 可获得被拖拽的元素对应的对象的某个属性
        if(e.draggedContext.element.id ===4) return false; // 返回 false 表示阻止拖拽
        if(e.draggedContext.element.id ===11) return false; // 返回 false 表示阻止拖拽

      }
    }

  }

  // 判断浏览器是否支持filter函数,如果不支持则自定义一个
  Array.prototype.filter = Array.prototype.filter || function (func) { // filter的参数是个函数
    var arr = this; // filter函数要处理的数组
    var r = [];
    for(var i=0; i<arr.length; i++ ){
      if(func(arr[i], i, arr)){
        r.push(arr[i])
      }
    }
    return r;
  }
</script>

<style scoped lang="less">
  .container {
    display: flex;

    .box {
      width: 300px;
      border: 1px solid #ddd;
      padding: 8px;

      & + .box {
        margin-left: 50px;
      }
    }
  }

  .height-100 {
    height: 100%;
  }

  .item {
    padding: 6px 12px;
    margin: 0px 10px 0px 10px;
    border: solid 1px #eee;
    background-color: #f1f1f1;
    text-align: left;
  }

  .item + .item {
    border-top: none;
    margin-top: 6px;
  }

  .item2 {
    padding: 6px 12px;
    margin: 0px 10px 0px 10px;
    border: solid 1px #eee;
    background-color: pink;
    text-align: left;
  }

  .item2 + .item2 {
    border-top: none;
    margin-top: 6px;
  }
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vuedraggable是一个Vue.js组件,它基于Sortable.js实现了拖放功能,可以轻松地实现拖放排序、拖拽复制、拖放组合和拖放嵌套等功能。下面是实现三列拖拽的示例代码: ```html <template> <div class="container"> <div class="column"> <h3>Column 1</h3> <draggable v-model="list1" :options="{group:{name:'people', pull:'clone', put:false}}"> <div v-for="item in list1" :key="item.id">{{ item.name }}</div> </draggable> </div> <div class="column"> <h3>Column 2</h3> <draggable v-model="list2" :options="{group:{name:'people', pull:false}}"> <div v-for="item in list2" :key="item.id">{{ item.name }}</div> </draggable> </div> <div class="column"> <h3>Column 3</h3> <draggable v-model="list3" :options="{group:{name:'people', pull:false}}"> <div v-for="item in list3" :key="item.id">{{ item.name }}</div> </draggable> </div> </div> </template> <script> import draggable from 'vuedraggable'; export default { components: { draggable }, data() { return { list1: [ {id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}, {id: 3, name: 'Charlie'} ], list2: [], list3: [] } } } </script> <style scoped> .container { display: flex; } .column { flex: 1; margin-right: 20px; } </style> ``` 在这个示例中,我们使用了三个div来表示三列,每一列都包含一个vuedraggable组件来实现拖放排序的功能。第一列的选项可以被拖拽到其他两列,而其他两列的选项不能被拖拽到其他列中。通过设置不同的group属性值,可以实现不同的拖放组合方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值