From 60aeb27ef4aa835783d57b3d216f0acd3ddbfc96 Mon Sep 17 00:00:00 2001 From: Electrolux <3451613934@qq.com> Date: Fri, 24 May 2024 17:25:25 +0800 Subject: [PATCH] feat(form): add valueFormat for schema --- src/components/Form/src/BasicForm.vue | 19 +++++++++++++++++++ .../Form/src/components/FormItem.vue | 8 ++++++-- src/components/Form/src/types/form.ts | 5 +++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/components/Form/src/BasicForm.vue b/src/components/Form/src/BasicForm.vue index 501fd8a1e7b..13ce15db45a 100644 --- a/src/components/Form/src/BasicForm.vue +++ b/src/components/Form/src/BasicForm.vue @@ -64,6 +64,7 @@ import { useDesign } from '@/hooks/web/useDesign'; import { cloneDeep } from 'lodash-es'; import { TableActionType } from '@/components/Table'; + import { isFunction } from '@/utils/is'; defineOptions({ name: 'BasicForm' }); @@ -130,6 +131,9 @@ component, componentProps = {}, isHandleDateDefaultValue = true, + field, + isHandleDefaultValue = true, + valueFormat, } = schema; // handle date type if ( @@ -161,6 +165,21 @@ schema.defaultValue = def; } } + + // handle schema.valueFormat + if ( + isHandleDefaultValue && + defaultValue && + component && + isFunction(valueFormat) + ) { + schema.defaultValue = valueFormat({ + value: defaultValue, + schema, + model: formModel, + field, + }); + } } if (unref(getProps).showAdvancedButton) { return schemas.filter( diff --git a/src/components/Form/src/components/FormItem.vue b/src/components/Form/src/components/FormItem.vue index 32da3121ba7..4402796a877 100644 --- a/src/components/Form/src/components/FormItem.vue +++ b/src/components/Form/src/components/FormItem.vue @@ -277,6 +277,7 @@ field, changeEvent = 'change', valueField, + valueFormat, } = props.schema; const isCheck = component && ['Switch', 'Checkbox'].includes(component); @@ -286,9 +287,12 @@ const on = { [eventKey]: (...args: Nullable>[]) => { const [e] = args; - + const target = e ? e.target : null; - const value = target ? (isCheck ? target.checked : target.value) : e; + let value = target ? (isCheck ? target.checked : target.value) : e; + if(isFunction(valueFormat)){ + value = valueFormat({...unref(getValues),value}); + } props.setFormModel(field, value, props.schema); if (propsData[eventKey]) { diff --git a/src/components/Form/src/types/form.ts b/src/components/Form/src/types/form.ts index b077039d53b..c42e7aecba7 100644 --- a/src/components/Form/src/types/form.ts +++ b/src/components/Form/src/types/form.ts @@ -197,6 +197,9 @@ interface BaseFormSchema { // 是否自动处理与时间相关组件的默认值 isHandleDateDefaultValue?: boolean; + // 是否使用valueFormat自动处理默认值 + isHandleDefaultValue?: boolean; + isAdvanced?: boolean; // Matching details components @@ -232,6 +235,8 @@ interface BaseFormSchema { dynamicReadonly?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean); dynamicRules?: (renderCallbackParams: RenderCallbackParams) => Rule[]; + + valueFormat?: (arg: Partial & { value: any }) => any; } export interface ComponentFormSchema extends BaseFormSchema { // render component