为了达到这种效果,您将不得不在多个组件上编排多个事件,并在发生某些事情时从子级向父级发出信号。
我们有 2 个组件参与此操作 - 父组件和可拖动的子组件(具有多个实例)。在父母模板中,我们有以下...
<div id="dropTargetDiv" @drop.prevent="drop" v-on:startIndex="setStartIndex(value)" v-on:targetIndex="setTargetIndex(value)">
<draggable-component v-for="(itemData, index) in dataArray" :itemData="itemData" index="index"/>
</div>
父级也有这些方法...
setStartIndex(value) {
this.startIndex = value;
},
setTargetIndex(value) {
this.targetIndex = value;
},
drop(event) {
this.swapElements(this.startIndex, this.targetIndex);
},
swapElements(start, target) {
// Clone the original array
var newArray = JSON.parse(JSON.stringify(this.dataArray));
// Swap elements
var startElement = newArray[start];
var targetElement = newArray[target];
newArray[target] = startElement;
newArray[start] = targetElement;
// Update the UI
this.dataArray = newArray;
}
在子组件中,在其根元素上,我们有以下...
<div class="draggableItem" draggable="true" @dragstart="$emit('startIndex', this.index)" @dragenter.prevent="$emit('targetIndex', this.index)">
如果您发现目标索引设置不正确,您可能需要将 @dragover.prevent 替换为 @dragover.prevent。
这应该可行 - 欢迎使用 cmets。您需要趴在另一个孩子身上,而不是在他们之间。