Vue动态表单结合Element Plus通过JSON Schema配置驱动UI渲染,利用动态挂载组件、自动初始化响应式model与rules,并支持栅格布局和插槽扩展。

Vue 动态表单结合 Element Plus 实现动态渲染,核心在于用配置驱动 UI,而不是写死模板。关键不是“能不能”,而是“怎么组织配置、怎么绑定数据、怎么处理校验和布局”。下面从实操角度拆解几个必须理清的环节。
用 JSON Schema 定义表单项结构
每个字段不再硬编码为 <el-input></el-input> 或 <el-select></el-select>,而是抽象成一个对象:
- field:唯一字段名,用于 model 和 rules 绑定
- label:表单项标签文字
-
component:指定渲染哪个 Element Plus 组件(如
"Input"、"Select"、"DatePicker") -
componentProps:透传给组件的属性,比如
{ clearable: true, placeholder: "请选择日期" } -
options:仅 Select/Checkbox/Radio 类型需要,是
{ label, value }数组 -
rules:校验规则数组,直接交给
<el-form :rules></el-form>
用 <component :is></component> 渲染对应组件
Vue3 的 <component :is></component> 是动态渲染的基石。配合映射表把字符串组件名转为真实组件引用:
审查 Vue 管理后台的变更请求(Vue 2 + Element UI,Vue 3 + Element Plus)。重点关注最小化变更实现、上线风险检查以及回归检查清单生成。
- 提前建立组件映射:
const components = { Input: ElInput, Select: ElSelect, DatePicker: ElDatePicker } - 在模板中:
<component :is="components[item.component]" v-model="formModel[item.field]" v-bind="item.componentProps"></component> - 对
Select这类含子项的组件,需内嵌<el-option></el-option>循环,且只在 component 为 Select 时生效
自动初始化 model 并响应式联动
不需要手动声明 ref({ username: '', deptId: '' })。从 schema 自动推导初始值:
- 遍历所有 schema 字段,用
field作 key,空字符串 / null / [] 作默认值(按类型区分) - 用
reactive({})包裹生成formModel,确保响应式 - rules 同样从 schema 提取并合并为一个对象:
{ username: [...], deptId: [...] },直接传给<el-form :rules></el-form>
支持栅格布局与插槽扩展
Element Plus 的 <el-row>/<el-col></el-col></el-row> 可无缝接入动态逻辑:
- 每个 schema 项可带
colProps,如{ span: 12, xs: { span: 24 } },直接绑定到<el-col v-bind="item.colProps"></el-col> - 支持 slot 扩展:当 schema 中有
slot: "custom-username",优先渲染<slot name="custom-username" :model="formModel"></slot>,覆盖默认组件 - 这样既能统一管理基础字段,又保留定制入口,比如密码强度提示、城市级联选择器等复杂场景
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









