Vue拖拽调整元素顺序

Vue中通过拖拽来调整元素的顺序,开发中碰到这个需求,网上找了找资料,写个例子记录下。

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
      [v-cloak]{
        display: none;
      }
      .box1{
        background: #f9f9f9;
        padding: 10px 15px;
      }
      #app{
        width: 30vw;
        margin-left:30vw;
        height: 100vh;
      }
    </style>
  </head>
<body>
  <div id='app' v-cloak>
    <transition-group tag="div" class="">
      <div v-for="(item,index) in list" :key="index" ref="list"
        draggable="true"
        @dragstart="handleDragStart($event, item)"
        @dragover.prevent="handleDragOver($event, item)"
        @dragenter="handleDragEnter($event, item)"
        @dragend="handleDragEnd($event, item)">
        <div class="box1">
          <div class="name">id:{{item.id}}----{{item.name}}</div>
        </div>
      </div>
    </transition-group>
  </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script>
  new Vue({
    el:'#app',
    data:{
      list:[
        {id:'1', name:'张三'},
        {id:'2', name:'李四'},
        {id:'3', name:'王五'},
      ],
      dragging: null,//正在拖拽的 元素
    },
    created(){

    },
    methods: {
      //拖拽相关
      handleDragStart(e,item){
        this.dragging = item;
      },
      handleDragEnd(e,item){
        this.dragging = null
      },
      //首先把div变成可以放置的元素,即重写dragenter/dragover
      handleDragOver(e) {
        e.dataTransfer.dropEffect = 'move'// e.dataTransfer.dropEffect="move";//在dragenter中针对放置目标来设置!
      },
      handleDragEnter(e,item){
        e.dataTransfer.effectAllowed = "move"//为需要移动的元素设置dragstart事件
        if(item === this.dragging){
          return
        }
        const newItems = [...this.list]
        //console.log(newItems)
        const src = newItems.indexOf(this.dragging)
        const dst = newItems.indexOf(item)
        newItems.splice(dst, 0, ...newItems.splice(src, 1))
        this.list = newItems;
      },
 
    },
  })
</script>
</html>

效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值