如何设计一个真正可扩展的表单生成器?

🧩 如何设计一个真正可扩展的表单生成器?

🧠 你写过多少次 CRUD 表单?登录表单、搜索表单、配置表单、后台管理表单......

有没有想过:为什么不抽象成一套"表单引擎"?

封装一个可以扩展的表单生成器,尤其是对一些中后台系统、低代码平台、企业级项目,会非常有价值。


🚀 一、从"写表单"到"设计表单系统"

我们先看一个普通的表单:

js 复制代码
<el-form :model="form">
  <el-form-item label="用户名">
    <el-input v-model="form.username" />
  </el-form-item>

  <el-form-item label="年龄">
    <el-input-number v-model="form.age" />
  </el-form-item>
</el-form>

问题在哪?

  • ❌ 每个页面都写一遍
  • ❌ 字段变化要改代码
  • ❌ 无法动态生成
  • ❌ 后端配置驱动做不了

这时候我们会思考一个问题:

能不能用 JSON 描述表单?


📦 二、Schema 驱动:表单的核心抽象

理想状态是这样:

js 复制代码
const schema = [
  {
    type: 'input',
    label: '用户名',
    field: 'username',
    props: {
      placeholder: '请输入用户名'
    }
  },
  {
    type: 'number',
    label: '年龄',
    field: 'age',
  }
]

然后我们写一个 <SchemaForm />

js 复制代码
<SchemaForm :schema="schema" v-model="formData" />

这就是:

Schema Driven UI(配置驱动 UI)


🧠 三、设计表单生成器的核心架构

一个成熟的表单生成系统,至少包含 5 个层次:

markdown 复制代码
Schema 配置层
      ↓
字段解析层
      ↓
组件映射层
      ↓
状态管理层
      ↓
渲染引擎层

我们逐层拆解。


🧩 四、组件映射系统设计(核心关键)

最重要的一步:

type → 组件映射

js 复制代码
const componentMap = {
  input: ElInput,
  number: ElInputNumber,
  select: ElSelect,
}

渲染逻辑:

js 复制代码
const Component = componentMap[item.type]

return h(Component, {
  ...item.props,
  modelValue: formData[item.field],
  'onUpdate:modelValue': (val) => {
    formData[item.field] = val
  }
})

这样我们就实现了:

  • ✅ 动态组件渲染
  • ✅ 双向绑定
  • ✅ 可扩展组件类型

🧱 五、真正高级的地方:扩展能力设计

一个"玩具级"表单生成器和一个"工程级"的区别在于:

可扩展能力

必须支持:

1️⃣ 动态显隐

js 复制代码
{
  type: 'input',
  field: 'company',
  visible: (form) => form.role === 'admin'
}

解析时:

js 复制代码
if (typeof item.visible === 'function') {
  return item.visible(formData)
}

2️⃣ 联动机制

js 复制代码
{
  type: 'select',
  field: 'province',
  onChange: (val, form) => {
    form.city = ''
  }
}

3️⃣ 异步字段(远程选项)

js 复制代码
{
  type: 'select',
  field: 'user',
  asyncOptions: () => fetchUserList()
}

4️⃣ 插槽扩展

js 复制代码
<SchemaForm>
  <template #customField="{ field }">
    <MyCustomComponent />
  </template>
</SchemaForm>

🧠 六、状态管理怎么设计才优雅?

很多人会这样写:

js 复制代码
const formData = reactive({})

但在复杂场景中:

  • 校验
  • dirty 状态
  • touched 状态
  • 提交状态
  • 异步 loading

你需要抽象出一个 FormStore

js 复制代码
class FormStore {
  values = reactive({})
  errors = reactive({})
  touched = reactive({})

  setFieldValue(field, value) {
    this.values[field] = value
  }

  validate() {}
}

⚙️ 七、企业级表单生成器的高级能力

真正成熟的系统会支持:

能力 说明
嵌套表单 object / array 结构
动态增删字段 表单列表
表单分组 step 表单
表单布局系统 grid / col 配置
表单 JSON 导出 支持保存配置
拖拽编辑器 低代码场景
远程 schema 后端下发表单配置

🔥 八、进阶认知:为什么很多大厂都在做 Schema Form?

原因很简单:

  • 后端驱动 UI
  • 多系统复用
  • 业务快速迭代
  • 统一规范
  • 降低重复开发成本

Ant Design Pro、阿里飞冰、字节内部平台,核心都在做这件事。


🧠 九、总结:表单生成器的本质是什么?

不是为了"少写代码"。

而是:

把 UI 抽象成数据

把行为抽象成规则

把渲染抽象成引擎

相关推荐
QQ1__8115175151 小时前
Spring boot名城小区物业管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
钛态1 小时前
前端微前端架构:大项目的救命稻草还是自找麻烦?
前端·vue·react·web
一粒黑子1 小时前
【实战解析】阿里开源 PageAgent:纯前端 GUI Agent,一行JS让网页支持自然语言操控
前端·javascript·开源
独角鲸网络安全实验室1 小时前
2026微信小程序抓包全解析:从实操落地到合规风控,解锁前端调试新范式
前端·微信小程序·小程序·抓包·系统代理绕过·https证书严格校验·进程隔离
紫微AI1 小时前
前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了
前端·人工智能·typescript
GISer_Jing1 小时前
AI前端(From豆包)
前端·aigc·ai编程
IT枫斗者1 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
测试修炼手册1 小时前
[测试技术] 深入理解 JSON Web Token (JWT)
前端·json
AI老李1 小时前
2026 年 Web 前端开发的 8 个趋势!
前端
里欧跑得慢1 小时前
15. Web可访问性最佳实践:让每个用户都能平等访问
前端·css·flutter·web