更新记录

1.1.0(2026-09-14) 下载此版本

  1. 文档重写:补充完整使用方法、17 种控件说明、Props/Events/方法一览表
  2. 修正 props.js 中 defalut 拼写错误为 default
  3. 修复 formData 默认值类型错误(default: {} 改为工厂函数),避免多实例间数据串扰
  4. 完善组件元数据:displayName、description、keywords
  5. 修复 u-datetime-picker mode 拼写错误(datatimedatetime),showTime 实际生效
  6. 修复 Pcd 省市区控件选择后不回写表单数据的 bug
  7. 修复 UploadImg 上传/删除后不写入表单数据的 bug(之前写到从未被读取的 item.fileList
  8. 修复动态表格内计分组件的崩溃(移除不存在的 collapse_* ref 引用,并增加 columns 缺失保护)
  9. 修复 RadioOther “其他”输入框失焦时把 event 对象写入表单的问题
  10. 修复 Vue2 响应式问题:日期/签名/单位输入/省市区/图片均改用 $set
  11. 修复 Text 控件未配置 questionIndex 时显示 “undefined.” 的样式键拼写错误(lineHightlineHeight
  12. 修复 InputUnit v-model 改单向导致回显失效的问题(同步 RadioOther 的 v-model 调整)
  13. 清理全部调试 console.log
  14. utils.calculateScore 重写:合并多选路径 + 修复权重为 undefined 时 NaN 的隐患 + 修复 value 为 undefined 时崩溃
  15. 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

注意事项

  1. 请先安装 uni-uiuview-plus(或 uView 2.x)并完成注册;使用签名控件需安装 l-signature
  2. linkagetype: 'value' 为精确匹配父项值;type: 'handle' 支持表达式,如 value > 3
  3. 动态表格行的增删需要在父页面监听 updateFormData 同步数据源(示例见使用方法)
  4. Pcd 省市区控件内置 regions.json 数据,无额外依赖

更新日志

1.1.0(2026-09-13)

  • 文档重写:补充完整使用方法、17 种控件说明、Props/Events/方法一览表
  • 修正 props.js 中 defalut 拼写为 default
  • 修复 formData 默认值类型错误(default: {} 改为工厂函数)
  • 完善组件元数据:displayName、description、keywords

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。