大数跨境

从零到一:打造可拖拽动态表单低代码生成器

从零到一:打造可拖拽动态表单低代码生成器 索引目录
2024-12-08
2

引言

本文将复盘我在20天内开发一个可拖拽动态表单低代码生成器的全过程,详细记录需求分析、设计思路、开发过程和关键步骤。虽然项目的最终成果可能存在一些细节上的瑕疵(例如拖拽样式优化、输入框组件的后缀样式调整等),但希望通过这篇文章,能给正在开发类似项目的开发者带来一些思路和帮助。

需求背景

客户需求是开发一个低代码的“表单生成器”模块,要求可以通过拖拽生成和配置表单项。具体需求如下:

表单生成器页面

该页面分为上下两部分:

  • 上层:包含标题、首页附页切换、保存功能。

  • 下层:包含表单生成器,分为三个区域:

    • 左侧数据项配置面板:支持模块和子项的增删改,支持拖拽操作。

    • 中间展示面板:实时显示表单效果,支持表单项的拖拽、删除、选中和悬停高亮。

    • 右侧表单项配置面板:展示当前选中表单项的详细配置项。

表单项的类型包括:输入框、单选框、日期选择器、下拉框、表格组件。

表单回显页面

该页面支持数据回填、必填校验、表单项显隐规则、数据提取并保存功能。

心理活动与需求分析

在接到需求的初期,我的心态比较焦虑。时间紧迫、功能复杂,尤其是只有我一个前端负责整个项目的开发。不过,我意识到虽然需求看似庞大,但核心功能并不会太复杂。只要聚焦最基础的功能,其他的附加功能可以在后续迭代中逐步完善。

首先,我需要消化需求并确定开发的技术路线,接着通过研究类似的开源项目,结合自己的技术栈来制定实现方案。

技术选型与方案设计

经过需求分析,我决定参考一些已经实现类似功能的开源项目。最终,我选择了 Vben 开源项目中的表单设计模块作为参考。通过对该模块的深入研究,我明确了以下核心技术方案:

  1. 拖拽实现:使用 VueDraggablePlus 插件来实现拖拽功能。

  2. 数据结构设计:表单由一个 form 对象组成,form 对象包含一个表单项数组。每个表单项有唯一ID,且每个表单项配置具有统一结构,确保可以支持多种类型的表单组件。

通过这种方式,我们能够将表单的各个部分拆解成数据和组件,使得开发流程清晰、易于扩展。

关键步骤

1. 拖拽功能实现

拖拽是本项目的核心交互功能之一。我们使用了 VueDraggablePlus 插件来实现拖拽操作。插件支持三种使用方式:组件方式、函数方式和指令方式。为了简单易懂,本项目使用了 组件方式

通过设置 v-model 来同步数据,拖拽的本质是数据的克隆和排序,因此从左侧面板拖拽表单项到中间面板时,实际上就是修改了数据数组的顺序或向数组中添加新的数据。

 
 
 
<template>  <div class="flex">    <VueDraggable      class="flex flex-col gap-2 p-4 w-300px h-300px m-auto bg-gray-500/5 rounded overflow-auto"      v-model="list1"      animation="150"      ghostClass="ghost"      group="people"      @update="onUpdate"      @add="onAdd"      @remove="remove"    >      <div v-for="item in list1" :key="item.id" class="cursor-move h-30 bg-gray-500/5 rounded p-3">        {{ item.name }}      </div>    </VueDraggable>  </div></template>

这段代码展示了如何将左侧和中间的表单项列表通过 v-forv-model 实现双向绑定。为了避免从中间面板将项目拖拽回左侧,我们设置了拖拽的 group 属性,并指定 pull: 'clone' 使得从左侧拖拽到中间的操作不会影响原数据。

2. 嵌套结构与树形拖拽

左侧的表单项配置面板是树形结构,因此我们需要支持嵌套的拖拽。VueDraggablePlus 插件本身支持嵌套列表的拖拽功能,我们通过 component 自调用实现了树形结构的拖拽。

对于树形数据结构的拖拽,最关键的是确保每个节点的数据结构是统一的,并且在拖拽时能够正确识别父子关系和层级。

3. 数据结构与组件映射

为了实现从左侧拖拽到中间面板显示为表单组件,我们首先需要设计一个清晰的数据结构。数据项数组中的每一项代表一个表单组件,并包含其具体配置。

 
 
 


// 示例数据结构export function createFormConfig(schemas = []) {  return {    inline: true,    "label-position": "right",    "label-width": "200px",    size: "small",    schemas,  // 表单项配置    currentItem: null  // 当前选中的表单项  };}

数据结构设计完成后,接下来就可以通过 v-for 渲染组件,并根据不同的组件类型动态生成表单项。

 
 
 


export const FORM_TYPE_DATE = "display-date";export const FORM_TYPE_RADIO = "display-radio";export const FORM_TYPE_SELECT = "display-select";export const FORM_TYPE_INPUT = "display-input";export const FORM_TYPE_TABLE = "display-table";

在渲染时,通过判断数据项的 componentType 来选择不同的组件。

4. 表单项与配置面板

每个表单项不仅需要在中间面板展示,还需要支持右侧配置面板的交互。当选中一个表单项时,右侧的配置面板会根据该表单项的类型和配置加载相应的配置组件。

例如,当选中一个日期选择器时,配置面板会显示日期格式、是否必填等相关配置项。当选中一个输入框时,配置面板则显示输入框的宽度、占位符等。

5. 数据回显与校验

表单回显的关键是如何将数据与表单项绑定。在此过程中,每个表单项的唯一 ID 能确保数据回填到正确的表单项上。对于必填项,我们通过 el-form-itemerror 属性来展示错误信息。

此外,还需要实现显隐规则和联动功能,这样用户在填写表单时,某些表单项可以根据其他表单项的值来显隐。

6. 表单保存与校验

表单配置完成后,我们需要进行保存操作。在保存时,必须对表单配置进行校验,确保没有遗漏的必填项或格式错误。点击保存时,如果有任何配置错误,会通过弹出提示框向用户显示具体的错误信息。

实现流程总结

通过这次开发,我整理出了完整的实现流程:

  1. 需求分析:了解需求并拆解成具体的功能点。

  2. 技术调研:借鉴开源项目实现,选择适合的技术栈和组件。

  3. 基础框架搭建:先搭建表单生成器的基础框架,确保基本的拖拽、数据绑定和组件渲染能够正常工作。

  4. 功能逐步实现:先处理左侧数据项的增删改、拖拽逻辑,再实现右侧配置面板和表单回显。

  5. 调试与优化:解决表单回显、校验、联动显隐等复杂功能。

  6. 接口联调:确保表单数据能够正确提交并进行接口联调。


总结与反思

通过这次开发,我深刻意识到设计与实现复杂交互功能的挑战,尤其是在时间紧迫的情况下。尽管最终版本的表单生成器仍有很多细节可以优化,但整个开发过程让我学到了很多实用的技术和设计理念,尤其是如何通过拆解需求、借鉴开源项目、逐步实现功能来高效完成复杂的前端任务。

如果你也在开发类似的低代码生成器或表单构建工具,本文中的实现步骤和思路或许会对你有所帮助。


【声明】内容源于网络
0
0
索引目录
索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
内容 444
粉丝 0
索引目录 索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
总阅读12
粉丝0
内容444