我想实现一个可以通过拖动重新排序的列表。列表中的项目将有一些子项目,也可以通过拖动重新排序。
子项不能成为项,项也不能是子项。
这是代码:
var vm = new Vue({
el: "#main",
data: {
list: [
{
name: "item1",
sons: ["sub_item1", "sub_item4"]
},
{
name: "item2",
sons: ["sub_item2"]
},
{
name: "item3",
sons: ["sub_item3"]
},
]
},
});
#main {
text-align: center;
width: 300px;
background-color: #EEE;
padding:10px;
}
.element {
text-align: center;
padding: 10px;
margin: 5px auto;
border-radius: 10px;
color: #FFF;
font-family: sans-serif;
font-weight: bold;
}
.tag {
width: 150px;
background-color: #007BFF;
}
.group {
width: 175px;
border: 3px solid #CED4DA;
background-color: #FFF;
}
.primary {
margin-top: 20px
}
.sub {
width: 100px;
}
/* .sub {
margin-right: 50px;
} */
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.5.2/vue.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/sortablejs@1.7.0/Sortable.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/Vue.Draggable/2.15.0/vuedraggable.min.js"></script>
<div id="main">
<draggable v-model="list" group="group1">
<div v-for="e in list">
<div class="tag element primary">
{{e.name}}
</div>
<draggable v-model="e.sons" group="group2">
<div v-for="son in e.sons" class="tag element sub">
{{son}}
</div>
</draggable>
</div>
</draggable>
{{list}}
</div>
通过运行我的代码,你会发现它可以:
- 通过拖动重新排序项目。
- 通过拖动重新排序属于某个项目的子项目。例如,您可以通过拖动来更改
sub_item1
和的顺序。sub_item4
但它不能sub_item2
拖到item1
. 换句话说,我只希望我的模型list
像这样通过拖动:
list: [
{
name: "item1",
sons: ["sub_item1", "sub_item4", "sub_item2"]
},
{
name: "item2",
sons: []
},
{
name: "item3",
sons: ["sub_item3"]
},
]