更新记录
1.1.0(2026-09-14)
下载此版本
- 文档重写:补充完整使用方法、17 种控件说明、Props/Events/方法一览表
- 修正 props.js 中
defalut 拼写错误为 default
- 修复
formData 默认值类型错误(default: {} 改为工厂函数),避免多实例间数据串扰
- 完善组件元数据:displayName、description、keywords
- 修复 u-datetime-picker mode 拼写错误(
datatime → datetime),showTime 实际生效
- 修复 Pcd 省市区控件选择后不回写表单数据的 bug
- 修复 UploadImg 上传/删除后不写入表单数据的 bug(之前写到从未被读取的
item.fileList)
- 修复动态表格内计分组件的崩溃(移除不存在的
collapse_* ref 引用,并增加 columns 缺失保护)
- 修复 RadioOther “其他”输入框失焦时把 event 对象写入表单的问题
- 修复 Vue2 响应式问题:日期/签名/单位输入/省市区/图片均改用
$set
- 修复 Text 控件未配置 questionIndex 时显示 “undefined.” 的样式键拼写错误(
lineHight → lineHeight)
- 修复 InputUnit
v-model 改单向导致回显失效的问题(同步 RadioOther 的 v-model 调整)
- 清理全部调试 console.log
- utils.calculateScore 重写:合并多选路径 + 修复权重为 undefined 时 NaN 的隐患 + 修复 value 为 undefined 时崩溃
- utils.uuid 改回标准 36 位带连字符格式
1.0.0(2023-06-21)
下载此版本
初次提交
平台兼容性
uni-app(4.45)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
√ |
- |
- |
- |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| - |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(4.45)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| - |
- |
- |
- |
- |
- |
zy-dynamic-form 动态表单组件
基于 uni-forms + uView UI (uview-plus/uview 2.x) 封装的 uni-app 动态表单渲染组件,通过一份 JSON 配置即可渲染整套问卷/调研/信息采集表单,无需手写大量页面代码。
特性
- JSON 驱动:一个
sourceJson 数组配置即可渲染全部表单项
- 17 种控件:单行/多行文本、数字、下拉单选、下拉多选、复选、单选(含"其他"补填)、日期、评分(星级)、计分、开关、省市区、上传图片、手写签名、动态表格、分割线、说明文本
- 计分引擎:勾选计分项后自动汇总分值,支持加/减混合计算,支持动态表格内的计分
- 条件联动:按已选值控制任意表单项的显示/隐藏,支持值匹配与表达式两种模式
- 动态表格:表格内可嵌套任意表单项,行折叠展开、增删行、行标题摘要
- 手写签名:弹出层签名、撤销/清空/保存、签名为空校验
- 表单校验:基于
uni-forms rules 的必填/规则校验,validate() 返回 Promise
- 数据回填:通过
formData 传入已有数据实现编辑回显
支持的控件类型 (item.type)
| type |
说明 |
| Input |
单行文本(可选前/后缀、带单位) |
| Textarea |
多行文本 |
| Number |
数字输入(可选前/后缀) |
| Select |
下拉单选 |
| MultiSelect |
下拉多选 |
| Checkbox |
复选框组 |
| Radio |
单选(选项可配置"其他"补填输入框) |
| Datetime |
年月日选择 |
| Rate |
星级评分(支持半星) |
| Scoring |
计分汇总(自动计算) |
| Switch |
开关 |
| Pcd |
省/市/区三联选择 |
| UploadImg |
图片上传(多图) |
| Signature |
手写签名 |
| Table |
动态表格(内嵌表单项、增删行、折叠) |
| Divider |
分割线(可配置虚线、文案、位置) |
| Text |
说明文本(可配置颜色、字号、背景等) |
使用方法
组件位于 components/zy-dynamic-form/zy-dynamic-form.vue,依赖:
uni-forms(uni-ui)
uview-plus 或 uView 2.x(u-input/u-picker/u-upload/u-icon 等)
l-signature(签名,仅签名控件需要)
<template>
<view>
<zy-dynamic-form
ref="form"
:sourceJson="sourceJson"
:formData="formData"
:scoreIds="scoreIds"
:linkage="linkage"
:num="true"
@updateFormData="onUpdateTableRow"
@updateTableTitle="onUpdateTableTitle"
/>
<u-button text="提交" @click="submit"></u-button>
</view>
</template>
<script>
export default {
data() {
return {
// 表单项配置:每项 {id, type, title, model, rules, options, placeholder, ...}
sourceJson: [
{ id: 1, type: 'Input', title: '姓名', model: 'name', placeholder: '请输入姓名',
rules: [{ required: true, errorMessage: '请输入姓名' }] },
{ id: 2, type: 'Radio', title: '是否有既往病史', model: 'history',
options: [{ label: '无', value: '0' }, { label: '有', value: '1', isOther: true }] },
{ id: 3, type: 'Scoring', title: '总分', model: 'score', correlation: ['q1'] }
],
formData: {}, // 表单数据容器 {name:'', history:'', score:''}
scoreIds: { // 计分项配置:key 为计分关联的表单 model
q1: { items: [...], connector: '+' }
},
linkage: [ // 联动规则:parentModel 值满足条件时显示 model 项
{ model: ['detail'], parentModel: 'history', type: 'value', value: ['1'] }
]
}
},
methods: {
async submit() {
const data = await this.$refs.form.validate();
if (data) {
// data 即表单数据对象
uni.showToast({ title: '校验通过', icon: 'success' });
}
},
// 动态表格增删行时同步数据
onUpdateTableRow({ model, type, rowIndex }) {},
// 动态表格行标题摘要更新
onUpdateTableTitle(parentModel, rows, rowIndex) {}
}
}
</script>
sourceJson 表单项通用字段
| 字段 |
类型 |
说明 |
| id |
Number |
唯一标识 |
| type |
String |
控件类型(见上表) |
| title |
String |
标题 |
| questionIndex |
Number |
序号(配合 num 显示 "1.标题") |
| model |
String |
数据字段名(formData 的 key) |
| placeholder |
String |
占位提示 |
| rules |
Array |
uni-forms 校验规则 |
| options |
Array |
选项 {label, value, isOther?} |
| isUnit / prefix / suffix |
- |
带单位输入框配置 |
| correlation |
Array |
Scoring:关联计分的表单 model 列表 |
| linkage 相关 |
- |
由独立的 linkage 数组配置 |
Props 说明
| Prop |
类型 |
说明 |
| sourceJson |
Array |
表单配置数据源(必填) |
| formData |
Object |
表单数据容器(必填,编辑回填时传入已有数据) |
| scoreIds |
Object |
计分组件配置(必填,无计分可传 {}) |
| linkage |
Array |
联动规则(必填,无联动可传 []) |
| num |
Boolean |
是否显示标题序号,默认 true |
Events
| 事件 |
参数 |
说明 |
| updateFormData |
{model, type, rowIndex} |
动态表格增/删行时触发,用于父页面同步数据 |
| updateTableTitle |
(parentModel, rows, rowIndex) |
表格行标题摘要变化时触发 |
方法
| 方法 |
说明 |
| validate() |
提交校验,校验通过返回 Promise<formData>,失败返回 Promise.reject |
注意事项
- 请先安装
uni-ui 与 uview-plus(或 uView 2.x)并完成注册;使用签名控件需安装 l-signature
linkage 中 type: 'value' 为精确匹配父项值;type: 'handle' 支持表达式,如 value > 3
- 动态表格行的增删需要在父页面监听
updateFormData 同步数据源(示例见使用方法)
Pcd 省市区控件内置 regions.json 数据,无额外依赖
更新日志
1.1.0(2026-09-13)
- 文档重写:补充完整使用方法、17 种控件说明、Props/Events/方法一览表
- 修正 props.js 中
defalut 拼写为 default
- 修复
formData 默认值类型错误(default: {} 改为工厂函数)
- 完善组件元数据:displayName、description、keywords