diff --git a/CHANGELOG.zh_CN.md b/CHANGELOG.zh_CN.md index 62ae8191133151bdca16adfcc9ef21c197691e1e..9ce213c3b0899eddadcb021730d8c07ce8fc4409 100644 --- a/CHANGELOG.zh_CN.md +++ b/CHANGELOG.zh_CN.md @@ -1,3 +1,11 @@ +### ✨ Features + +- **BasicForm** 表单组件新增`Divider`,用于较长表单的区域分割 + +### 🐛 Bug Fixes + +- **其它** 修复部分封装组件在使用插槽时报错的问题 + ## 2.7.1(2021-08-16) - 升级 vue 3.2,如果运行失败,删除 node_modules 后重装即可 diff --git a/src/components/Form/src/BasicForm.vue b/src/components/Form/src/BasicForm.vue index 7e900de6e9ccaec9ac68325f9ea431ee78ace4bd..552fd6358fbe23edad8b96427d86e92e9270db07 100644 --- a/src/components/Form/src/BasicForm.vue +++ b/src/components/Form/src/BasicForm.vue @@ -29,7 +29,7 @@ #[item]="data" v-for="item in ['resetBefore', 'submitBefore', 'advanceBefore', 'advanceAfter']" > - + @@ -132,7 +132,11 @@ } } } - return schemas as FormSchema[]; + if (unref(getProps).showAdvancedButton) { + return schemas.filter((schema) => schema.component !== 'Divider') as FormSchema[]; + } else { + return schemas as FormSchema[]; + } }); const { handleToggleAdvanced } = useAdvanced({ diff --git a/src/components/Form/src/componentMap.ts b/src/components/Form/src/componentMap.ts index 5b512418232d88416e0d64ca921e80f91b6e1ee1..4bfbdf11d7922c437d73a4c1e891edae2c4784ef 100644 --- a/src/components/Form/src/componentMap.ts +++ b/src/components/Form/src/componentMap.ts @@ -18,6 +18,7 @@ import { TreeSelect, Slider, Rate, + Divider, } from 'ant-design-vue'; import RadioButtonGroup from './components/RadioButtonGroup.vue'; @@ -61,6 +62,7 @@ componentMap.set('IconPicker', IconPicker); componentMap.set('InputCountDown', CountdownInput); componentMap.set('Upload', BasicUpload); +componentMap.set('Divider', Divider); export function add(compName: ComponentType, component: Component) { componentMap.set(compName, component); diff --git a/src/components/Form/src/components/FormItem.vue b/src/components/Form/src/components/FormItem.vue index 92359542532c08673c89517d1afeb62a9baf141d..67832ac4f547d5b99e36dca858caae392cc10f3d 100644 --- a/src/components/Form/src/components/FormItem.vue +++ b/src/components/Form/src/components/FormItem.vue @@ -5,7 +5,7 @@ import type { ValidationRule } from 'ant-design-vue/lib/form/Form'; import type { TableActionType } from '/@/components/Table'; import { defineComponent, computed, unref, toRefs } from 'vue'; - import { Form, Col } from 'ant-design-vue'; + import { Form, Col, Divider } from 'ant-design-vue'; import { componentMap } from '../componentMap'; import { BasicHelp } from '/@/components/Basic'; import { isBoolean, isFunction, isNull } from '/@/utils/is'; @@ -73,11 +73,17 @@ const getComponentsProps = computed(() => { const { schema, tableAction, formModel, formActionType } = props; - const { componentProps = {} } = schema; - if (!isFunction(componentProps)) { - return componentProps; + let { componentProps = {} } = schema; + if (isFunction(componentProps)) { + componentProps = componentProps({ schema, tableAction, formModel, formActionType }) ?? {}; } - return componentProps({ schema, tableAction, formModel, formActionType }) ?? {}; + if (schema.component === 'Divider') { + componentProps = Object.assign({ type: 'horizontal' }, componentProps, { + orientation: 'left', + plain: true, + }); + } + return componentProps; }); const getDisable = computed(() => { @@ -300,38 +306,46 @@ } function renderItem() { - const { itemProps, slot, render, field, suffix } = props.schema; + const { itemProps, slot, render, field, suffix, component, label } = props.schema; const { labelCol, wrapperCol } = unref(itemLabelWidthProp); const { colon } = props.formProps; - const getContent = () => { - return slot - ? getSlot(slots, slot, unref(getValues)) - : render - ? render(unref(getValues)) - : renderComponent(); - }; - - const showSuffix = !!suffix; - const getSuffix = isFunction(suffix) ? suffix(unref(getValues)) : suffix; - - return ( - -
-
{getContent()}
- {showSuffix && {getSuffix}} -
-
- ); + if (component === 'Divider') { + return ( + + {label} + + ); + } else { + const getContent = () => { + return slot + ? getSlot(slots, slot, unref(getValues)) + : render + ? render(unref(getValues)) + : renderComponent(); + }; + + const showSuffix = !!suffix; + const getSuffix = isFunction(suffix) ? suffix(unref(getValues)) : suffix; + + return ( + +
+
{getContent()}
+ {showSuffix && {getSuffix}} +
+
+ ); + } } return () => { diff --git a/src/components/Form/src/hooks/useFormEvents.ts b/src/components/Form/src/hooks/useFormEvents.ts index cb09833e7ec93beca996764419f5866fb2c28bfa..92a0898943304cd294c42a6033614c6d1e464c17 100644 --- a/src/components/Form/src/hooks/useFormEvents.ts +++ b/src/components/Form/src/hooks/useFormEvents.ts @@ -149,7 +149,9 @@ export function useFormEvents({ updateData = [...data]; } - const hasField = updateData.every((item) => Reflect.has(item, 'field') && item.field); + const hasField = updateData.every( + (item) => item.component === 'Divider' || (Reflect.has(item, 'field') && item.field) + ); if (!hasField) { error( @@ -169,7 +171,9 @@ export function useFormEvents({ updateData = [...data]; } - const hasField = updateData.every((item) => Reflect.has(item, 'field') && item.field); + const hasField = updateData.every( + (item) => item.component === 'Divider' || (Reflect.has(item, 'field') && item.field) + ); if (!hasField) { error( diff --git a/src/components/Form/src/types/index.ts b/src/components/Form/src/types/index.ts index 1d73d72f633f9b75543eb1a9db73bdba4d09527f..1cd6a02c52cebc928263c9118751efaf8a016f9d 100644 --- a/src/components/Form/src/types/index.ts +++ b/src/components/Form/src/types/index.ts @@ -109,4 +109,5 @@ export type ComponentType = | 'IconPicker' | 'Render' | 'Slider' - | 'Rate'; + | 'Rate' + | 'Divider'; diff --git a/src/views/demo/form/AdvancedForm.vue b/src/views/demo/form/AdvancedForm.vue index 03bb16572535706710c65d6c96837989ca8a76f9..4872698904d5ccc32c7d1a564872295d31a49f7b 100644 --- a/src/views/demo/form/AdvancedForm.vue +++ b/src/views/demo/form/AdvancedForm.vue @@ -12,7 +12,7 @@