From e5f9106caa97240888015f112916bdd2b77724b5 Mon Sep 17 00:00:00 2001 From: Saleri <1665800095@qq.com> Date: Sun, 31 May 2026 15:03:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(@core/form-ui):=20=E6=96=B0=E5=A2=9E=20use?= =?UTF-8?q?VbenForm=20=E6=95=B0=E7=BB=84=E7=BC=96=E8=BE=91=E5=99=A8=20Vben?= =?UTF-8?q?FormFieldArray?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/locales/langs/en-US/demos.json | 1 + .../src/locales/langs/zh-CN/demos.json | 1 + .../src/router/routes/modules/demos.ts | 8 + .../views/demos/naive/array-form/index.vue | 123 ++++++++++++ .../src/components/form-field-array.vue | 177 ++++++++++++++++++ packages/@core/ui-kit/form-ui/src/config.ts | 3 + packages/@core/ui-kit/form-ui/src/index.ts | 1 + packages/@core/ui-kit/form-ui/src/types.ts | 27 +++ 8 files changed, 341 insertions(+) create mode 100644 apps/web-naive/src/views/demos/naive/array-form/index.vue create mode 100644 packages/@core/ui-kit/form-ui/src/components/form-field-array.vue diff --git a/apps/web-naive/src/locales/langs/en-US/demos.json b/apps/web-naive/src/locales/langs/en-US/demos.json index 5be6cdd58..b02a97de3 100644 --- a/apps/web-naive/src/locales/langs/en-US/demos.json +++ b/apps/web-naive/src/locales/langs/en-US/demos.json @@ -3,6 +3,7 @@ "naive": "Naive UI", "table": "Table", "form": "Form", + "arrayForm": "Array Editor", "vben": { "title": "Project", "about": "About", diff --git a/apps/web-naive/src/locales/langs/zh-CN/demos.json b/apps/web-naive/src/locales/langs/zh-CN/demos.json index d818cb5cf..b35cb934f 100644 --- a/apps/web-naive/src/locales/langs/zh-CN/demos.json +++ b/apps/web-naive/src/locales/langs/zh-CN/demos.json @@ -3,6 +3,7 @@ "naive": "Naive UI", "table": "Table", "form": "表单", + "arrayForm": "数组编辑器", "vben": { "title": "项目", "about": "关于", diff --git a/apps/web-naive/src/router/routes/modules/demos.ts b/apps/web-naive/src/router/routes/modules/demos.ts index 5e49ffa01..9a4ffeff6 100644 --- a/apps/web-naive/src/router/routes/modules/demos.ts +++ b/apps/web-naive/src/router/routes/modules/demos.ts @@ -37,6 +37,14 @@ const routes: RouteRecordRaw[] = [ path: '/demos/form', component: () => import('#/views/demos/form/basic.vue'), }, + { + meta: { + title: $t('demos.arrayForm'), + }, + name: 'ArrayForm', + path: '/demos/array-form', + component: () => import('#/views/demos/naive/array-form/index.vue'), + }, ], }, ]; diff --git a/apps/web-naive/src/views/demos/naive/array-form/index.vue b/apps/web-naive/src/views/demos/naive/array-form/index.vue new file mode 100644 index 000000000..f08551e9b --- /dev/null +++ b/apps/web-naive/src/views/demos/naive/array-form/index.vue @@ -0,0 +1,123 @@ + + + diff --git a/packages/@core/ui-kit/form-ui/src/components/form-field-array.vue b/packages/@core/ui-kit/form-ui/src/components/form-field-array.vue new file mode 100644 index 000000000..1d7a0730a --- /dev/null +++ b/packages/@core/ui-kit/form-ui/src/components/form-field-array.vue @@ -0,0 +1,177 @@ + + + diff --git a/packages/@core/ui-kit/form-ui/src/config.ts b/packages/@core/ui-kit/form-ui/src/config.ts index 645f51f3b..9448d2ac1 100644 --- a/packages/@core/ui-kit/form-ui/src/config.ts +++ b/packages/@core/ui-kit/form-ui/src/config.ts @@ -20,6 +20,8 @@ import { globalShareState } from '@vben-core/shared/global-state'; import { defineRule } from 'vee-validate'; +import VbenFormFieldArray from './components/form-field-array.vue'; + const DEFAULT_MODEL_PROP_NAME = 'modelValue'; export const DEFAULT_FORM_COMMON_CONFIG: FormCommonConfig = {}; @@ -28,6 +30,7 @@ export const COMPONENT_MAP: Record = { DefaultButton: h(VbenButton, { size: 'sm', variant: 'outline' }), PrimaryButton: h(VbenButton, { size: 'sm', variant: 'default' }), VbenCheckbox, + VbenFormFieldArray, VbenInput, VbenInputPassword, VbenPinInput, diff --git a/packages/@core/ui-kit/form-ui/src/index.ts b/packages/@core/ui-kit/form-ui/src/index.ts index 9bb3fd33c..90006842f 100644 --- a/packages/@core/ui-kit/form-ui/src/index.ts +++ b/packages/@core/ui-kit/form-ui/src/index.ts @@ -4,6 +4,7 @@ export type { BaseFormComponentType, ExtendedFormApi, FormLayout, + VbenFormFieldArrayProps, VbenFormProps, FormSchema as VbenFormSchema, } from './types'; diff --git a/packages/@core/ui-kit/form-ui/src/types.ts b/packages/@core/ui-kit/form-ui/src/types.ts index 41ef5f329..3e3729c2d 100644 --- a/packages/@core/ui-kit/form-ui/src/types.ts +++ b/packages/@core/ui-kit/form-ui/src/types.ts @@ -14,6 +14,7 @@ export type BaseFormComponentType = | 'DefaultButton' | 'PrimaryButton' | 'VbenCheckbox' + | 'VbenFormFieldArray' | 'VbenInput' | 'VbenInputPassword' | 'VbenPinInput' @@ -307,6 +308,32 @@ export type FormSchema< P extends Record = Record, > = FormSchemaDiscriminated | FormSchemaFallback; +/** + * 数组编辑器(VbenFormFieldArray)的组件参数 + */ +export interface VbenFormFieldArrayProps< + T extends BaseFormComponentType = BaseFormComponentType, + P extends Record = Record, +> { + /** 操作列表头文案 */ + actionText?: string; + /** 「添加」按钮文案 */ + addButtonText?: string; + /** 新增一行时生成的默认数据;缺省时按列定义的 fieldName 生成空对象 */ + createRow?: () => Record; + disabled?: boolean; + /** 空数据文案 */ + emptyText?: string; + /** 最多行数 */ + max?: number; + /** 最少行数 */ + min?: number; + /** 列定义,每一列是一个子字段(复用 FormSchema) */ + schema: FormSchema[]; + /** 是否显示序号列 */ + showIndex?: boolean; +} + export type HandleSubmitFn = ( values: Record, ) => Promise | void;