使用vue-draggable插件就能实现,简单的效果图,左侧可拖拽组件到设计区,还可修改组件属性

完整代码如下:
点击查看全文
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue Draggable Design Tool</title>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/vue@2.6.1.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/Sortable-1-8-4.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/vuedraggable.umd.2.20.0.js"></script>
<style>
body{
background: white;
}
#app {
display: flex;
justify-content: space-between;
}
.panel {
border: 1px solid black;
margin: 10px;
padding: 10px;
flex-basis: 30%;
}
.component {
border: 1px solid #ccc;
margin-bottom: 4px;
padding: 6px;
cursor: pointer;
background-color: #f9f9f9;
}
.component.dragging {
opacity: 0.5;
}
.design-area {
border: 1px dashed #aaa;
min-height: 300px;
flex-grow: 1;
margin: 10px;
padding: 10px;
}
.properties-area {
flex-basis: 20%;
}
</style>
</head>
<body>
<div id="app">
<div class="panel component-library">
<h4>组件库</h4>
<draggable class="drag-area" :list="components" :group="{name: 'components',pull: 'clone',put: false,sort:false}" :clone="cloneComponent">
<div class="component" v-for="component in components" :key="component.type" >
{{ component.label }}
</div>
</draggable>
</div>
<div class="design-area">
<h4>设计区</h4>
<draggable is="draggable" class="drag-area" v-model="design" group="components" @add="added" style="height:500px">
<div class="component" v-for="comp in design" :key="comp.id" :data-id="comp.id" @click="selectComponent(comp.id)">
{{ comp.label }}
</div>
</draggable>
</div>
<div class="panel properties-area">
<h4>属性</h4>
<div v-if="selectedComponent">
<input type="text" v-model="selectedComponent.label" />
Type: {{ selectedComponent.type }}<br>
Label: {{ selectedComponent.label }}<br>
Id: {{ selectedComponent.id }}<br>
<!-- 这里可以根据选择的组件显示和编辑不同的属性 -->
</div>
<div v-else>
选择一个组件以查看属性
</div>
</div>
</div>
<script>
new Vue({
el: '#app',
components: {
draggable: window['vuedraggable']
},
data: function() {
return {
components: [
{ id: 1, type: 'text', label: '文本' },
{ id: 2, type: 'image', label: '图片' },
{ id: 3, type: 'video', label: '视频' }
],
design: [],
selectedComponent: null,
nextId:100,
}
},
methods: {
added(e){
console.log(e)
},
cloneComponent(original) {
console.log(original)
// 创建组件的克隆并分配一个新的 ID
return {
...original,
id: this.nextId++,
};
},
selectComponent(id) {
console.log(id)
this.selectedComponent = this.design.find(comp => comp.id ===id);
console.log(this.selectedComponent)
}
}
});
</script>
</body>
</html> 网友回复


