fix: dependencies访问extendApi

This commit is contained in:
allen
2026-04-15 14:42:21 +08:00
parent 33e2582f60
commit d69455e8ef
3 changed files with 40 additions and 21 deletions

View File

@@ -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 },

View File

@@ -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(