test:可拖拽组件测试

This commit is contained in:
lhj
2024-07-30 23:33:08 +08:00
parent 9306a02d1e
commit 0c148a6401
7 changed files with 541 additions and 60 deletions

View File

@ -0,0 +1,33 @@
<template>
<div>
<!-- 左侧组件列表 -->
<div class="left">
<div
class="left-item"
v-for="item in list1"
:key="item.code"
draggable
>
{{ item.name }}
</div>
</div>
<!-- 画布区域 -->
<div class="targetContent" ref="targetContent">
<div
class="item"
v-for="item in list2"
:key="item.id"
:ref="item.id"
:style="{
top: `${item.top - 16}px`,
left: `${item.left - 85}px`,
'z-index': `${item.zIndex}`
}"
>
<template v-if="item.code === 'MyInput'">
<a-input></a-input>
</template>
</div>
</div>
</div>
</template>

View File

@ -0,0 +1,22 @@
<template>
<div style="background: lightgreen; height: 100%; padding: 10px;">
组件2内容
<div v-if="$slots.default" class="slot-area">
<slot></slot>
</div>
</div>
</template>
<script>
export default {
name: 'MyComponent2'
}
</script>
<style scoped>
.slot-area {
border: 2px dashed grey;
min-height: 50px;
margin-top: 10px;
}
</style>

View File

@ -0,0 +1,22 @@
<template>
<div style="background: lightcoral; height: 100%; padding: 10px;">
组件3内容
<div v-if="$slots.default" class="slot-area">
<slot></slot>
</div>
</div>
</template>
<script>
export default {
name: 'MyComponent3'
}
</script>
<style scoped>
.slot-area {
border: 2px dashed grey;
min-height: 50px;
margin-top: 10px;
}
</style>

View File

@ -1,58 +1,81 @@
<template>
<a-row style="padding: 20px">
<a-col span="10">
<h3>列表区域</h3>
<draggable
class="dragArea list-group"
:list="list1"
:sort="false"
:group="{ name: 'people', pull: 'clone', put: false }"
>
<div class="list-group-item" v-for="element in list1" :key="element.name" >
{{ element.name }}
</div>
</draggable>
</a-col>
<a-col span="10" offset="4">
<h3>目标区域</h3>
<draggable
class="dragArea list-group"
:list="list2"
group="people"
>
<div class="list-group-item" v-for="element in list2" :key="element.name" >
{{ element.name }}
</div>
</draggable>
</a-col>
</a-row>
<div style="display: flex;">
<section v-draggable="[
list1,
{
animation: 150,
group: {
name: 'people',
pull: 'clone',
put: false
},
sort: false,
clone
}
]">
<div v-for="item in list1" :key="item.id" style="border: 1px solid green;margin: 5px;">
{{ item.name }}
</div>
</section>
<section v-draggable="[
list2,
{
animation: 150,
group: 'people'
}
]">
<div v-for="item in list2" :key="item.id" style="border: 1px solid red;margin: 5px;">
{{ item.name }}
</div>
</section>
</div>
<div>
<div>
{{ list1 }}
</div>
<div>
{{ list2 }}
</div>
</br>
</div>
</template>
<script>
import { VueDraggableNext } from 'vue-draggable-next'
export default {
components: {
draggable:VueDraggableNext
<script setup lang="ts">
import { ref } from 'vue'
import { uuid } from 'lsp-uuid'
import { vDraggable } from 'vue-draggable-plus'
const list1 = ref([
{
name: 'Joao',
id: '1'
},
data() {
return {
list1: [
{ name: "组件1", id: 1 },
{ name: "组件2", id: 2 },
{ name: "组件3", id: 3 },
{ name: "组件4", id: 4 }
],
list2: [
{ name: "画布组件1", id: 5 },
{ name: "画布组件2", id: 6 },
{ name: "画布组件3", id: 7 }
]
};
{
name: 'Jean',
id: '2'
},
{
name: 'Johanna',
id: '3'
},
{
name: 'Juan',
id: '4'
}
])
const list2 = ref(
list1.value.map(item => ({
name: `${item.name}-2`,
id: `${item.id}-2`
}))
)
function clone(element: Record<'name' | 'id', string>) {
const len = list2.value.length
return {
name: `${element.name}-clone-${len}`,
id: `${element.id}-clone-${uuid()}`
}
};
</script>
<style scoped>
.list-group-item {
height: 30px;
border: 1px solid #888888;
}
</style>
</script>