浏览代码

fix: dependencies访问extendApi

allen 2 月之前
父节点
当前提交
d69455e8ef

+ 29 - 14
packages/@core/ui-kit/form-ui/src/form-render/dependencies.ts

@@ -32,19 +32,13 @@ function resolveValueByFieldName(
 
   return get(values, fieldName);
 }
-
 export default function useDependencies(
   getDependencies: () => FormItemDependencies | undefined,
 ) {
   const values = useFormValues();
 
-  const formRenderProps = injectRenderFormProps();
   const [extendApi] = injectFormProps();
-
-  // 在 dependencies 里提供访问extendApi的能力
-  const controller: ExtendedFormApi = isRef(extendApi)
-    ? (extendApi.value.formApi as ExtendedFormApi)
-    : (extendApi.formApi as ExtendedFormApi);
+  const formRenderProps = injectRenderFormProps();
 
   const formApi = formRenderProps.form;
 
@@ -56,6 +50,19 @@ export default function useDependencies(
     throw new Error('useDependencies should be used within <VbenForm>');
   }
 
+  // 在 dependencies 里提供访问extendApi的能力
+  const getController = (): ExtendedFormApi => {
+    const controller = isRef(extendApi)
+      ? extendApi.value.formApi
+      : extendApi.formApi;
+
+    if (!controller) {
+      throw new Error('formApi is required in useDependencies');
+    }
+
+    return controller;
+  };
+
   const isIf = ref(true);
   const isDisabled = ref(false);
   const isShow = ref(true);
@@ -101,7 +108,7 @@ export default function useDependencies(
       const formValues = values.value;
 
       if (isFunction(whenIf)) {
-        isIf.value = !!(await whenIf(formValues, formApi, controller));
+        isIf.value = !!(await whenIf(formValues, formApi, getController()));
         // 不渲染
         if (!isIf.value) return;
       } else if (isBoolean(whenIf)) {
@@ -111,7 +118,7 @@ export default function useDependencies(
 
       // 2. 判断show,如果show为false,则隐藏
       if (isFunction(show)) {
-        isShow.value = !!(await show(formValues, formApi, controller));
+        isShow.value = !!(await show(formValues, formApi, getController()));
       } else if (isBoolean(show)) {
         isShow.value = show;
       }
@@ -120,26 +127,34 @@ export default function useDependencies(
         dynamicComponentProps.value = await componentProps(
           formValues,
           formApi,
-          controller,
+          getController(),
         );
       }
 
       if (isFunction(rules)) {
-        dynamicRules.value = await rules(formValues, formApi, controller);
+        dynamicRules.value = await rules(formValues, formApi, getController());
       }
 
       if (isFunction(disabled)) {
-        isDisabled.value = !!(await disabled(formValues, formApi, controller));
+        isDisabled.value = !!(await disabled(
+          formValues,
+          formApi,
+          getController(),
+        ));
       } else if (isBoolean(disabled)) {
         isDisabled.value = disabled;
       }
 
       if (isFunction(required)) {
-        isRequired.value = !!(await required(formValues, formApi, controller));
+        isRequired.value = !!(await required(
+          formValues,
+          formApi,
+          getController(),
+        ));
       }
 
       if (isFunction(trigger)) {
-        trigger(formValues, formApi, controller);
+        trigger(formValues, formApi, getController());
       }
     },
     { deep: true, immediate: true },

+ 6 - 5
packages/@core/ui-kit/shadcn-ui/src/components/collapsible/collapsible-params.vue

@@ -103,16 +103,17 @@ function resetValues() {
 function updateValues(
   values: Recordable<CollapsibleParamSchema['defaultValue']>,
 ) {
-  const newValue = {} as Recordable<CollapsibleParamSchema['defaultValue']>;
+  const allowedKeys = new Set(props.params.map((param) => param.key));
+  const patch = {} as Recordable<CollapsibleParamSchema['defaultValue']>;
 
   for (const key in values) {
     if (!Object.hasOwn(values, key)) continue;
-    if (!Object.hasOwn(modelValue.value, key)) continue;
+    if (!allowedKeys.has(key)) continue;
 
-    newValue[key] = values[key];
-
-    modelValue.value = { ...modelValue.value, ...newValue };
+    patch[key] = values[key];
   }
+
+  modelValue.value = { ...modelValue.value, ...patch };
 }
 
 watch(

+ 5 - 2
playground/src/views/examples/form/collapsible.vue

@@ -38,7 +38,7 @@ function getNumberValidator(key: string, limit?: [number?, number?]) {
     }
     if (limit[1] !== undefined) {
       validator = validator.max(limit[1], {
-        message: `${key} 值不能大于${limit[0]}`,
+        message: `${key} 值不能大于${limit[1]}`,
       });
     }
   }
@@ -198,7 +198,10 @@ const [BaseForm, baseFormApi] = useVbenForm({
               save_steps: 80,
             });
           } else {
-            paramsRef?.updateValues?.({ calib_steps: null });
+            paramsRef?.updateValues?.({
+              calib_steps: null,
+              micro_batch_size: 8,
+            });
           }
         },
         rules(values) {