+
95
-

回答

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

800_auto

完整代码如下:

点击查看全文

<!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>

网友回复

我知道答案,我要回答