基于 draggable 实现表单设计器的拖拽功能

1,436 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

通过可视化的形式拖拽组件的生成表单,可以把整个过程进行拆分:

  1. 组件拖拽的实现
  2. 拖拽后如何生成真正的表单项
  3. 表单项的移动、复制、删除等
  4. 表单项各个属性的配置

可拖拽的组件字段如下:

image.png

整个表单设计器的核心部分,就是拖拽功能的实现。

一、拖拽组件的选择:

1、vue draggable :

官方Demo指路(Vue3版本):sortablejs.github.io/vue.draggab…

点击 View code 可跳转到对应代码实现页面 image.png

安装:

yarn add vuedraggable

npm i -S vuedraggable

Vue3:

遇到 Cannot read property 'header' of undefined 的错误是因为没有安装最新版本

npm i -S vuedraggable@next

引入:

import draggable from 'vuedraggable'

2、sortable:

官方指路: www.sortablejs.com/index.html

方法:

npm install sortablejs --save

或者script引入

<script src="../../js/Sortable.min.js"></script>

3、Vue drag resize

特点:轻量,支持拖拽和缩放;支持触摸,对移动端友好。适合有缩放的场景。

二、draggable

在Element-UI el-table中使用 sortabe 较好(也就是用来实现表格的拖拽功能);表单的拖拽使用 vuedraggable 居多,适应大多数应用场景,包括表格的拖拽也有很好的支持,所以在这里我们使用 vuedraggable来实现。

1. 基础功能实现

<draggable 
  v-model="myArray" 
  group="people" 
  @start="drag=true" 
  @end="drag=false" 
  item-key="id">
  <template #item="{element}">
    <div>{{element.name}}</div>
   </template>
</draggable>

export default {
    components: {
        draggable,
    },
    data() {
      return {
        drag: false,
      }
    }
}

常用的参数:

  • :list="state.list" //需要绑定的数组
  • ghost-class="ghost" //被替换元素的样式
  • chosen-class="chosenClass" //选中元素的样式
  • animation="300" //动画效果
  • @start="onStart" //拖拽开始的事件
  • @end="onEnd" //拖拽结束的事件

2. 插槽的使用

使用方式:#item="{element, index}"

Vue.draggable 将迭代列表,item 插槽可以收元素值和元素索引用,于显示列表中的项目。 element为迭代出来的列表中元素, index为元素索引。

所以在这种实现方式中,往往不需要使用 v-for 就可以实现拖拽组件的绘制。

3. vue2 与 vue3 中的差别

vuedraggable 在vue2 与 vue3 中写法会有所不同。vue2中原本是配置项的形式,在 vue3 中一些参数也需要单独进行配置。

以上面的插槽为例,在 Vue2 中的写法:

<draggable v-model="myArray">
   <div v-for="element in myArray" :key="element.id">{{element.name}}</div>
</draggable>