|
@@ -25,7 +25,7 @@ import {
|
|
|
} from './use-form-context';
|
|
} from './use-form-context';
|
|
|
// 通过 extends 会导致热更新卡死,所以重复写了一遍
|
|
// 通过 extends 会导致热更新卡死,所以重复写了一遍
|
|
|
interface Props extends VbenFormProps {
|
|
interface Props extends VbenFormProps {
|
|
|
- formApi: ExtendedFormApi;
|
|
|
|
|
|
|
+ formApi?: ExtendedFormApi;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const props = defineProps<Props>();
|
|
const props = defineProps<Props>();
|
|
@@ -44,11 +44,13 @@ provideComponentRefMap(componentRefMap);
|
|
|
props.formApi?.mount?.(form, componentRefMap);
|
|
props.formApi?.mount?.(form, componentRefMap);
|
|
|
|
|
|
|
|
const handleUpdateCollapsed = (value: boolean) => {
|
|
const handleUpdateCollapsed = (value: boolean) => {
|
|
|
- props.formApi?.setState({ collapsed: !!value });
|
|
|
|
|
|
|
+ props.formApi?.setState({ collapsed: value });
|
|
|
|
|
+ // 触发收起展开状态变化回调
|
|
|
|
|
+ forward.value.handleCollapsedChange?.(value);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
function handleKeyDownEnter(event: KeyboardEvent) {
|
|
function handleKeyDownEnter(event: KeyboardEvent) {
|
|
|
- if (!state.value.submitOnEnter || !forward.value.formApi?.isMounted) {
|
|
|
|
|
|
|
+ if (!state?.value.submitOnEnter || !forward.value.formApi?.isMounted) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
// 如果是 textarea 不阻止默认行为,否则会导致无法换行。
|
|
// 如果是 textarea 不阻止默认行为,否则会导致无法换行。
|
|
@@ -58,11 +60,11 @@ function handleKeyDownEnter(event: KeyboardEvent) {
|
|
|
}
|
|
}
|
|
|
event.preventDefault();
|
|
event.preventDefault();
|
|
|
|
|
|
|
|
- forward.value.formApi.validateAndSubmitForm();
|
|
|
|
|
|
|
+ forward.value.formApi?.validateAndSubmitForm();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const handleValuesChangeDebounced = useDebounceFn(async () => {
|
|
const handleValuesChangeDebounced = useDebounceFn(async () => {
|
|
|
- state.value.submitOnChange && forward.value.formApi?.validateAndSubmitForm();
|
|
|
|
|
|
|
+ state?.value.submitOnChange && forward.value.formApi?.validateAndSubmitForm();
|
|
|
}, 300);
|
|
}, 300);
|
|
|
|
|
|
|
|
const valuesCache: Recordable<any> = {};
|
|
const valuesCache: Recordable<any> = {};
|
|
@@ -74,7 +76,7 @@ onMounted(async () => {
|
|
|
() => form.values,
|
|
() => form.values,
|
|
|
async (newVal) => {
|
|
async (newVal) => {
|
|
|
if (forward.value.handleValuesChange) {
|
|
if (forward.value.handleValuesChange) {
|
|
|
- const fields = state.value.schema?.map((item) => {
|
|
|
|
|
|
|
+ const fields = state?.value.schema?.map((item) => {
|
|
|
return item.fieldName;
|
|
return item.fieldName;
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -91,8 +93,9 @@ onMounted(async () => {
|
|
|
|
|
|
|
|
if (changedFields.length > 0) {
|
|
if (changedFields.length > 0) {
|
|
|
// 调用handleValuesChange回调,传入所有表单值的深拷贝和变更的字段列表
|
|
// 调用handleValuesChange回调,传入所有表单值的深拷贝和变更的字段列表
|
|
|
|
|
+ const values = await forward.value.formApi?.getValues();
|
|
|
forward.value.handleValuesChange(
|
|
forward.value.handleValuesChange(
|
|
|
- cloneDeep(await forward.value.formApi.getValues()),
|
|
|
|
|
|
|
+ cloneDeep(values ?? {}) as Record<string, any>,
|
|
|
changedFields,
|
|
changedFields,
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
@@ -109,7 +112,7 @@ onMounted(async () => {
|
|
|
<Form
|
|
<Form
|
|
|
@keydown.enter="handleKeyDownEnter"
|
|
@keydown.enter="handleKeyDownEnter"
|
|
|
v-bind="forward"
|
|
v-bind="forward"
|
|
|
- :collapsed="state.collapsed"
|
|
|
|
|
|
|
+ :collapsed="state?.collapsed"
|
|
|
:component-bind-event-map="COMPONENT_BIND_EVENT_MAP"
|
|
:component-bind-event-map="COMPONENT_BIND_EVENT_MAP"
|
|
|
:component-map="COMPONENT_MAP"
|
|
:component-map="COMPONENT_MAP"
|
|
|
:form="form"
|
|
:form="form"
|
|
@@ -126,7 +129,7 @@ onMounted(async () => {
|
|
|
<slot v-bind="slotProps">
|
|
<slot v-bind="slotProps">
|
|
|
<FormActions
|
|
<FormActions
|
|
|
v-if="forward.showDefaultActions"
|
|
v-if="forward.showDefaultActions"
|
|
|
- :model-value="state.collapsed"
|
|
|
|
|
|
|
+ :model-value="state?.collapsed"
|
|
|
@update:model-value="handleUpdateCollapsed"
|
|
@update:model-value="handleUpdateCollapsed"
|
|
|
>
|
|
>
|
|
|
<template #reset-before="resetSlotProps">
|
|
<template #reset-before="resetSlotProps">
|