@ -10,7 +10,7 @@ import { createContext } from '@vben-core/shadcn-ui';
import { isString , mergeWithArrayOverride , set } from '@vben-core/shared/utils' ;
import { useForm } from 'vee-validate' ;
import { object } from 'zod' ;
import { object , ZodIntersection , ZodNumber , ZodObject , ZodString } from 'zod' ;
import { getDefaultsForSchema } from 'zod-defaults' ;
type ExtendFormProps = VbenFormProps & { formApi : ExtendedFormApi } ;
@ -52,7 +52,12 @@ export function useFormInitial(
if ( Reflect . has ( item , 'defaultValue' ) ) {
set ( initialValues , item . fieldName , item . defaultValue ) ;
} else if ( item . rules && ! isString ( item . rules ) ) {
// 检查规则是否适合提取默认值
const customDefaultValue = getCustomDefaultValue ( item . rules ) ;
zodObject [ item . fieldName ] = item . rules ;
if ( customDefaultValue !== undefined ) {
initialValues [ item . fieldName ] = customDefaultValue ;
}
}
} ) ;
@ -64,6 +69,38 @@ export function useFormInitial(
}
return mergeWithArrayOverride ( initialValues , zodDefaults ) ;
}
// 自定义默认值提取逻辑
function getCustomDefaultValue ( rule : any ) : any {
if ( rule instanceof ZodString ) {
return '' ; // 默认为空字符串
} else if ( rule instanceof ZodNumber ) {
return null ; // 默认为 null( 避免显示 0)
} else if ( rule instanceof ZodObject ) {
// 递归提取嵌套对象的默认值
const defaultValues : Record < string , any > = { } ;
for ( const [ key , valueSchema ] of Object . entries ( rule . shape ) ) {
defaultValues [ key ] = getCustomDefaultValue ( valueSchema ) ;
}
return defaultValues ;
} else if ( rule instanceof ZodIntersection ) {
// 对于交集类型, 从schema 提取默认值
const leftDefaultValue = getCustomDefaultValue ( rule . _def . left ) ;
const rightDefaultValue = getCustomDefaultValue ( rule . _def . right ) ;
// 如果左右两边都能提取默认值,合并它们
if (
typeof leftDefaultValue === 'object' &&
typeof rightDefaultValue === 'object'
) {
return { . . . leftDefaultValue , . . . rightDefaultValue } ;
}
// 否则优先使用左边的默认值
return leftDefaultValue ? ? rightDefaultValue ;
} else {
return undefined ; // 其他类型不提供默认值
}
}
return {
delegatedSlots ,