Browse Source
* chore: table size放到settings * chore(TableAction): 操作确认框增加placement属性支持 * chore(Form): 表单field支持a.b.c嵌套写法 * feat(Form): add TabsForm demo Co-authored-by: jinmao88 <50581550+jinmao88@users.noreply.github.com>pull/1758/merge
committed by
GitHub
4 changed files with 146 additions and 0 deletions
@ -0,0 +1,136 @@ |
|||
<template> |
|||
<PageWrapper title="标签页+多级field表单" v-loading="loading"> |
|||
<div class="mb-4"> |
|||
<a-button @click="handleReset" class="mr-2"> 重置表单 </a-button> |
|||
<a-button @click="handleSetValues" class="mr-2"> 设置默认值 </a-button> |
|||
<a-button @click="handleSubmit" class="mr-2" type="primary"> 提交表单 </a-button> |
|||
</div> |
|||
<CollapseContainer title="标签页+多级field表单"> |
|||
<Tabs v-model:activeKey="activeKey"> |
|||
<TabPane |
|||
v-for="item in tabsFormSchema" |
|||
:key="item.key" |
|||
v-bind="omit(item, ['Form', 'key'])" |
|||
> |
|||
<BasicForm @register="item.Form[0]" /> |
|||
</TabPane> |
|||
</Tabs> |
|||
</CollapseContainer> |
|||
</PageWrapper> |
|||
</template> |
|||
|
|||
<script lang="ts"> |
|||
import { ref, defineComponent } from 'vue'; |
|||
import { Tabs } from 'ant-design-vue'; |
|||
import { PageWrapper } from '/@/components/Page'; |
|||
import { CollapseContainer } from '/@/components/Container'; |
|||
import { useMessage } from '/@/hooks/web/useMessage'; |
|||
import { omit } from 'lodash-es'; |
|||
import { deepMerge } from '/@/utils'; |
|||
import { BasicForm, FormSchema, useForm, FormProps, UseFormReturnType } from '/@/components/Form'; |
|||
|
|||
export default defineComponent({ |
|||
name: 'TabsFormDemo', |
|||
components: { Tabs, TabPane: Tabs.TabPane, PageWrapper, CollapseContainer, BasicForm }, |
|||
setup() { |
|||
type TabsFormType = { |
|||
key: string; |
|||
tab: string; |
|||
forceRender?: boolean; |
|||
Form: UseFormReturnType; |
|||
}; |
|||
|
|||
const { createMessage } = useMessage(); |
|||
const activeKey = ref('tabs2'); |
|||
const loading = ref(false); |
|||
const tabsFormSchema: TabsFormType[] = []; |
|||
|
|||
// 公共属性 |
|||
const baseFormConfig: Partial<FormProps> = { |
|||
showActionButtonGroup: false, |
|||
labelWidth: 100, |
|||
}; |
|||
|
|||
// 为每个字段模拟默认值, { tabs1: { field1: '', field2: '' }, tabs2: { field1: '' }, ... } |
|||
const mockDefaultValue: Recordable = {}; |
|||
|
|||
// 模拟5个标签页 |
|||
for (let i = 1; i <= 5; ++i) { |
|||
const tabsKey = `tabs${i}`; |
|||
|
|||
// 每个标签页8个字段 |
|||
const schemas: FormSchema[] = []; |
|||
const row: Recordable = {}; |
|||
|
|||
for (let j = 1; j <= 8; ++j) { |
|||
schemas.push({ |
|||
field: `${tabsKey}.field${j}`, |
|||
label: `${tabsKey}-field${j}`, |
|||
component: 'Input', |
|||
colProps: { span: 24 }, |
|||
}); |
|||
row[`field${j}`] = `field: ${tabsKey}.field${j}, default value`; |
|||
} |
|||
|
|||
mockDefaultValue[tabsKey] = row; |
|||
|
|||
tabsFormSchema.push({ |
|||
key: tabsKey, |
|||
tab: tabsKey, |
|||
forceRender: true, |
|||
Form: useForm(Object.assign({ schemas }, baseFormConfig) as FormProps), |
|||
}); |
|||
} |
|||
|
|||
async function handleReset() { |
|||
for (const item of tabsFormSchema) { |
|||
const { resetFields } = item.Form[1]; |
|||
await resetFields(); |
|||
} |
|||
} |
|||
|
|||
async function handleSubmit() { |
|||
let lastKey = ''; |
|||
loading.value = true; |
|||
try { |
|||
const values: Recordable = {}; |
|||
for (const item of tabsFormSchema) { |
|||
lastKey = item.key; |
|||
const { validate, getFieldsValue } = item.Form[1]; |
|||
await validate(); |
|||
// 表单已支持多级key |
|||
deepMerge(values, getFieldsValue()); |
|||
} |
|||
|
|||
console.log('submit values: ', values); |
|||
createMessage.success('提交成功!请打开控制台查看'); |
|||
} catch (e) { |
|||
// 验证失败或出错,切换到对应标签页 |
|||
activeKey.value = lastKey; |
|||
console.log(e); |
|||
} finally { |
|||
loading.value = false; |
|||
} |
|||
} |
|||
|
|||
async function handleSetValues() { |
|||
console.log('默认值为: ', mockDefaultValue); |
|||
for (const item of tabsFormSchema) { |
|||
const { setFieldsValue } = item.Form[1]; |
|||
await setFieldsValue(mockDefaultValue); |
|||
} |
|||
} |
|||
return { |
|||
omit, |
|||
loading, |
|||
activeKey, |
|||
tabsFormSchema, |
|||
handleReset, |
|||
handleSubmit, |
|||
handleSetValues, |
|||
}; |
|||
}, |
|||
}); |
|||
</script> |
|||
|
|||
<style scoped></style> |
|||
Loading…
Reference in new issue