diff --git a/packages/@core/ui-kit/form-ui/src/form-render/dependencies.ts b/packages/@core/ui-kit/form-ui/src/form-render/dependencies.ts index 1034afa14..505bc9eef 100644 --- a/packages/@core/ui-kit/form-ui/src/form-render/dependencies.ts +++ b/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 '); } + // 在 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 }, diff --git a/packages/@core/ui-kit/shadcn-ui/src/components/collapsible/collapsible-params.vue b/packages/@core/ui-kit/shadcn-ui/src/components/collapsible/collapsible-params.vue index 1389c606f..b82940179 100644 --- a/packages/@core/ui-kit/shadcn-ui/src/components/collapsible/collapsible-params.vue +++ b/packages/@core/ui-kit/shadcn-ui/src/components/collapsible/collapsible-params.vue @@ -103,16 +103,17 @@ function resetValues() { function updateValues( values: Recordable, ) { - const newValue = {} as Recordable; + const allowedKeys = new Set(props.params.map((param) => param.key)); + const patch = {} as Recordable; 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( diff --git a/playground/src/views/examples/form/collapsible.vue b/playground/src/views/examples/form/collapsible.vue index 488d80ab7..1f6541f3a 100644 --- a/playground/src/views/examples/form/collapsible.vue +++ b/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) {