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