更新记录

1.0.3(2025-06-11) 下载此版本

【优化】upload组件支持 http://xxxx/aa/bb/file.jpghttp://xxx/aa/bb?id=xxxx&subfix=jpg两种格式 【新增】upload组件respUrlField字段,用于指定文件上传response对象中url地址字段,默认为 data

1.0.2(2025-06-10) 下载此版本

更新文档

1.0.1(2025-06-10) 下载此版本

更新文档

查看更多

平台兼容性

uni-app

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - × - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - -

其他

多语言 暗黑模式 宽屏模式
× ×

yauee-form-rendering 基于FcDesigner创建的动态表单渲染uniapp端实现

前言

写这个东西缘起于帮朋友做一个调查表,当时看了N多的组件都不好用,最后选用了form-create,但它又不能适配uniapp,当时也想过直接web-view嵌套,但最后被我朋友堵死了这条路:要支持离线,所以才有了它,在经过一番努力后发现,这东西就像一个坑,看着容易,细节太多每一个属性的适配都得花不少功夫, 于是我就想着,既然都做了那就做成开源的算了,慢慢搞吧, 结果今天突然发现uniapp插件市场已经出现了一款了, 虽然我也没有细看他的功能,但是我瞬间又不太想继续深入搞了,总之目前自己够用了,后面看心情,看大家的需求再决定是否继续吧..

  • 关于我的环境、关于技术: 我使用的uniapp/vue3写的,组件也是采用vue3 + ts为基础, 但说实话有时候偷懒,可能没把它的血统搞的那么正,有时候直接用any等等
  • 关于性能: 我已尽量在省事与性能之间衡量过,中间也用了 <component is ..等方式,但毕竟最终是基于 web-view 的,在大量数据面前都是不堪的, 后续如果确需要可以采用分屏加载来优化 , 我自己测试过50个字段的渲染,在一般配置的(3年前的红米手机)基本能秒加载,但如果用了复杂组伯件再嵌套组件就会慢一点了
  • 关于兼容: 我开发测试是 手机 + chrome 配合测试的, 其他小程序没有全面测试过,因为我不用小程序, 已知在微信小程序中有几个样式不兼容,因为我用了 :deep 语法, 如果你们需要可以自行调整,问题不大

【特别说明:】 下方提示的支持情况基本都不打勾是因为我个人没有精力去测试,按常理应该是问题不大,比如微信小程序

关键词

from-renderingFormCreateFcDesigner动态表单JSON表单渲染

一、使用说明


    <!-- 动态表单
        base-path:表单基础路径,用于获取表单配置,一般用于文件上传时 baseUrl 传递
        options:表单配置,表单配置项,用于表单初始化
        rules:表单规则,表单规则项,用于表单验证
        form-data:表单默认数据,用于表单初始化(若不提供v-model,则默认使用form-data)
        header:请求头,一般用于文件上传时 token 传递
        v-model:表单数据,用于表单数据双向绑定回填,一般用于加载后端数据,保存时可以直接通过 @save 获取
        @onSave:表单保存事件回调,组件内部不处理数据发送,需要自行处理
        -->
      <yauee-form-rendering ref="formRef" :options="formDefine.options" :rules="formDefine.fields || formDefine.rules"
        :form-data="formDefine.formData" :base-path="'http://' + settingsStore.config.server" :header="header"
        v-model="formData" @onSave="onSave" v-if="formDefine"></yauee-form-rendering>

数据结构: formDefine

二、目前支持的组件

组件名 名称 说明
input 输入框 含password
textarea 文本域 -
cascader 级联选择 可代替tree,不支持多选
Region 省市联动 自定义组件,需要后端配合
slider 滑块 -
inputNumber 数字输入框 -
checkbox 多选框 -
radio 单选框 -
select 选择框 不支持多选
switch 开关 -
timePicker 时间、日期 多格式
html html渲染 依赖 mp-html
div div容器 -
aTag 标签 -
aAlert 警告提示 -
aImage 图片展示 -
Position 地图定位 自定义组件,需要后端配合,h5不支持
upload 上传组件 回显可能需要改造服务端返回值的处理部分,目前尚未提供接口去配置
fcEditor 富文本编辑器 依赖 sp-editor
tableForm 表格表单 支持动态新增行,但表格内组件不支持复杂组件,避免嵌套太深性能有影响
subForm 分组子表单 支持子组件见下图

tableForm支持子组件:

关于upload上传组件使用:

  • 1、需要后端返回的rules中设置上传的相对地址,如: /${contextPath}/file/upload, 具体方法参照FcDesigner的修改组件默认配置, 结构如下:
    {
        "$required": false,
        "display": true,
        "field": "F4okmakixrfrahc",
        "hidden": false,
        "info": "上传",
        "name": "ref_Frkjmakixrfrajc",
        "props": {
            "action": "/${contextPath}/dev/file/uploadReturnUrl",
            "more":"更多属性略"
        },
        "title": "上传",
        "type": "upload",
        "_fc_drag_tag": "upload",
        "_fc_id": "id_F22ymakixrfraic"
    }
  • 2、需要在使用upload组件时传递basePath, 如: http://${ip:port}/${contenxtPath}, 或者可自行修改 rendering 组件中的 actionPath 部分
  • 3、上传成功后需要后端返回完整的文件路径,如: http://127.0.0.1:8080/upload/images/4okmakixrfrahc.jpg 或者 http://127.0.0.1:8080/upload/images?id=4okmakixrfrahc&suffix=jpg,如果你的地址中不带文件名称加后缀的时候(一些对象存储可能没有),请带上suffix=xxx的文件类型标识,这个是为了编辑时回填数据可以回显之前上传的图片
  • 4、文件上传后端返回的数据可以直接是文件地址,也可以是对象, 如果是对象时,请在upload上指定respUrlField字段(1.0.3版本新增),默认为data,如我使用的:
{
    "code": 200,
    "msg": "操作成功",
    "data": "http://127.0.0.1:82/db-form/file/download?suffix=jpg&id=75322113"
}

特别说明:

  • 1、考虑移动端的性能及页面宽度渲染问题,部分组件没有考虑完全跟PC端兼容,比如aCard组件,在此就不再实现了可考虑用其他的组件替代,比如subForm,很多的复杂组件如 tableForm、subForm、aCard等等都是组件再嵌套组件,甚至无限制嵌套
  • 2、部分组件的部分属性并不完全适配官方PC端属性,比如日期组件的按季度选择等
  • 3、不支持FcDesigner的PC端组件的样式设置,但支持PC端form表单配置的部分属性,表单尺寸大、小,标签宽度,标签左、右对齐等设置,但我还是建议最好是默认,毕竟基于PC端的设置在移动端会出现一些小问题,比如标签宽度设置为 130px,在PC端挺正的,到移动端就会显得很宽了,所以并没有花太多时间去调这玩意了。

三、依赖说明

我已经尽量的减少依赖了,最小情况你可以只使用 wot-design-uni 这一个库, 其他的都只影响个别组件,如果你用不到可以不加:

  • wot-design-uni : 作用基础组件库,部分定制组件也基于该库做定制,例如:级联cascader、地区三级联动region等,推荐以uni_modules引入(感谢作者 不如摸鱼去 :wot-design-uni
  • sp-editor: 富文本编辑器,推荐以uni_modules引入(感谢作者 夏夜追凉丶:富文本编辑器 sp-editor
  • mp-html: 富文本渲染,推荐以uni_modules引入 (感谢作者 jyf:mp-html 富文本组件)
  • @vant/area-data: 省市地区三级联动数据 npm install @vant/area-data
  • 既然都感谢了,自然也不能漏掉了 Form-Creater 的无私奉献, Form-Creater官网
项目依赖图

四、权限依赖

组件中包含地理位置选择,所以需要你在manifest.json中开启定位与地图,并配置高德/百度地图的KEY,不使用可忽略

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

五、入坑说明

  • 暂时没有文档,你只能依靠自己理解代码,但目前看起来只要你理解了form-create官方的相关参数,使用起来应该是问题不大的。
  • 不提供24小时保姆服务,我不靠开源吃饭,你有问题大多数情况靠你自己解决,我只看时间和心情帮忙,没有动手能力的慎入。
  • 我个人不会花太多精力在这上面,测试不能面面俱到,质量问题我不能100%保证,用在哪里怎么用,您自己决定
  • 其他。。我想到了再说

六、土豪这边有专座

虽然我不靠开源吃饭,但豪哥豪弟请我抽包烟舍的,我也是不拒绝的,可能有精力了你恰好需要的话,我也可以陪你唠唠,但这不是交换!!

想请我抽烟的兄弟,首先感谢您的好意,但这并不代表一包烟我就会24小时为你服务,下手前请考虑一下哦,别到时候再来骂我,我就想退给你我还得麻烦一回

七、其他

1、组件中用到的工具类


//  tool.ts

const tool: Record<string, any> = {}

/**
 * 判断值是否为空
 * - null
 * - undefined
 * - NaN
 * - 空字符串 (含全空格)
 * - 空数组
 * - 空对象 (不包含原型链上的属性)
 */
function isNullish(value: unknown): boolean {
    if (value === null || value === undefined) return true;
    if (Number.isNaN(value)) return true;
    if (typeof value === 'string' && value.trim() === '') return true;
    if (Array.isArray(value) && value.length === 0) return true;
    if (value instanceof Object && !Array.isArray(value) && Object.keys(value).length === 0) return true;
    return false;
}

/**
 * 判断值是否非空
 */
function isNotEmpty(value: unknown): boolean {
    return !isNullish(value);
}

/**
 * 如果值为空则返回默认值
 */
function nullable<T, U>(value: T, fallback: U): T | U {
    return isNullish(value) ? fallback : value;
}

function startWith(source: string, str: string) {
    return new RegExp("^" + str).test(source);
}

tool.string = {
    isNullish,
    isNotEmpty,
    nullable,
    startWith
}

export default tool;

2、后端套组件

主要包括 省市三级联动、地理位置选择等,这部分代码嵌套在我其他代码中,现在不想去动它,年纪大了啥都不想动, 就连这个组件我都懒得去git上面搞一下,甚至连个demo都不想写, 如果哪位兄弟实在需要的话,给我点动力到时候我看想办法抽出来吧

3、多图欣赏

隐私、权限声明

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

若使用地理位置组件,则需要开启定位权限

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

插件不采集任何数据

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

许可协议

MIT协议

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问