export const basicProps = {
model: {
type: Object as PropType<Recordable>,
default: {},
},
// 标签宽度 固定宽度
labelWidth: {
type: [Number, String] as PropType<number | string>,
default: 0,
},
fieldMapToTime: {
type: Array as PropType<FieldMapToTime>,
default: () => [],
},
compact: propTypes.bool,
// 表单配置规则
schemas: {
type: [Array] as PropType<FormSchema[]>,
default: () => [],
},
........
};
上面是基础表单组件BasicForm ,生成特定表单组件的配置(只列了几项),见'@/src/components/Form/src/props.ts',
其中提供schemas 属性提供表单配置规则,通过下面代码传入的schemas(其实经过getSchema计算属性处理的)循环<FormItem/>组件 得到每一项表单项,其中component类型只限于提供的ant-design-vue几个的组件。
<template v-for="schema in getSchema" :key="schema.field">
<FormItem
:tableAction="tableAction"
:formActionType="formActionType"
:schema="schema"
:formProps="getProps"
:allDefaultValues="defaultValueRef"
:formModel="formModel"
:setFormModel="setFormModel"
>
<template #[item]="data" v-for="item in Object.keys($slots)">
<slot :name="item" v-bind="data || {}"></slot>
</template>
</FormItem>
</template>
//例如 views/demo/system/role/role.data.ts
export const formSchema: FormSchema[] = [
{
field: 'roleName',
label: '角色名称',
required: true,
component: 'Input',
},
{
field: 'roleValue',
label: '角色值',
required: true,
component: 'Input',
},
{
field: 'status',
label: '状态',
component: 'RadioButtonGroup',
defaultValue: '0',
componentProps: {
options: [
{ label: '启用', value: '0' },
{ label: '停用', value: '1' },
],
},
},
{
label: '备注',
field: 'remark',
component: 'InputTextArea',
},
{
label: ' ',
field: 'menu',
slot: 'menu',
component: 'Input',
},
];
最终生成如图