使用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>
网友回复
如何编写一个chrome插件实现多线程高速下载大文件?
cdn版本的vue在网页中出现typeerror错误无法找到错误代码位置怎么办?
pywebview能否使用webrtc远程控制共享桌面和摄像头?
pywebview6.0如何让窗体接受拖拽文件获取真实的文件路径?
如何在linux系统中同时能安装运行apk的安卓应用?
python有没有离线验证码识别ocr库?
各家的ai图生视频及文生视频的api价格谁最便宜?
openai、gemini、qwen3-vl、Doubao-Seed-1.6在ui截图视觉定位这款哪家更强更准?
如何在linux上创建一个沙箱隔离的目录让python使用?
pywebview如何使用浏览器自带语音识别与webspeech 的api?