diff --git a/src/components/Form/src/BasicForm.vue b/src/components/Form/src/BasicForm.vue index 68743ba4f..4f015e996 100644 --- a/src/components/Form/src/BasicForm.vue +++ b/src/components/Form/src/BasicForm.vue @@ -207,6 +207,7 @@ removeSchemaByField, resetFields, scrollToField, + resetDefaultField, } = useFormEvents({ emit, getProps, @@ -305,6 +306,7 @@ validate, submit: handleSubmit, scrollToField: scrollToField, + resetDefaultField, }; const getFormActionBindProps = computed( diff --git a/src/components/Form/src/hooks/useForm.ts b/src/components/Form/src/hooks/useForm.ts index eccabe7a1..91fc9cffb 100644 --- a/src/components/Form/src/hooks/useForm.ts +++ b/src/components/Form/src/hooks/useForm.ts @@ -121,6 +121,9 @@ export function useForm(props?: Props): UseFormReturnType { const form = await getForm(); return form.validateFields(nameList); }, + resetDefaultField:async (nameList?: NamePath[]) => { + unref(formRef)?.resetDefaultField(nameList); + }, }; return [register, methods]; diff --git a/src/components/Form/src/hooks/useFormEvents.ts b/src/components/Form/src/hooks/useFormEvents.ts index 0e17abca6..ba5c51938 100644 --- a/src/components/Form/src/hooks/useFormEvents.ts +++ b/src/components/Form/src/hooks/useFormEvents.ts @@ -2,7 +2,7 @@ import type { ComputedRef, Ref } from 'vue'; import type { FormProps, FormSchemaInner as FormSchema, FormActionType } from '../types/form'; import type { NamePath } from 'ant-design-vue/lib/form/interface'; import { unref, toRaw, nextTick } from 'vue'; -import { isArray, isFunction, isObject, isString, isDef, isNil } from '@/utils/is'; +import { isArray, isFunction, isObject, isString, isNil } from '@/utils/is'; import { deepMerge } from '@/utils'; import { dateItemType, defaultValueComponents, isIncludeSimpleComponents } from '../helper'; import { dateUtil } from '@/utils/dateUtil'; @@ -110,15 +110,37 @@ export function useFormEvents({ } validKeys.push(key); } else { - // key not exist - if (isDef(get(defaultValueRef.value, key))) { - unref(formModel)[key] = cloneDeep(unref(get(defaultValueRef.value, key))); - } + // key not exist + // refer:https://github.com/vbenjs/vue-vben-admin/issues/3795 } }); validateFields(validKeys).catch((_) => {}); } + /** + * @description: Set form default value + */ + function resetDefaultField(nameList?: NamePath[]) { + if(!Array.isArray(nameList)){ + return + } + if (Array.isArray(nameList) && nameList.length === 0) { + return; + } + const validKeys: string[] = []; + let keys = Object.keys(unref(formModel)) + if(!keys){ + return + } + nameList.forEach((key:any) => { + if(keys.includes(key)){ + validKeys.push(key); + unref(formModel)[key] = cloneDeep(unref(get(defaultValueRef.value, key))); + } + }); + validateFields(validKeys).catch((_) => {}); + } + /** * @description: Delete based on field name */ @@ -359,6 +381,7 @@ export function useFormEvents({ resetFields, setFieldsValue, scrollToField, + resetDefaultField }; } diff --git a/src/components/Form/src/hooks/useFormValues.ts b/src/components/Form/src/hooks/useFormValues.ts index 70100f470..88a8f18af 100644 --- a/src/components/Form/src/hooks/useFormValues.ts +++ b/src/components/Form/src/hooks/useFormValues.ts @@ -135,7 +135,7 @@ export function useFormValues({ const schemas = unref(getSchema); const obj: Recordable = {}; schemas.forEach((item) => { - const { defaultValue, defaultValueObj } = item; + const { defaultValue, defaultValueObj, componentProps={} } = item; const fieldKeys = Object.keys(defaultValueObj || {}); if (fieldKeys.length) { fieldKeys.forEach((field) => { @@ -152,6 +152,12 @@ export function useFormValues({ formModel[item.field] = defaultValue; } } + if (!isNil(componentProps?.defaultValue)) { + obj[item.field] = componentProps?.defaultValue; + if (formModel[item.field] === undefined) { + formModel[item.field] = componentProps?.defaultValue; + } + } }); defaultValueRef.value = cloneDeep(obj); } diff --git a/src/components/Form/src/types/form.ts b/src/components/Form/src/types/form.ts index 276a47766..c7f53ebda 100644 --- a/src/components/Form/src/types/form.ts +++ b/src/components/Form/src/types/form.ts @@ -41,6 +41,7 @@ export interface FormActionType { validateFields: (nameList?: NamePath[]) => Promise; validate: (nameList?: NamePath[] | false) => Promise; scrollToField: (name: NamePath, options?: ScrollOptions) => Promise; + resetDefaultField:(name?: NamePath[]) => void; } export type RegisterFn = (formInstance: FormActionType) => void;