@hzab/form-render 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,233 @@
1
+ # @hzab/form-render
2
+
3
+ formily schema 表单渲染组件
4
+
5
+ # 组件
6
+
7
+ ## 示例
8
+
9
+ ```jsx
10
+ import FormRender from "@hzab/form-render";
11
+
12
+ // testSchema 为 formily 生成的 schema json
13
+ <FormRender schema={testSchema} />;
14
+ ```
15
+
16
+ #### 组件远程数据
17
+
18
+ - 使用 schemaScope 传入全局配置变量,在响应器的动作响应中调用
19
+
20
+ ```jsx
21
+ // schema
22
+ {
23
+ "form": {
24
+ "labelCol": 6,
25
+ "wrapperCol": 12
26
+ },
27
+ "schema": {
28
+ "type": "object",
29
+ "properties": {
30
+ "parentId": {
31
+ "type": "string",
32
+ "title": "上级菜单",
33
+ "x-decorator": "FormItem",
34
+ "x-component": "TreeSelect",
35
+ "x-validator": [],
36
+ "x-component-props": {},
37
+ "x-decorator-props": {},
38
+ "x-reactions": {
39
+ "fulfill": {
40
+ "run": "fetchMenuTree($self);"
41
+ }
42
+ },
43
+ "name": "parentId",
44
+ "x-designable-id": "i012z5nbd5z",
45
+ "x-index": 0
46
+ }
47
+ }
48
+ }
49
+ }
50
+
51
+ // formRender
52
+ <FormRender
53
+ schema={testSchema}
54
+ schemaScope={{
55
+ fetchMenuTree(field) {
56
+ // 模拟请求
57
+ setTimeout(() => {
58
+ // field 目标组件的 配置参数
59
+ // 通过 field.component[1] 可以动态配置目标组件的 props
60
+ // 树选择器 数据源
61
+ field.component[1].treeData = [{ value: 1, label: 1 }];
62
+ }, 1000)
63
+ },
64
+ }}
65
+ />
66
+ ```
67
+
68
+ #### 自定义组件
69
+
70
+ - 使用 components 传入自定义组件,在 schema 中 x-component 配置对应的组件名称
71
+
72
+ ```jsx
73
+ // schema
74
+ {
75
+ "form": {
76
+ "labelCol": 6,
77
+ "wrapperCol": 12
78
+ },
79
+ "schema": {
80
+ "type": "object",
81
+ "properties": {
82
+ "parentId": {
83
+ "type": "string",
84
+ "title": "图标选择器",
85
+ "x-decorator": "FormItem",
86
+ "x-component": "IconSelect",
87
+ "x-validator": [],
88
+ "x-component-props": {},
89
+ "x-decorator-props": {},
90
+ "x-reactions": {},
91
+ "name": "parentId",
92
+ "x-designable-id": "i012z5nbd5z",
93
+ "x-index": 0
94
+ }
95
+ }
96
+ }
97
+ }
98
+
99
+ // formRender
100
+ <FormRender
101
+ schema={testSchema}
102
+ components={{
103
+ // 自定义组件
104
+ IconSelect() {
105
+ return "IconSelect";
106
+ },
107
+ }}
108
+ />
109
+ ```
110
+
111
+ ## API
112
+
113
+ ### InfoPanel Attributes
114
+
115
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
116
+ | ------------- | ------- | ---- | ---------- | -------------------------------------- | --- |
117
+ | schema | Object | 是 | - | 数据信息的 schema |
118
+ | schemaScope | Object | 否 | - | 全局作用域,用于实现协议表达式变量注入 | |
119
+ | layout | Object | 否 | horizontal | 表单布局,horizontal vertical \ inline |
120
+ | initialValues | Object | 否 | - | form 初始值 |
121
+ | components | Object | 否 | - | 自定义组件 |
122
+ | formOptions | Object | 否 | - | createForm 的参数 |
123
+ | disabled | boolean | 否 | - | 禁用状态 |
124
+ | readOnly | boolean | 否 | - | 只读状态 |
125
+
126
+ ### 方法 Methods
127
+
128
+ | 名称 | 参数 | 说明 |
129
+ | ---- | --------- | -------------- |
130
+ | init | form 实例 | 组件初始化执行 |
131
+
132
+ ### Schema
133
+
134
+ - 使用 表单编辑器生成:https://designable-antd.formilyjs.org/
135
+
136
+ ```json
137
+ {
138
+ "form": {
139
+ "labelCol": 6,
140
+ "wrapperCol": 12
141
+ },
142
+ "schema": {
143
+ "type": "object",
144
+ "properties": {
145
+ // 参数 key
146
+ "parentId": {
147
+ "type": "string",
148
+ // 参数 label
149
+ "title": "上级菜单",
150
+ "x-decorator": "FormItem",
151
+ // 渲染的组件
152
+ "x-component": "TreeSelect",
153
+ // 组件校验
154
+ "x-validator": [],
155
+ // 组件配置
156
+ "x-component-props": {
157
+ "virtual": true,
158
+ "allowClear": true,
159
+ "showSearch": true
160
+ },
161
+ // 容器配置
162
+ "x-decorator-props": {},
163
+ // 响应器
164
+ "x-reactions": {
165
+ // 依赖字段
166
+ "dependencies": [
167
+ {
168
+ "property": "value",
169
+ "type": "any"
170
+ }
171
+ ],
172
+ // 响应动作
173
+ "fulfill": {
174
+ // 属性响应,只支持 JS 表达式
175
+ "state": {
176
+ "visible": "{{$deps.menuType === \"C\" || $deps.menuType === \"F\"}}"
177
+ },
178
+ // 动作响应,支持 JS 语句
179
+ "run": "fetchMenuTree($self);"
180
+ }
181
+ },
182
+ // 参数 key
183
+ "name": "parentId",
184
+ // 组件在编辑器中的 ID(必须唯一)
185
+ "x-designable-id": "i012z5nbd5z",
186
+ // 组件在表单中的顺序(必须唯一)
187
+ "x-index": 0,
188
+ // 是否在 table 中展示,目前需要手动添加配置
189
+ "inTable": false
190
+ }
191
+ }
192
+ }
193
+ }
194
+ ```
195
+
196
+ # 组件开发流程
197
+
198
+ - 在 config/webpack.config/webpack.config.dev.js 中按需修改 alias 配置的包名,便于本地调试
199
+ - 在 example/typings.d.ts 中按需修改 declare module 配置的包名,解决 ts 报错问题
200
+ - npm run dev
201
+
202
+ ## 文件目录
203
+
204
+ - example 本地测试代码
205
+ - src 组件源码
206
+ - lib 组件打包编译后的代码
207
+
208
+ ## 命令
209
+
210
+ - 本地运行:npm run dev
211
+ - 测试环境打包编译:npm run build-flow-dev
212
+ - 生产环境打包编译:npm run build
213
+
214
+ ## 发布
215
+
216
+ - 在 config/webpack.config/webpack.config.prod.js 中按需修改 entry 配置的文件名
217
+ - 编译组件:npm run build
218
+ - 命令:npm publish --access public
219
+ - 发布目录:
220
+ - lib
221
+ - src
222
+
223
+ ## 配置
224
+
225
+ ### 配置文件
226
+
227
+ - 本地配置文件:config/global-config/config.local.js
228
+ - 测试环境配置文件:config/global-config/config.flowDev.js
229
+ - 生产环境配置文件:config/global-config/config.production.js
230
+
231
+ ### webpack 配置文件
232
+
233
+ - config/webpack.config.js
package/lib/index.js ADDED
@@ -0,0 +1 @@
1
+ !function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r(require("@formily/antd"),require("@formily/core"),require("@formily/react"),require("antd"),require("react")):"function"==typeof define&&define.amd?define(["@formily/antd","@formily/core","@formily/react","antd","react"],r):"object"==typeof exports?exports["form-render"]=r(require("@formily/antd"),require("@formily/core"),require("@formily/react"),require("antd"),require("react")):e["form-render"]=r(e["@formily/antd"],e["@formily/core"],e["@formily/react"],e.antd,e.react)}(self,((e,r,t,n,o)=>(()=>{"use strict";var a={45:(e,r,t)=>{t.d(r,{Z:()=>c});var n=t(81),o=t.n(n),a=t(645),i=t.n(a)()(o());i.push([e.id,"",""]);const c=i},645:e=>{e.exports=function(e){var r=[];return r.toString=function(){return this.map((function(r){var t="",n=void 0!==r[5];return r[4]&&(t+="@supports (".concat(r[4],") {")),r[2]&&(t+="@media ".concat(r[2]," {")),n&&(t+="@layer".concat(r[5].length>0?" ".concat(r[5]):""," {")),t+=e(r),n&&(t+="}"),r[2]&&(t+="}"),r[4]&&(t+="}"),t})).join("")},r.i=function(e,t,n,o,a){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(n)for(var c=0;c<this.length;c++){var u=this[c][0];null!=u&&(i[u]=!0)}for(var l=0;l<e.length;l++){var s=[].concat(e[l]);n&&i[s[0]]||(void 0!==a&&(void 0===s[5]||(s[1]="@layer".concat(s[5].length>0?" ".concat(s[5]):""," {").concat(s[1],"}")),s[5]=a),t&&(s[2]?(s[1]="@media ".concat(s[2]," {").concat(s[1],"}"),s[2]=t):s[2]=t),o&&(s[4]?(s[1]="@supports (".concat(s[4],") {").concat(s[1],"}"),s[4]=o):s[4]="".concat(o)),r.push(s))}},r}},81:e=>{e.exports=function(e){return e[1]}},379:e=>{var r=[];function t(e){for(var t=-1,n=0;n<r.length;n++)if(r[n].identifier===e){t=n;break}return t}function n(e,n){for(var a={},i=[],c=0;c<e.length;c++){var u=e[c],l=n.base?u[0]+n.base:u[0],s=a[l]||0,f="".concat(l," ").concat(s);a[l]=s+1;var p=t(f),m={css:u[1],media:u[2],sourceMap:u[3],supports:u[4],layer:u[5]};if(-1!==p)r[p].references++,r[p].updater(m);else{var d=o(m,n);n.byIndex=c,r.splice(c,0,{identifier:f,updater:d,references:1})}i.push(f)}return i}function o(e,r){var t=r.domAPI(r);t.update(e);return function(r){if(r){if(r.css===e.css&&r.media===e.media&&r.sourceMap===e.sourceMap&&r.supports===e.supports&&r.layer===e.layer)return;t.update(e=r)}else t.remove()}}e.exports=function(e,o){var a=n(e=e||[],o=o||{});return function(e){e=e||[];for(var i=0;i<a.length;i++){var c=t(a[i]);r[c].references--}for(var u=n(e,o),l=0;l<a.length;l++){var s=t(a[l]);0===r[s].references&&(r[s].updater(),r.splice(s,1))}a=u}}},569:e=>{var r={};e.exports=function(e,t){var n=function(e){if(void 0===r[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(e){t=null}r[e]=t}return r[e]}(e);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(t)}},216:e=>{e.exports=function(e){var r=document.createElement("style");return e.setAttributes(r,e.attributes),e.insert(r,e.options),r}},565:(e,r,t)=>{e.exports=function(e){var r=t.nc;r&&e.setAttribute("nonce",r)}},795:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var r=e.insertStyleElement(e);return{update:function(t){!function(e,r,t){var n="";t.supports&&(n+="@supports (".concat(t.supports,") {")),t.media&&(n+="@media ".concat(t.media," {"));var o=void 0!==t.layer;o&&(n+="@layer".concat(t.layer.length>0?" ".concat(t.layer):""," {")),n+=t.css,o&&(n+="}"),t.media&&(n+="}"),t.supports&&(n+="}");var a=t.sourceMap;a&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),r.styleTagTransform(n,e,r.options)}(r,e,t)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(r)}}}},589:e=>{e.exports=function(e,r){if(r.styleSheet)r.styleSheet.cssText=e;else{for(;r.firstChild;)r.removeChild(r.firstChild);r.appendChild(document.createTextNode(e))}}},54:r=>{r.exports=e},563:e=>{e.exports=r},505:e=>{e.exports=t},721:e=>{e.exports=n},156:e=>{e.exports=o}},i={};function c(e){var r=i[e];if(void 0!==r)return r.exports;var t=i[e]={id:e,exports:{}};return a[e](t,t.exports,c),t.exports}c.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return c.d(r,{a:r}),r},c.d=(e,r)=>{for(var t in r)c.o(r,t)&&!c.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},c.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.nc=void 0;var u={};return(()=>{c.r(u),c.d(u,{default:()=>q});var e={};function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function t(e){var t=function(e,t){if("object"!==r(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!==r(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===r(t)?t:String(t)}function n(e,r,n){return(r=t(r))in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,e}c.r(e),c.d(e,{Text:()=>b});var o=c(156),a=c.n(o),i=c(563),l=c(505),s=c(54),f=c(721);function p(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var m=["value","mode","content","className"];function d(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function y(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?d(Object(t),!0).forEach((function(r){n(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):d(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}const b=(0,l.connect)((function(e){var r=e.value,t=e.mode,n=e.content,o=e.className,i=p(e,m),c="normal"!==t&&t?t:"div";return console.log("props",i.readOnly),a().createElement(c,y({className:"formily-text ".concat(o)},i),r||n)}),(0,l.mapProps)((function(e,r){return y(y({},e),{},{form:r.form,field:r})})));var v=c(379),h=c.n(v),O=c(795),S=c.n(O),g=c(569),j=c.n(g),P=c(565),x=c.n(P),w=c(216),T=c.n(w),C=c(589),E=c.n(C),F=c(45),k={};k.styleTagTransform=E(),k.setAttributes=x(),k.insert=j().bind(null,"head"),k.domAPI=S(),k.insertStyleElement=T();h()(F.Z,k);F.Z&&F.Z.locals&&F.Z.locals;function N(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function I(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?N(Object(t),!0).forEach((function(r){n(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):N(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}const q=(0,o.forwardRef)((function(r,t){var n=(0,o.useCallback)((0,l.createSchemaField)({components:I(I({Space:s.Space,FormGrid:s.FormGrid,FormLayout:s.FormLayout,FormTab:s.FormTab,FormCollapse:s.FormCollapse,ArrayTable:s.ArrayTable,ArrayCards:s.ArrayCards,FormItem:s.FormItem,DatePicker:s.DatePicker,Checkbox:s.Checkbox,Cascader:s.Cascader,Editable:s.Editable,Input:s.Input,NumberPicker:s.NumberPicker,Switch:s.Switch,Password:s.Password,PreviewText:s.PreviewText,Radio:s.Radio,Reset:s.Reset,Select:s.Select,Submit:s.Submit,TimePicker:s.TimePicker,Transfer:s.Transfer,TreeSelect:s.TreeSelect,Upload:s.Upload,Card:f.Card,Slider:f.Slider,Rate:f.Rate},e),r.components),scope:I({},r.schemaScope)}),[]),c=(0,o.useMemo)((function(){return(0,i.createForm)(I({initialValues:r.initialValues,readOnly:r.readOnly,disabled:r.disabled},r.formOptions||{}))}),[]);return(0,o.useImperativeHandle)(t,(function(){return{formRender:c}})),(0,o.useEffect)((function(){r.init&&r.init(c)}),[]),a().createElement(s.Form,{className:"form-render ".concat(r.className),layout:r.layout,form:c,labelCol:r.schema.form.labelCol,wrapperCol:r.schema.form.wrapperCol,onAutoSubmit:function(e){r.onSubmit(e)},onAutoSubmitFailed:function(e){r.onSubmitFailed(e)}},a().createElement(n,{schema:r.schema.schema}),a().createElement("div",{className:"form-render-footer xxm"},r.Slots&&a().createElement(r.Slots,null)))}))})(),u})()));
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@hzab/form-render",
3
+ "version": "0.0.1",
4
+ "description": "",
5
+ "main": "lib",
6
+ "module": "index.js",
7
+ "scripts": {
8
+ "dev": "webpack serve -c ./config/webpack.config.js --env development",
9
+ "build": "webpack -c ./config/webpack.config.js --env production"
10
+ },
11
+ "files": [
12
+ "lib",
13
+ "src"
14
+ ],
15
+ "keywords": [],
16
+ "author": "CaiYansong",
17
+ "license": "ISC",
18
+ "devDependencies": {
19
+ "@babel/core": "^7.20.5",
20
+ "@babel/plugin-proposal-class-properties": "^7.18.6",
21
+ "@babel/plugin-proposal-decorators": "^7.20.7",
22
+ "@babel/plugin-transform-runtime": "^7.19.6",
23
+ "@babel/preset-env": "^7.20.2",
24
+ "@babel/preset-react": "^7.18.6",
25
+ "@babel/preset-typescript": "^7.18.6",
26
+ "@babel/runtime": "^7.20.6",
27
+ "@types/react": "^18.0.26",
28
+ "@types/react-dom": "^18.0.9",
29
+ "antd": "^4.14.0",
30
+ "autoprefixer": "^10.4.13",
31
+ "babel-loader": "^9.1.0",
32
+ "clean-webpack-plugin": "^4.0.0",
33
+ "copy-webpack-plugin": "^11.0.0",
34
+ "css-loader": "^6.7.3",
35
+ "css-minimizer-webpack-plugin": "^4.2.2",
36
+ "eslint": "^8.30.0",
37
+ "eslint-webpack-plugin": "^3.2.0",
38
+ "file-loader": "^6.2.0",
39
+ "fork-ts-checker-webpack-plugin": "^7.2.14",
40
+ "html-webpack-plugin": "^5.5.0",
41
+ "less": "^4.1.3",
42
+ "less-loader": "^11.1.0",
43
+ "mini-css-extract-plugin": "^2.7.2",
44
+ "postcss-loader": "^7.0.2",
45
+ "react": "^18.2.0",
46
+ "react-dom": "^18.2.0",
47
+ "react-router-dom": "^6.8.1",
48
+ "style-loader": "^3.3.1",
49
+ "terser-webpack-plugin": "^5.3.6",
50
+ "typescript": "^4.9.4",
51
+ "webpack": "^5.75.0",
52
+ "webpack-cli": "^5.0.1",
53
+ "webpack-dev-server": "^4.11.1",
54
+ "webpackbar": "^5.0.2"
55
+ },
56
+ "peerDependencies": {
57
+ "antd": "<=4.22.8",
58
+ "react": ">=16.8.0",
59
+ "react-dom": ">=16.8.0"
60
+ },
61
+ "dependencies": {
62
+ "@formily/antd": "^2.2.20",
63
+ "@formily/core": "^2.2.20",
64
+ "@formily/react": "^2.2.20"
65
+ },
66
+ "directories": {
67
+ "lib": "lib"
68
+ }
69
+ }
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import { connect, mapProps } from "@formily/react";
3
+
4
+ function Text({ value, mode, content, className, ...props }) {
5
+ const tagName = mode === "normal" || !mode ? "div" : mode;
6
+ console.log("props", props.readOnly);
7
+
8
+ return React.createElement(
9
+ tagName,
10
+ {
11
+ className: `formily-text ${className}`,
12
+ ...props,
13
+ },
14
+ value || content,
15
+ );
16
+ }
17
+
18
+ export default connect(
19
+ Text,
20
+ mapProps((props, field) => {
21
+ return { ...props, form: field.form, field };
22
+ }),
23
+ );
@@ -0,0 +1,3 @@
1
+ import Text from "./Text";
2
+
3
+ export { Text };
package/src/index.less ADDED
@@ -0,0 +1,2 @@
1
+ .form-render {
2
+ }
package/src/index.tsx ADDED
@@ -0,0 +1,121 @@
1
+ import React, { useEffect, useMemo, useImperativeHandle, forwardRef, useCallback } from "react";
2
+ import { createForm } from "@formily/core";
3
+ import { createSchemaField } from "@formily/react";
4
+ import {
5
+ Form,
6
+ FormItem,
7
+ DatePicker,
8
+ Checkbox,
9
+ Cascader,
10
+ Editable,
11
+ Input,
12
+ NumberPicker,
13
+ Switch,
14
+ Password,
15
+ PreviewText,
16
+ Radio,
17
+ Reset,
18
+ Select,
19
+ Space,
20
+ Submit,
21
+ TimePicker,
22
+ Transfer,
23
+ TreeSelect,
24
+ Upload,
25
+ FormGrid,
26
+ FormLayout,
27
+ FormTab,
28
+ FormCollapse,
29
+ ArrayTable,
30
+ ArrayCards,
31
+ } from "@formily/antd";
32
+ import { Card, Slider, Rate } from "antd";
33
+ // 自定义组件
34
+ import * as customComponents from "./components/index";
35
+
36
+ import "./index.less";
37
+
38
+ const FormRender = forwardRef((props: any, parentRef) => {
39
+ const SchemaField = useCallback(
40
+ createSchemaField({
41
+ components: {
42
+ Space,
43
+ FormGrid,
44
+ FormLayout,
45
+ FormTab,
46
+ FormCollapse,
47
+ ArrayTable,
48
+ ArrayCards,
49
+ FormItem,
50
+ DatePicker,
51
+ Checkbox,
52
+ Cascader,
53
+ Editable,
54
+ Input,
55
+ NumberPicker,
56
+ Switch,
57
+ Password,
58
+ PreviewText,
59
+ Radio,
60
+ Reset,
61
+ Select,
62
+ Submit,
63
+ TimePicker,
64
+ Transfer,
65
+ TreeSelect,
66
+ Upload,
67
+ Card,
68
+ Slider,
69
+ Rate,
70
+ ...customComponents,
71
+ ...props.components,
72
+ },
73
+ scope: { ...props.schemaScope },
74
+ }),
75
+ [],
76
+ );
77
+
78
+ const formRender = useMemo(
79
+ () =>
80
+ createForm({
81
+ initialValues: props.initialValues,
82
+ // 禁用状态(注意,自定义组件组件自行获取对应的状态)
83
+ readOnly: props.readOnly,
84
+ disabled: props.disabled,
85
+ ...(props.formOptions || {}),
86
+ }),
87
+ [],
88
+ );
89
+
90
+ // 表单提交方法
91
+ const autoSubmit = (fromValue) => {
92
+ props.onSubmit(fromValue);
93
+ };
94
+ // 表单校验方法
95
+ const autoSubmitFailed = (messages) => {
96
+ props.onSubmitFailed(messages);
97
+ };
98
+
99
+ useImperativeHandle(parentRef, () => ({ formRender }));
100
+
101
+ useEffect(() => {
102
+ props.init && props.init(formRender);
103
+ }, []);
104
+
105
+ return (
106
+ <Form
107
+ className={`form-render ${props.className}`}
108
+ layout={props.layout}
109
+ form={formRender}
110
+ labelCol={props.schema.form.labelCol}
111
+ wrapperCol={props.schema.form.wrapperCol}
112
+ onAutoSubmit={autoSubmit}
113
+ onAutoSubmitFailed={autoSubmitFailed}
114
+ >
115
+ <SchemaField schema={props.schema.schema}></SchemaField>
116
+ <div className="form-render-footer xxm">{props.Slots && <props.Slots />}</div>
117
+ </Form>
118
+ );
119
+ });
120
+
121
+ export default FormRender;