From ebebb42625d56cc45d324cee2f5375480eb6726e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=AA=E5=BF=86=E5=A4=A9=E5=A0=82?= <1455668754@qq.com> Date: Tue, 16 Jun 2026 09:48:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=201=E3=80=81FieldMappingTime=E6=8B=86?= =?UTF-8?q?=E8=A7=A3=E7=8B=AC=E7=AB=8BFieldMappingTimeItem+=E9=9B=86?= =?UTF-8?q?=E5=90=88=E5=BD=A2=E5=BC=8F=EF=BC=8C=E6=96=B9=E4=BE=BF=E5=8D=95?= =?UTF-8?q?=E7=8B=AC=E5=AF=B9=E8=B1=A1=E5=AE=9A=E4=B9=89;=202=E3=80=81?= =?UTF-8?q?=E8=A1=A8=E5=8D=95submitOnChange=E5=A2=9E=E5=8A=A0changeDebounc?= =?UTF-8?q?edTime=E9=98=B2=E6=8A=96=E5=A4=84=E7=90=86=EF=BC=8C=E5=85=81?= =?UTF-8?q?=E8=AE=B8=E8=87=AA=E5=AE=9A=E4=B9=89=E9=98=B2=E6=8A=96=E5=91=A8?= =?UTF-8?q?=E6=9C=9F;=203=E3=80=81handleValuesChange=E4=BA=8B=E4=BB=B6set?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0cloneDeep=EF=BC=8C=E9=98=B2=E6=AD=A2=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E5=80=BC=E6=B1=A1=E6=9F=93;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/@core/base/shared/src/utils/index.ts | 2 +- packages/@core/ui-kit/form-ui/src/types.ts | 11 +++++++++-- .../@core/ui-kit/form-ui/src/vben-use-form.vue | 18 +++++------------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/packages/@core/base/shared/src/utils/index.ts b/packages/@core/base/shared/src/utils/index.ts index fb9a48078..991b7419e 100644 --- a/packages/@core/base/shared/src/utils/index.ts +++ b/packages/@core/base/shared/src/utils/index.ts @@ -16,6 +16,6 @@ export * from './unique'; export * from './update-css-variables'; export * from './util'; export * from './window'; -export { get, isEqual, set } from 'es-toolkit/compat'; +export { debounce, get, isEqual, set } from 'es-toolkit/compat'; // export { cloneDeep } from 'es-toolkit/object'; export { default as cloneDeep } from 'lodash.clonedeep'; diff --git a/packages/@core/ui-kit/form-ui/src/types.ts b/packages/@core/ui-kit/form-ui/src/types.ts index 3e3729c2d..185532296 100644 --- a/packages/@core/ui-kit/form-ui/src/types.ts +++ b/packages/@core/ui-kit/form-ui/src/types.ts @@ -342,7 +342,7 @@ export type HandleResetFn = ( values: Record, ) => Promise | void; -export type FieldMappingTime = [ +export type FieldMappingTimeItem = [ string, [string, string], ( @@ -351,7 +351,9 @@ export type FieldMappingTime = [ | null | string )?, -][]; +]; + +export type FieldMappingTime = FieldMappingTimeItem[]; export type ArrayToStringFields = Array< | [string[], string?] // 嵌套数组格式,可选分隔符 @@ -525,6 +527,11 @@ export interface VbenFormProps< */ submitOnChange?: boolean; + /** + * submitOnChange改变时防抖时间 | 默认300ms + */ + changeDebouncedTime?: number; + /** * 是否在回车时提交表单 * @default false diff --git a/packages/@core/ui-kit/form-ui/src/vben-use-form.vue b/packages/@core/ui-kit/form-ui/src/vben-use-form.vue index e93867257..a00438296 100644 --- a/packages/@core/ui-kit/form-ui/src/vben-use-form.vue +++ b/packages/@core/ui-kit/form-ui/src/vben-use-form.vue @@ -3,7 +3,6 @@ import type { Recordable } from '@vben-core/typings'; import type { ExtendedFormApi, VbenFormProps } from './types'; -// import { toRaw, watch } from 'vue'; import { nextTick, onMounted, watch } from 'vue'; import { useForwardPriorityValues } from '@vben-core/composables'; @@ -12,17 +11,10 @@ import { cloneDeep, get, isEqual, set } from '@vben-core/shared/utils'; import { useDebounceFn } from '@vueuse/core'; import FormActions from './components/form-actions.vue'; -import { - COMPONENT_BIND_EVENT_MAP, - COMPONENT_MAP, - DEFAULT_FORM_COMMON_CONFIG, -} from './config'; +import { COMPONENT_BIND_EVENT_MAP, COMPONENT_MAP, DEFAULT_FORM_COMMON_CONFIG } from './config'; import { Form } from './form-render'; -import { - provideComponentRefMap, - provideFormProps, - useFormInitial, -} from './use-form-context'; +import { provideComponentRefMap, provideFormProps, useFormInitial } from './use-form-context'; + // 通过 extends 会导致热更新卡死,所以重复写了一遍 interface Props extends VbenFormProps { formApi?: ExtendedFormApi; @@ -65,7 +57,7 @@ function handleKeyDownEnter(event: KeyboardEvent) { const handleValuesChangeDebounced = useDebounceFn(async () => { state?.value.submitOnChange && forward.value.formApi?.validateAndSubmitForm(); -}, 300); +}, state?.value?.changeDebouncedTime ?? 300); const valuesCache: Recordable = {}; @@ -87,7 +79,7 @@ onMounted(async () => { const oldFieldValue = get(valuesCache, field); if (!isEqual(newFieldValue, oldFieldValue)) { changedFields.push(field); - set(valuesCache, field, newFieldValue); + set(valuesCache, field, cloneDeep(newFieldValue)); } });