formily 三种渲染方式
- JsonSchema,json写法,推荐使用
- MarkupSchema,JsxSchema,jsx混合 json
- Jsx,原生 react写法
jsonSchema协议渲染
JSON Schema 侧重于数据的描述,而非UI的描述,因为表单,输入的就是数据,让用户关心数据,而非UI
动态配置化渲染表单的能力,需要结合设计器,高效的生成各种各样的表单
动态的表单渲染方案:JSON配置中心的各种字段与对应的解析规则
Formily实践 https://zhuanlan.zhihu.com/p/142237587
理解了 Schema 字段的含义,也就理解了所有使用范式
- 与其自己去设计一套这样的 JSONSchema规范,不如直接按照社区的规范来
- 配置 JSON来进行描述数据,服务端或客户端遵循一个规范,进行消费
jsx渲染
使用 Field,ArrayField,ObjectField,VoidField 等组件直接编写表单
jsx渲染模式的好处
- 组件化思想开发表单
- 编辑器有智能提示,体验好
- 维护性好于 JSON
SchemaField
SchemaField 子节点不能随意插 UI 组件,因为最终 SchemaField 会解析子节点,并转换为 JSON Schema
<SchemaField.String
x-component="Input"
x-component-props={{ placeholder: '请输入' }}
/>
Schema协议
https://v1.formilyjs.org/#/0yTeT0/jAU8UVSYI8
S2V场景驱动视图
建立一套标准方案,使协议通、物料通、能力通,是开箱即用
formily建设方案
https://developer.aliyun.com/article/748028
低代码平台分析 https://segmentfault.com/a/1190000023065734
如何避免字段 name重复
例如,一些自定义组件重复拖拽,导致 name值一样
解决:
- 自定义 hooks 查询,所有已经使用过的字段名称,然后再重写渲染组件的单元格,对其 name 进行是否已经使用过的逻辑判断
- uuid
后面带单位的
x单位x单位x单位 类型表单
https://antd.formilyjs.org/zh-CN/components/space
文档优先
https://reactive.formilyjs.org/guide/best-practice
formily造的轮子,参考于mobx,做定制化
formily/react核心概念
https://react.formilyjs.org/zh-CN/guide/concepthttps://react.formilyjs.org/guide/concept#三种开发模式)
表单描述Schema协议、表单渲染、表单组件及周边生态一体的统一表单解决方案
Formily则预设了数组、表格、卡片和可拖拽几种方式供我们选择
支持网格布局、分布布局等复杂方式
联动
简单联动、批量联动和循环联动
formily/reactive 状态管理是怎么做的,业务使用中如何优化性能?
属性名 描述
enum使用可编辑的select组件
bool用switch组件提供编辑
schema类型使用json编辑器
form/Field 抽象出Model:管理state(数据及数据操作api)
form指整个表单,field是每个表单元素
https://react.formilyjs.org/zh-CN/api/shared/schema
https://core.formilyjs.org/zh-CN/api/models/field
不同的场景对应的API,不同业务逻辑的组件单独封装组件
- 不引入新的框架,做到足够轻量
- schema描述即数据结构及UI层级
- Schema拆分颗粒度较细,功能描述包括:异步数据源,字段联动 ,表达式,布局描述
联动响应
- reactions负责处理响应逻辑
- dependencies : 负责监听依赖项
- when: 表示条件
- fulfill: 表示满足条件后执行的动作
- state: 表示当前组件的属性
- value: 代表当前属性的值
- display: 表示当前属性的显隐
total: {
type: 'number',
title: 'Total',
'x-decorator': 'FormItem',
'x-component': 'NumberPicker',
'x-component-props': {
addonAfter: '$',
},
'x-pattern': 'readPretty',
'x-reactions': {
dependencies: ['.projects'],
when: '{{$deps.length > 0}}',
fulfill: {
state: {
value:
'{{$deps[0].reduce((total,item)=>item.total ? total+item.total : total,0)}}',
},
},
},
}