|
@@ -2,21 +2,42 @@
|
|
|
<PageWrapper title="自定义组件示例">
|
|
|
<CollapseContainer title="自定义表单">
|
|
|
<BasicForm @register="register" @submit="handleSubmit">
|
|
|
- <template #f3="{ model, field }">
|
|
|
- <a-input v-model:value="model[field]" placeholder="自定义slot" />
|
|
|
+ <template #f3="{ model, field, disabled }">
|
|
|
+ <a-input v-model:value="model[field]" :disabled="disabled" placeholder="自定义slot" />
|
|
|
+ </template>
|
|
|
+ <template #colSlot_field5="{ model, field, disabled }">
|
|
|
+ <FormItem :name="field" label="自定义colSlot" :rules="[{ required: true }]">
|
|
|
+ <a-input
|
|
|
+ v-model:value="model[field]"
|
|
|
+ :disabled="disabled"
|
|
|
+ placeholder="自定义colSlot"
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
</template>
|
|
|
</BasicForm>
|
|
|
</CollapseContainer>
|
|
|
</PageWrapper>
|
|
|
</template>
|
|
|
-<script lang="ts">
|
|
|
+<script lang="tsx">
|
|
|
import { defineComponent, h } from 'vue';
|
|
|
import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
|
|
|
import { CollapseContainer } from '/@/components/Container/index';
|
|
|
import { useMessage } from '/@/hooks/web/useMessage';
|
|
|
- import { Input } from 'ant-design-vue';
|
|
|
+ import { Input, FormItem, Select } from 'ant-design-vue';
|
|
|
import { PageWrapper } from '/@/components/Page';
|
|
|
|
|
|
+ const custom_typeKey2typeValueRules = (model) => {
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ validator: (rule, value, callback) => {
|
|
|
+ if (!model.typeKey) return callback('请选择类型');
|
|
|
+ if (!model.typeValue) return callback('请输入数据');
|
|
|
+ callback();
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ };
|
|
|
const schemas: FormSchema[] = [
|
|
|
{
|
|
|
field: 'field1',
|
|
@@ -25,14 +46,18 @@
|
|
|
colProps: {
|
|
|
span: 8,
|
|
|
},
|
|
|
+ dynamicDisabled: ({ values }) => {
|
|
|
+ return !!values.field_disabled;
|
|
|
+ },
|
|
|
rules: [{ required: true }],
|
|
|
- render: ({ model, field }) => {
|
|
|
+ render: ({ model, field }, { disabled }) => {
|
|
|
return h(Input, {
|
|
|
placeholder: '请输入',
|
|
|
value: model[field],
|
|
|
- onChange: (e: ChangeEvent) => {
|
|
|
+ onChange: (e) => {
|
|
|
model[field] = e.target.value;
|
|
|
},
|
|
|
+ disabled,
|
|
|
});
|
|
|
},
|
|
|
},
|
|
@@ -43,10 +68,13 @@
|
|
|
colProps: {
|
|
|
span: 8,
|
|
|
},
|
|
|
+ dynamicDisabled: ({ values }) => {
|
|
|
+ return !!values.field_disabled;
|
|
|
+ },
|
|
|
rules: [{ required: true }],
|
|
|
- renderComponentContent: () => {
|
|
|
+ renderComponentContent: (_, { disabled }) => {
|
|
|
return {
|
|
|
- suffix: () => 'suffix',
|
|
|
+ suffix: () => (disabled ? 'suffix_disabled' : 'suffix_default'),
|
|
|
};
|
|
|
},
|
|
|
},
|
|
@@ -58,11 +86,136 @@
|
|
|
colProps: {
|
|
|
span: 8,
|
|
|
},
|
|
|
+ dynamicDisabled: ({ values }) => {
|
|
|
+ return !!values.field_disabled;
|
|
|
+ },
|
|
|
rules: [{ required: true }],
|
|
|
},
|
|
|
+ {
|
|
|
+ field: 'field4',
|
|
|
+ component: 'Input',
|
|
|
+ // label: 'renderColContent渲染',
|
|
|
+ /**!!!renderColContent 没有FormItem 包裹, 若想要 Form 提交需要带上数据须 <FormItem name={}></FormItem> 包裹: 示例如下*/
|
|
|
+ renderColContent({ model, field }, { disabled }) {
|
|
|
+ return (
|
|
|
+ <FormItem name="field4" label="renderColContent渲染" rules={[{ required: true }]}>
|
|
|
+ <Input placeholder="请输入" v-model:value={model[field]} disabled={disabled}></Input>
|
|
|
+ </FormItem>
|
|
|
+ );
|
|
|
+ },
|
|
|
+ colProps: {
|
|
|
+ span: 8,
|
|
|
+ },
|
|
|
+ dynamicDisabled: ({ values }) => {
|
|
|
+ return !!values.field_disabled;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ field: 'field5',
|
|
|
+ component: 'Input',
|
|
|
+ label: '自定义colSlot',
|
|
|
+ /**!!!renderColContent 没有FormItem 包裹, 若想要 Form 提交需要带上数据须 <FormItem name={}></FormItem> 包裹: 示例如下*/
|
|
|
+ colSlot: 'colSlot_field5',
|
|
|
+ colProps: {
|
|
|
+ span: 8,
|
|
|
+ },
|
|
|
+ dynamicDisabled: ({ values }) => {
|
|
|
+ return !!values.field_disabled;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ // 复合field 场景 自定义表单控件 一个控件包含多个表单录入 示例: 选择+输入
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ field: 'typeKey2',
|
|
|
+ defaultValue: '测试类型',
|
|
|
+ fields: ['typeValue2'],
|
|
|
+ defaultValueObj: { typeValue2: '默认测试_文字' },
|
|
|
+ component: 'Input',
|
|
|
+ label: '复合field render',
|
|
|
+ render({ model, field }, { disabled }) {
|
|
|
+ return (
|
|
|
+ <Input.Group compact>
|
|
|
+ <Select
|
|
|
+ disabled={disabled}
|
|
|
+ style="width: 120px"
|
|
|
+ allowClear
|
|
|
+ v-model:value={model[field]}
|
|
|
+ >
|
|
|
+ <Select.Option value="测试类型">测试类型</Select.Option>
|
|
|
+ <Select.Option value="测试名称">测试名称</Select.Option>
|
|
|
+ </Select>
|
|
|
+ <FormItem
|
|
|
+ name="typeValue2"
|
|
|
+ style="width: calc(100% - 120px); margin-left: -1px; border-right: 0; margin-bottom: 0;"
|
|
|
+ rules={[{ required: true }]}
|
|
|
+ >
|
|
|
+ <Input placeholder="请输入" v-model:value={model['typeValue2']} disabled={disabled} />
|
|
|
+ </FormItem>
|
|
|
+ </Input.Group>
|
|
|
+ );
|
|
|
+ },
|
|
|
+ colProps: {
|
|
|
+ span: 8,
|
|
|
+ },
|
|
|
+ dynamicDisabled: ({ values }) => {
|
|
|
+ return !!values.field_disabled;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ // 复合field 场景 自定义表单控件 一个控件包含多个表单录入 示例: 选择+输入
|
|
|
+ {
|
|
|
+ field: 'typeKey',
|
|
|
+ defaultValue: '公司名称',
|
|
|
+ fields: ['typeValue'],
|
|
|
+ defaultValueObj: { typeValue: '默认文字' },
|
|
|
+ component: 'Input',
|
|
|
+ // label: 'renderColContent渲染',
|
|
|
+ /**!!!renderColContent 没有FormItem 包裹, 若想要 Form 提交需要带上数据须 <FormItem name={}></FormItem> 包裹: 示例如下*/
|
|
|
+ renderColContent({ model, field }, { disabled }) {
|
|
|
+ return (
|
|
|
+ <FormItem
|
|
|
+ name="typeKey"
|
|
|
+ label="复合field renderColContent"
|
|
|
+ rules={custom_typeKey2typeValueRules(model)}
|
|
|
+ >
|
|
|
+ <Input.Group compact>
|
|
|
+ <Select
|
|
|
+ allowClear
|
|
|
+ disabled={disabled}
|
|
|
+ style="width: 120px"
|
|
|
+ v-model:value={model[field]}
|
|
|
+ >
|
|
|
+ <Select.Option value="公司名称">公司名称</Select.Option>
|
|
|
+ <Select.Option value="产品名称">产品名称</Select.Option>
|
|
|
+ </Select>
|
|
|
+ <Input
|
|
|
+ style="width: calc(100% - 120px); margin-left: -1px;"
|
|
|
+ placeholder="请输入"
|
|
|
+ v-model:value={model['typeValue']}
|
|
|
+ disabled={disabled}
|
|
|
+ />
|
|
|
+ </Input.Group>
|
|
|
+ </FormItem>
|
|
|
+ );
|
|
|
+ },
|
|
|
+ colProps: {
|
|
|
+ span: 16,
|
|
|
+ },
|
|
|
+ dynamicDisabled: ({ values }) => {
|
|
|
+ return !!values.field_disabled;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ field: 'field_disabled',
|
|
|
+ component: 'Switch',
|
|
|
+ label: '是否禁用 编辑字段',
|
|
|
+ colProps: {
|
|
|
+ span: 8,
|
|
|
+ },
|
|
|
+ labelWidth: 200,
|
|
|
+ },
|
|
|
];
|
|
|
export default defineComponent({
|
|
|
- components: { BasicForm, CollapseContainer, PageWrapper, [Input.name]: Input },
|
|
|
+ components: { BasicForm, CollapseContainer, PageWrapper, [Input.name]: Input, FormItem },
|
|
|
setup() {
|
|
|
const { createMessage } = useMessage();
|
|
|
const [register, { setProps }] = useForm({
|
|
@@ -76,6 +229,7 @@
|
|
|
register,
|
|
|
schemas,
|
|
|
handleSubmit: (values: any) => {
|
|
|
+ console.log('submit values', values);
|
|
|
createMessage.success('click search,values:' + JSON.stringify(values));
|
|
|
},
|
|
|
setProps,
|