1
0
mirror of https://github.com/sahadev/vue-component-creater-ui.git synced 2025-06-07 13:44:06 +08:00
2021-12-08 18:59:04 +08:00

89 lines
1.9 KiB
Vue

<template>
<draggable class="dragArea" tag="ul" :list="data" @start="onStartDrag" @choose="onClick"
@end="onEndDrag">
<template #item="{ element }">
<li class="itemArea">
<p>{{ getRawComponentKey(element) }}</p>
<nested-draggable :data="getRawComponentContent(element).__children" />
</li>
</template>
</draggable>
</template>
<script>
import draggable from "vuedraggable";
import { getRawComponentKey, getRawComponentContent } from "@/utils/common";
export default {
props: {
data: {
required: true,
type: Array
}
},
data() {
return {
}
},
computed: {
},
methods: {
getRawComponentKey,
getRawComponentContent,
onStartDrag(event) {
event.item.classList.add("is-dragging");
},
onClick(event) {
if(this.$store.state.currentEditComp){
this.$store.state.currentEditComp.item.classList.remove("is-dragging");
}
event.item.classList.add("is-dragging");
event.vccData = getRawComponentContent(this.data[event.oldIndex]);
this.$store.commit('storeCurrentEditComp', event);
},
onEndDrag(event) {
event.item.classList.remove("is-dragging");
this.$store.commit('onDragEnd');
}
},
components: {
draggable
},
name: "nested-draggable"
};
</script>
<style scoped lang="scss">
.dragArea {
min-height: 20px;
border: 1px dashed rgb(126, 126, 128);
border-radius: 5px;
padding-inline-start: 30px;
padding-right: 2px;
padding-bottom: 2px;
}
p {
margin: 10px 0;
}
.itemArea {
min-height: 20px;
border: 1px dashed rgb(126, 126, 128);
padding-right: 2px;
padding-bottom: 2px;
border-radius: 5px;
padding-inline-start: 10px;
margin: 10px 0 0;
}
.is-dragging {
background-color: rgba(106, 127, 233, 0.274);
border: 1px dashed rgb(73, 100, 241);
-webkit-border-radius: 5px;
border-radius: 5px;
}
</style>