使用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>
网友回复