我制作了可拖动的v-autocomplete代码作为jsfidle。
jsfiddle
-
v-select
系列有#selection,它提供了一个类似v-for的模板。
-
每个选择都是一个包含一个元素的列表。
-
因此,设置所有id=index的列表
-
当事件
:move
在里面
<draggable>
,设置当前拖动元素的属性。
-
拖动时(
changed
),将当前元素插入数组
items
精确的指数。
-
并删除旧的。
关键是…可拖动列表
id
是
项目
s
index
.
下面的代码。。。
HTML模板
<div data-app id="app">
<v-autocomplete
v-model="selectedSync"
:items="itemsSync"
chips
multiple
>
<template #selection="data">
<draggable
:id="data.index"
:list="selectedSync"
v-bind="dragOptionsChips"
:move="move"
@change="change"
>
<v-chip
draggable
v-model="selectedSync[data.index]"
:key="data.item"
@mousedown.stop
@click.stop
>
{{data.item}}
</v-chip>
</draggable>
</template>
</v-autocomplete>
</div>
js脚本
new Vue({
vuetify: new Vuetify(),
el: "#app",
data: {
dragged: {
from: -1,
to: -1,
newIndex: -1
},
selectedSync: ['a'],
itemsSync: ['a', 'b', 'c', 'd', 'e']
},
methods: {
move: function(value) {
this.dragged = {
from: parseInt(value.from.id),
to: parseInt(value.to.id),
newIndex: value.draggedContext.futureIndex,
}
},
change: function(value) {
if (value.removed) {
// insert
this.selectedSync.splice(this.dragged.to+this.dragged.newIndex,0, this.selectedSync[this.dragged.from])
// delete
if (this.dragged.from < this.dragged.to) // LTR
this.selectedSync.splice(this.dragged.from, 1)
else // RTL
this.selectedSync.splice(this.dragged.from + 1, 1)
}
}
},
computed: {
dragOptionsChips() {
return {
animation: 200,
group: "group",
disabled: false,
ghostClass: "ghost",
sort: true,
};
}
},
})