diff --git a/jeecgboot-vue3/src/components/Form/src/hooks/useFormEvents.ts b/jeecgboot-vue3/src/components/Form/src/hooks/useFormEvents.ts index 1f6b9ee00..77086a3e5 100644 --- a/jeecgboot-vue3/src/components/Form/src/hooks/useFormEvents.ts +++ b/jeecgboot-vue3/src/components/Form/src/hooks/useFormEvents.ts @@ -19,6 +19,25 @@ interface UseFormActionContext { schemaRef: Ref; handleFormValues: Fn; } + +function mergeComponentProps(srcProps: any, targetProps: any) { + if (targetProps == undefined) return srcProps; + if (srcProps == undefined) return targetProps; + if (isObject(srcProps) && isObject(targetProps)) { + return deepMerge(cloneDeep(srcProps), targetProps); + } + if (isFunction(srcProps) && isObject(targetProps)) { + return (ctx: any) => ({ ...(srcProps(ctx) ?? {}), ...targetProps }); + } + if (isObject(srcProps) && isFunction(targetProps)) { + return (ctx: any) => ({ ...srcProps, ...(targetProps(ctx) ?? {}) }); + } + if (isFunction(srcProps) && isFunction(targetProps)) { + return (ctx: any) => ({ ...(srcProps(ctx) ?? {}), ...(targetProps(ctx) ?? {}) }); + } + return targetProps; +} + export function useFormEvents({ emit, getProps, @@ -201,7 +220,14 @@ export function useFormEvents({ updateData.forEach((item) => { unref(getSchema).forEach((val) => { if (val.field === item.field) { - const newSchema = deepMerge(val, item); + // update-begin-author:liaozhiyang date:2026-05-12 for:【issue/9612】updateSchema中的函数执行两次 + const { componentProps: itemCp, ...restItem } = item as any; + const newSchema = deepMerge(val, restItem); + if (Reflect.has(item, 'componentProps')) { + //【issues/7940】componentProps写成函数形式时,updateSchema写成对象时,参数没合并 + newSchema.componentProps = mergeComponentProps(val.componentProps, itemCp); + } + // update-end-author:liaozhiyang date:2026-05-12 for:【issue/9612】updateSchema中的函数执行两次 schema.push(newSchema as FormSchema); } else { schema.push(val); diff --git a/jeecgboot-vue3/src/utils/index.ts b/jeecgboot-vue3/src/utils/index.ts index 9d99bf9e3..27835debf 100644 --- a/jeecgboot-vue3/src/utils/index.ts +++ b/jeecgboot-vue3/src/utils/index.ts @@ -45,23 +45,7 @@ export function deepMerge(src: any = {}, target: any = {}): T { if (isObject(src[key]) && isObject(target[key])) { src[key] = deepMerge(src[key], target[key]); } else { - // 代码逻辑说明: 【issues/7940】componentProps写成函数形式时,updateSchema写成对象时,参数没合并 - try { - if (isFunction(src[key]) && isObject(src[key]()) && isObject(target[key])) { - // src[key]是函数且返回对象,且target[key]是对象 - src[key] = deepMerge(src[key](), target[key]); - } else if (isObject(src[key]) && isFunction(target[key]) && isObject(target[key]())) { - // target[key]是函数且返回对象,且src[key]是对象 - src[key] = deepMerge(src[key], target[key]()); - } else if (isFunction(src[key]) && isFunction(target[key]) && isObject(src[key]()) && isObject(target[key]())) { - // src[key]是函数且返回对象,target[key]是函数且返回对象 - src[key] = deepMerge(src[key](), target[key]()); - } else { - src[key] = target[key]; - } - } catch (error) { - src[key] = target[key]; - } + src[key] = target[key]; } } return src;