Quellcode durchsuchen

perf(BasicForm): fix invaild defaultValue && split-setdefault-setvalue (#3815)

Electrolux vor 1 Jahr
Ursprung
Commit
88e77dbf99

+ 2 - 0
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(

+ 3 - 0
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];

+ 28 - 5
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
   };
 }
 

+ 7 - 1
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);
   }

+ 1 - 0
src/components/Form/src/types/form.ts

@@ -41,6 +41,7 @@ export interface FormActionType {
   validateFields: (nameList?: NamePath[]) => Promise<any>;
   validate: <T = Recordable>(nameList?: NamePath[] | false) => Promise<T>;
   scrollToField: (name: NamePath, options?: ScrollOptions) => Promise<void>;
+  resetDefaultField:(name?: NamePath[]) => void;
 }
 
 export type RegisterFn = (formInstance: FormActionType) => void;