手把手带你撸一款表单设计器(vue3+elementPlus)

3,569 阅读4分钟

大家好,我是知余,一个入行快1年的前端小菜鸟,这是我的第一篇掘金文章,主要是记录自己在工作中学到的技术,并记录。同时希望这篇文章对有需要的同行,给与一定的启发和帮助。 开发表单设计器之前,你需要对 Vue.Draggable有一定程度的了解。📚

Vue.Draggable.png

Vue.Draggable是一款基于Sortable.js实现的vue拖拽插件。支持移动设备、拖拽和选择文本、智能滚动,可以在不同列表间拖拽、不依赖jQuery为基础、vue 2过渡动画兼容、支持撤销操作,总之是一款非常优秀的vue拖拽组件。本篇将介绍如何搭建环境及简单的例子,使用起来特别简单对被拖拽元素也没有CSS样式的特殊要求。

传送门👉🚪Vue.Draggable官网

传送门👉🚪# vue.draggable中文文档

1.新建Vue项目

vue create form-design-vue

2.目录结构

项目新建完成后,我们对表单设计器的UI原型预设一个大概的结构,按照功能区分,预计分为左侧-表单组件模块中间-展示模块右侧-属性模块,至此可以开始搭建相应的目录。类似⬇️

左中右.png

...
├──src
│   ├──components                          
|       |──formCenter.vue        // 中间展示模块
|       |──formCmpConfig.vue     // 右侧属性模块
│   ├──config                    
|       ├──formCmpConfig.js      // 左侧组件配置        
|   |——formCmpUi                 
|       ├──formCmpUi.vue         // 渲染表单组件模块
│   ├──view                      
|       ├──formDesign.vue        // 表单设计组件
|       ├──formViewer.vue        // 表单展示组件      
...

3.开始书写代码啦!!!🏄

3.1 页面基本结构

image.png (css样式就不贴出来啦,基本实现左中右布局即可,文章结尾会贴出源码地址)

3.2 先实现左侧表单组件( •̀ ω •́ )✧!

想实现左侧的这种形式,我们首先想到的数据类型应该是数组,单独抽离数据到formCmpConfig.js 也是为了代码方便维护。

image.png image.png image.png

数据和样式渲染完毕后,现在我们就要实现拖动了。😆

👉安装并引入Vue.Draggable

npm i -S vuedraggable

image.png

完善formDesign.vue左侧组件代码,这里着重说明一下draggable插件的group属性

🌞gruop

属性描述
namestring组名
puttru/false/function是否允许拖出当前组
pulltrue/false/function是否允许拖入当前组

draggable的中的gruop.name相同,不同的组才可以实现内部数据的拖动 image.png

3.3 完善formDesign.vue

为了保证几个模块之间的数据相互联系且不会出错,我们将中间展示区域的forItemList定义在最外层的formDesign.vue组件,通过Vue的provideinjec将外层formDesign实例传递给每个模块,保证之后每个模块操作的数据是同一个数据。

image.png

3.4 中间展示组件formCenter.vue

我们知道,draggable的中的gruop.name相同,不同的组才可以实现内部数据的拖动,所以formCenter.vue中,核心同样是draggable包裹的一个组,且组名相同,才能实现两个组的拖拽。

image.png image.png

现在我们已经可以实现组件的拖拽了,但还需要编写draggableadd拖拽完成事件,来进行渲染页面UI😵,查阅draggable的官方文档,add事件默认有一个evt对象,里面包含了被拖拽元素的实例。

image.png 生成唯一id原因我相信大家肯定都知道啦!!!😜 现在我们就已经实现了拖拽功能90%了,现在还需要完成组件拖拽的最后一步,渲染对应的UI组件,拖拽功能就做好啦!😎

3.5 formCmpUi渲染表单组件模块

通过传入被拖拽组件的实例的type,渲染对应的UI组件

image.png

image.pngformCenter.vue中引入并注册formCmpUi渲染表单组件模块

image.png 至此,我们的拖拽功能就做完了!!!👏👏👏

3.6 右侧属性配置组件

我分为了表单属性和组件属性两个方面

image.png image.pngformDesign.vue中引入并注册

image.png

一个表单设计的基本功能就实现了,后续就需要完善其他功能,如组件的删除、复制、表单预览等等,这里就不一一展示咯,因为写到这里,那些功能我相信大家都可以写出来😎,如果还有疑问,可以直接去我的仓库下载源码研究。如果感觉篇文章对你有用,请不要吝啬你的👍呀。