diff --git a/packages/editor/src/layouts/props-panel/FormPanel.vue b/packages/editor/src/layouts/props-panel/FormPanel.vue index 19911df1..da84f5b8 100644 --- a/packages/editor/src/layouts/props-panel/FormPanel.vue +++ b/packages/editor/src/layouts/props-panel/FormPanel.vue @@ -14,6 +14,7 @@ :config="config" :type-match-valid="true" :extend-state="extendState" + :validate-on-init="true" @change="submit" @error="errorHandler" > diff --git a/packages/form/src/Form.vue b/packages/form/src/Form.vue index 4d74dc6c..4494e23d 100644 --- a/packages/form/src/Form.vue +++ b/packages/form/src/Form.vue @@ -88,6 +88,13 @@ const props = withDefaults( labelWidth?: string; /** 是否开启类型匹配校验 */ typeMatchValid?: boolean; + /** + * 初始化(`config` / `initValues` 就绪)后是否立即执行一次表单校验。 + * + * - `false`(默认):不自动校验,避免打开表单时就展示错误态; + * - `true`:初始化完成后在 `nextTick` 中调用 `validate()`。 + */ + validateOnInit?: boolean; disabled?: boolean; height?: string; stepActive?: string | number; @@ -156,6 +163,7 @@ const props = withDefaults( labelPosition: 'right', keyProp: '__key', useFieldTextInError: true, + validateOnInit: false, }, ); @@ -353,9 +361,11 @@ watch( // 非对比模式,初始化完成 initialized.value = !props.isCompare; - nextTick(() => { - tMagicFormRef.value?.validate(); - }); + if (props.validateOnInit) { + nextTick(() => { + tMagicFormRef.value?.validate(); + }); + } }); if (props.isCompare) { diff --git a/packages/form/src/FormBox.vue b/packages/form/src/FormBox.vue index cf085e9a..9492c9b0 100644 --- a/packages/form/src/FormBox.vue +++ b/packages/form/src/FormBox.vue @@ -16,6 +16,7 @@ :use-field-text-in-error="useFieldTextInError" :extend-state="extendState" :type-match-valid="typeMatchValid" + :validate-on-init="validateOnInit" @change="changeHandler" > @@ -59,6 +60,8 @@ const props = withDefaults( labelWidth?: string; /** 是否开启类型匹配校验 */ typeMatchValid?: boolean; + /** 透传给内部 `MForm`,初始化完成后是否立即校验(默认 `false`) */ + validateOnInit?: boolean; disabled?: boolean; size?: 'small' | 'default' | 'large'; confirmText?: string; @@ -74,6 +77,7 @@ const props = withDefaults( values: () => ({}), confirmText: '确定', useFieldTextInError: true, + validateOnInit: false, }, ); diff --git a/packages/form/src/FormDialog.vue b/packages/form/src/FormDialog.vue index de4fada1..d7453a98 100644 --- a/packages/form/src/FormDialog.vue +++ b/packages/form/src/FormDialog.vue @@ -33,6 +33,7 @@ :prevent-submit-default="preventSubmitDefault" :use-field-text-in-error="useFieldTextInError" :type-match-valid="typeMatchValid" + :validate-on-init="validateOnInit" :extend-state="extendState" :theme="effectiveTheme" @change="changeHandler" @@ -87,6 +88,8 @@ const props = withDefaults( labelWidth?: string; /** 是否开启类型匹配校验 */ typeMatchValid?: boolean; + /** 透传给内部 `MForm`,初始化完成后是否立即校验(默认 `false`) */ + validateOnInit?: boolean; fullscreen?: boolean; disabled?: boolean; title?: string; @@ -122,6 +125,7 @@ const props = withDefaults( showClose: true, showCancel: true, useFieldTextInError: true, + validateOnInit: false, }, ); diff --git a/packages/form/src/FormDrawer.vue b/packages/form/src/FormDrawer.vue index a27225ee..fa333185 100644 --- a/packages/form/src/FormDrawer.vue +++ b/packages/form/src/FormDrawer.vue @@ -30,6 +30,7 @@ :prevent-submit-default="preventSubmitDefault" :use-field-text-in-error="useFieldTextInError" :type-match-valid="typeMatchValid" + :validate-on-init="validateOnInit" :extend-state="extendState" :theme="effectiveTheme" @change="changeHandler" @@ -78,6 +79,8 @@ const props = withDefaults( labelWidth?: string; /** 是否开启类型匹配校验 */ typeMatchValid?: boolean; + /** 透传给内部 `MForm`,初始化完成后是否立即校验(默认 `false`) */ + validateOnInit?: boolean; disabled?: boolean; closeOnPressEscape?: boolean; title?: string; @@ -106,6 +109,7 @@ const props = withDefaults( values: () => ({}), confirmText: '确定', useFieldTextInError: true, + validateOnInit: false, }, );