ming4762
6 months ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with
69 additions and
7 deletions
-
docs/src/components/common-ui/vben-form.md
-
packages/@core/ui-kit/form-ui/src/components/form-actions.vue
-
packages/@core/ui-kit/form-ui/src/form-render/form.vue
-
packages/@core/ui-kit/form-ui/src/types.ts
-
playground/src/views/examples/form/query.vue
|
|
|
@ -304,7 +304,7 @@ useVbenForm 返回的第二个参数,是一个对象,包含了一些表单 |
|
|
|
|
|
|
|
| 属性名 | 描述 | 类型 | 默认值 | |
|
|
|
| --- | --- | --- | --- | |
|
|
|
| layout | 表单项布局 | `'horizontal' \| 'vertical'` | `horizontal` | |
|
|
|
| layout | 表单项布局 | `'horizontal' \| 'vertical'\| 'inline'` | `horizontal` | |
|
|
|
| showCollapseButton | 是否显示折叠按钮 | `boolean` | `false` | |
|
|
|
| wrapperClass | 表单的布局,基于tailwindcss | `any` | - | |
|
|
|
| actionWrapperClass | 表单操作区域class | `any` | - | |
|
|
|
|
|
|
|
@ -82,11 +82,11 @@ const actionWrapperClass = computed(() => { |
|
|
|
|
|
|
|
const cls = [ |
|
|
|
'flex', |
|
|
|
'w-full', |
|
|
|
'items-center', |
|
|
|
'gap-3', |
|
|
|
props.compact ? 'pb-2' : 'pb-4', |
|
|
|
props.layout === 'vertical' ? 'self-end' : 'self-center', |
|
|
|
props.layout === 'inline' ? '' : 'w-full', |
|
|
|
props.actionWrapperClass, |
|
|
|
]; |
|
|
|
|
|
|
|
|
|
|
|
@ -42,11 +42,13 @@ const emits = defineEmits<{ |
|
|
|
}>(); |
|
|
|
|
|
|
|
const wrapperClass = computed(() => { |
|
|
|
const cls = ['flex flex-col']; |
|
|
|
const cls = ['flex']; |
|
|
|
if (props.layout === 'vertical') { |
|
|
|
cls.push(props.compact ? 'gap-x-2' : 'gap-x-4'); |
|
|
|
cls.push(props.compact ? 'gap-x-2' : 'gap-x-4', 'flex-col grid'); |
|
|
|
} else if (props.layout === 'inline') { |
|
|
|
cls.push('flex-wrap gap-2'); |
|
|
|
} else { |
|
|
|
cls.push('gap-2'); |
|
|
|
cls.push('gap-2 flex-col grid'); |
|
|
|
} |
|
|
|
return cn(...cls, props.wrapperClass); |
|
|
|
}); |
|
|
|
@ -170,7 +172,7 @@ const computedSchema = computed( |
|
|
|
|
|
|
|
<template> |
|
|
|
<component :is="formComponent" v-bind="formComponentProps"> |
|
|
|
<div ref="wrapperRef" :class="wrapperClass" class="grid"> |
|
|
|
<div ref="wrapperRef" :class="wrapperClass"> |
|
|
|
<template v-for="cSchema in computedSchema" :key="cSchema.fieldName"> |
|
|
|
<!-- <div v-if="$slots[cSchema.fieldName]" :class="cSchema.formItemClass"> |
|
|
|
<slot :definition="cSchema" :name="cSchema.fieldName"> </slot> |
|
|
|
|
|
|
|
@ -8,7 +8,7 @@ import type { ClassType, MaybeComputedRef } from '@vben-core/typings'; |
|
|
|
|
|
|
|
import type { FormApi } from './form-api'; |
|
|
|
|
|
|
|
export type FormLayout = 'horizontal' | 'vertical'; |
|
|
|
export type FormLayout = 'horizontal' | 'inline' | 'vertical'; |
|
|
|
|
|
|
|
export type BaseFormComponentType = |
|
|
|
| 'DefaultButton' |
|
|
|
|
|
|
|
@ -86,6 +86,62 @@ const [QueryForm] = useVbenForm({ |
|
|
|
wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3', |
|
|
|
}); |
|
|
|
|
|
|
|
const [InlineForm] = useVbenForm({ |
|
|
|
layout: 'inline', |
|
|
|
schema: [ |
|
|
|
{ |
|
|
|
// 组件需要在 #/adapter.ts内注册,并加上类型 |
|
|
|
component: 'Input', |
|
|
|
// 对应组件的参数 |
|
|
|
componentProps: { |
|
|
|
placeholder: '请输入用户名', |
|
|
|
}, |
|
|
|
// 字段名 |
|
|
|
fieldName: 'username', |
|
|
|
// 界面显示的label |
|
|
|
label: '字符串', |
|
|
|
}, |
|
|
|
{ |
|
|
|
component: 'InputPassword', |
|
|
|
componentProps: { |
|
|
|
placeholder: '请输入密码', |
|
|
|
}, |
|
|
|
fieldName: 'password', |
|
|
|
label: '密码', |
|
|
|
}, |
|
|
|
{ |
|
|
|
component: 'InputNumber', |
|
|
|
componentProps: { |
|
|
|
placeholder: '请输入', |
|
|
|
}, |
|
|
|
fieldName: 'number', |
|
|
|
label: '数字(带后缀)', |
|
|
|
suffix: () => '¥', |
|
|
|
}, |
|
|
|
{ |
|
|
|
component: 'Select', |
|
|
|
componentProps: { |
|
|
|
allowClear: true, |
|
|
|
filterOption: true, |
|
|
|
options: [ |
|
|
|
{ |
|
|
|
label: '选项1', |
|
|
|
value: '1', |
|
|
|
}, |
|
|
|
{ |
|
|
|
label: '选项2', |
|
|
|
value: '2', |
|
|
|
}, |
|
|
|
], |
|
|
|
placeholder: '请选择', |
|
|
|
showSearch: true, |
|
|
|
}, |
|
|
|
fieldName: 'options', |
|
|
|
label: '下拉选', |
|
|
|
}, |
|
|
|
], |
|
|
|
}); |
|
|
|
|
|
|
|
const [QueryForm1] = useVbenForm({ |
|
|
|
// 默认展开 |
|
|
|
collapsed: true, |
|
|
|
@ -205,6 +261,10 @@ function onSubmit(values: Record<string, any>) { |
|
|
|
<QueryForm /> |
|
|
|
</Card> |
|
|
|
|
|
|
|
<Card class="mb-5" title="查询表单,单行表单"> |
|
|
|
<InlineForm /> |
|
|
|
</Card> |
|
|
|
|
|
|
|
<Card class="mb-5" title="查询表单,默认展开,垂直布局"> |
|
|
|
<QueryForm2 /> |
|
|
|
</Card> |
|
|
|
|