很多时候组件需要的数据和后端需要的数据之间不能完全匹配,ProForm 为了解决这个问题提供了 transform 和 convertValue 两个 API 来处理这种情况。
convertValue 发生在组件获得数据之前,一般是后端直接给前端的数据,有时需要精加工一下。
例如:
export type SearchConvertKeyFn = (value: any, field: NamePath) => string | Record<string, any>;
convertValue?: SearchConvertKeyFn;
参数说明:
获取时转化值,一般用于将数据格式化为组件接收的格式
value字段的值namePath字段的name
使用样例:
convertValue: (value,namePath)=> value.split(",")convertValue: (value,namePath)=> JSON.parse(value)convertValue: (value,namePath)=> Moment(value)convertValue: (value,namePath)=> Moment(value,"YYYY-MM-DD")convertValue: (value,namePath)=> { return {value,label:value} }transform 发生在提交的时候,一般来说都是吐给后端的存在数据库里的数据。
为了方便大家使用,ProFormDependency 和 formRef 都支持了 transform,可以获取到被转化后的值。
<ProFormDependency>
{(value, form) => {
// value 被 transform转化之后的值
// form 当前的formRef,可以获取未转化的值
return ReactNode;
}}
</ProFormDependency>
formRef 内置了几个方法来获取转化之后的值,这也是相比 antd 的 Form 多的功能,详细可以看 ProFormInstance 的类型定义。
- 获取被 ProForm 格式化后的所有数据
getFieldsFormatValue?: (nameList?: true) => T;- 获取格式化之后的单个数据
getFieldFormatValue?: (nameList?: NamePath) => T;
getFieldFormatValueObject?: (nameList?: NamePath) => T;- 验字段后返回格式化之后的所有数据
validateFieldsReturnFormatValue?: (nameList?: NamePath[]) => Promise;
例如:
export type SearchTransformKeyFn = (
value: any,
namePath: string,
allValues: any,
) => string | Record<string, any>;
transform?: SearchTransformKeyFn;
参数说明:
提交时转化值,一般用于将值转化为提交的数据
value 字段的值namePath 字段的nameallValues 所有的字段returns 字段新的值,如果返回对象,会和所有值 merge 一次
使用样例:
代码示例:
加入我们想给传入name加上职位信息,我们就可以使用transform惊醒如下数据转换。
<ProFormText width="md" name="name" label="姓名" placeholder="请输入名称"
transform={(value) => {
console.log(value)
return {
name:value+"-【java工程师】 "
};
}}
/>
接下来我们输入”张三“来看下转换后的效果

未完待续。。。