From 3de5b53bcda5999a395e1f3fdcfd9e08c145f3ba Mon Sep 17 00:00:00 2001 From: lzdjack <51448229+lzdjack@users.noreply.github.com> Date: Tue, 14 Mar 2023 17:06:10 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=20(#2620)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.优化验证 2.修复自定义组件验证出错的问题 --- src/components/Form/src/BasicForm.vue | 10 +++------- src/components/Form/src/components/FormItem.vue | 15 ++++++++++++++- src/components/Form/src/helper.ts | 13 +++++++++++++ src/hooks/component/useFormItem.ts | 4 +--- src/views/demo/form/index.vue | 13 +++++++++++++ 5 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/components/Form/src/BasicForm.vue b/src/components/Form/src/BasicForm.vue index d9844721e..56fa45087 100644 --- a/src/components/Form/src/BasicForm.vue +++ b/src/components/Form/src/BasicForm.vue @@ -64,7 +64,6 @@ import { basicProps } from './props'; import { useDesign } from '/@/hooks/web/useDesign'; import { cloneDeep } from 'lodash-es'; - import { isFunction, isArray } from '/@/utils/is'; export default defineComponent({ name: 'BasicForm', @@ -245,14 +244,11 @@ function setFormModel(key: string, value: any, schema: FormSchema) { formModel[key] = value; - const { validateTrigger } = unref(getBindValue); - if (isFunction(schema.dynamicRules) || isArray(schema.rules)) { - return; - } - if (!validateTrigger || validateTrigger === 'change') { + emit('field-value-change', key, value); + // TODO 优化验证,这里如果是autoLink=false手动关联的情况下才会再次触发此函数 + if (schema && schema.itemProps && !schema.itemProps.autoLink) { validateFields([key]).catch((_) => {}); } - emit('field-value-change', key, value); } function handleEnterPress(e: KeyboardEvent) { diff --git a/src/components/Form/src/components/FormItem.vue b/src/components/Form/src/components/FormItem.vue index 2142364cd..595b4a929 100644 --- a/src/components/Form/src/components/FormItem.vue +++ b/src/components/Form/src/components/FormItem.vue @@ -9,7 +9,11 @@ import { BasicHelp } from '/@/components/Basic'; import { isBoolean, isFunction, isNull } from '/@/utils/is'; import { getSlot } from '/@/utils/helper/tsxHelper'; - import { createPlaceholderMessage, setComponentRuleType } from '../helper'; + import { + createPlaceholderMessage, + NO_AUTO_LINK_COMPONENTS, + setComponentRuleType, + } from '../helper'; import { cloneDeep, upperFirst } from 'lodash-es'; import { useItemLabelWidth } from '../hooks/useLabelWidth'; import { useI18n } from '/@/hooks/web/useI18n'; @@ -347,6 +351,15 @@ const showSuffix = !!suffix; const getSuffix = isFunction(suffix) ? suffix(unref(getValues)) : suffix; + // TODO 自定义组件验证会出现问题,因此这里框架默认将自定义组件设置手动触发验证,如果其他组件还有此问题请手动设置autoLink=false + if (NO_AUTO_LINK_COMPONENTS.includes(component)) { + props.schema && + (props.schema.itemProps! = { + autoLink: false, + ...props.schema.itemProps, + }); + } + return ( ( if (isEqual(value, defaultState.value)) return; innerState.value = value as T[keyof T]; - setTimeout(() => { - emit?.(changeEvent, value, ...(toRaw(unref(emitData)) || [])); - }); + emit?.(changeEvent, value, ...(toRaw(unref(emitData)) || [])); }, }); diff --git a/src/views/demo/form/index.vue b/src/views/demo/form/index.vue index efd0504eb..de2af827d 100644 --- a/src/views/demo/form/index.vue +++ b/src/views/demo/form/index.vue @@ -68,6 +68,7 @@ import { Select } from 'ant-design-vue'; import { cloneDeep } from 'lodash-es'; import { areaRecord } from '/@/api/demo/cascader'; + import { uploadApi } from '/@/api/sys/upload'; const valueSelectA = ref([]); const valueSelectB = ref([]); @@ -189,6 +190,18 @@ }, suffix: '天', }, + { + field: 'fieldsc', + component: 'Upload', + label: '上传', + colProps: { + span: 8, + }, + rules: [{ required: true, message: '请选择上传文件' }], + componentProps: { + api: uploadApi, + }, + }, { field: 'field3', component: 'DatePicker',