Replies: 3 comments
-
浅谈表单开发效率做过好几个中后台,其中大部分工作量都在做CRUD,对应前端就是表单和表格了,提高这两者的开发效率就能提高整体效率。这类系统一般会基于某个组件库开始,例如 ant-design,它提供了丰富的表单组件和表格组件,通过组合使用能解决绝大部分场景的开发需求。 开发一段时间后,会发现每个表单和表格都有一些相似逻辑(如检验、搜索、过滤等),为了避免每次都从新写一遍,会考虑将 antd 组件封装后供使用。其他系统的前端看到封装后的组件比直接使用 antd 省事不少,也想使用下,这时需要将封装的组件中跨系统通用的部分抽离出来,这个工作也已经有人做了,它就是 pro-components 开发表单的效率提高了,但还是要自己写代码,而且工作量是跟表单数量成比例的。表单无非是组合表单组件,只要表单组件足够丰富就能组合出想要的表单,如果能让其他同学设计表单,而我开发基础的表单组件,那么我的工作量只跟表单组件的数量成正比,而这个量增长是比较缓慢的。 为了实现上面目的,需要定义一套 schema用于描述表单结构样式行为,其次提供一个表单设计器用于生成这样的 schema,最后提供一个表单渲染器来呈现表单。幸运的是这个工作已经在做了,formily 和 x-render 是比较突出的两个方案,都是阿里在维护,两者各有优缺点:
|
Beta Was this translation helpful? Give feedback.
-
form-render表单联动form-render 支持联动的工具有 dependencies、watch、函数表达式、form 实例的 dependencies 属于多对一的被动联动,适用于自定义组件联动更新,效果是所依赖字段的值发生化时,引起当前字段的表单项(即 schema 中的 widget 字段映射的组件)重新渲染,例如: {
"type": "object",
"properties": {
"a": {
"title": "a",
"type": "string"
},
"b": {
"title": "b",
"type": "string",
"dependencies": ["a"]
}
}
} {{函数表达式}} 属于多对一的被动联动,适用于schema 属性的联动更新,效果是所依赖字段的值发生变化时,引起当前表达式重新计算,例如 {
"type": "object",
"properties": {
"a": {
"title": "a",
"type": "string"
},
"b": {
"title": "{{formData.a || 'b'}}",
"type": "string"
}
}
} watch 属于主动联动,适用于一对多的场景(多对一和一对一场景推荐前面两种更简单)或者需要更新 schema 的场景,效果是所指定的依赖字段的值发生变化时触发回调,在回调中可以使用 form 实例的方法来更新任意字段的 schema 或 value import React, { useEffect } from 'react';
import { Button } from 'antd';
import FormRender, { useForm } from 'form-render';
const schema = {
type: 'object',
properties: {
a: {
title: 'a',
type: 'string',
},
b: {
title: 'b',
type: 'string',
},
},
};
const Demo = () => {
const form = useForm();
const watch = {
// # 为全局,任何表单数据的变动都会触发
'#': val => {
console.log('表单的时时数据为:', val);
},
// 字段 a 的值变化时触发
a: val => {
form.setValueByPath('input2', val);
},
};
return <FormRender form={form} schema={schema} watch={watch} />;
};
其他在阅读文档中遇到的一些好奇的点,先记录下来,有空了再回头深究
|
Beta Was this translation helpful? Give feedback.
-
formily designer v.s. form-render generator
|
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
formily
formily 具备高性能、支持复杂联动、跨框架特点。
阅读材料:
Beta Was this translation helpful? Give feedback.
All reactions