@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 +233 -0
- package/lib/index.js +1 -0
- package/package.json +69 -0
- package/src/components/Text/index.tsx +23 -0
- package/src/components/index.tsx +3 -0
- package/src/index.less +2 -0
- package/src/index.tsx +121 -0
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
|
+
);
|
package/src/index.less
ADDED
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;
|