console
<!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
},
handleDragOver(e) {
e.dataTransfer.dropEffect = 'move'
},
handleDragEnter(e,item){
e.dataTransfer.effectAllowed = "move"
if(item === this.dragging){
return
}
const newItems = [...this.list]
const src = newItems.indexOf(this.dragging)
const dst = newItems.indexOf(item)
newItems.splice(dst, 0, ...newItems.splice(src, 1))
this.list = newItems;
},
},
})
</script>
</html>