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',