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 1/3] =?UTF-8?q?feat(@core/form-ui):=20=E6=96=B0=E5=A2=9E?=
=?UTF-8?q?=20useVbenForm=20=E6=95=B0=E7=BB=84=E7=BC=96=E8=BE=91=E5=99=A8?=
=?UTF-8?q?=20VbenFormFieldArray?=
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 @@
+
+
+
+
+
+
+
+ |
+ #
+ |
+
+
+ |
+
+ {{ actionText }}
+ |
+
+
+
+
+ |
+ {{ index + 1 }}
+ |
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+
+ {{ emptyText }}
+
+
+
+
+ {{ addButtonText }}
+
+
+
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;
From 40101911f074ba9fbfd62003e01b95d5c2ba420a Mon Sep 17 00:00:00 2001
From: Saleri <1665800095@qq.com>
Date: Sun, 31 May 2026 16:14:27 +0800
Subject: [PATCH 2/3] style: format naive styles
---
packages/styles/src/naive/index.css | 1 -
1 file changed, 1 deletion(-)
diff --git a/packages/styles/src/naive/index.css b/packages/styles/src/naive/index.css
index cabfa7fd8..f97d55b05 100644
--- a/packages/styles/src/naive/index.css
+++ b/packages/styles/src/naive/index.css
@@ -24,4 +24,3 @@
font-family: Arial, Roboto, 'Helvetica Neue', sans-serif;
}
}
-
From 9ffd42f013825f94278165027bc210a5314d3998 Mon Sep 17 00:00:00 2001
From: Saleri <1665800095@qq.com>
Date: Sun, 31 May 2026 23:06:00 +0800
Subject: [PATCH 3/3] chore: add changeset for form field array
---
.changeset/fancy-ears-walk.md | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100644 .changeset/fancy-ears-walk.md
diff --git a/.changeset/fancy-ears-walk.md b/.changeset/fancy-ears-walk.md
new file mode 100644
index 000000000..38b077f35
--- /dev/null
+++ b/.changeset/fancy-ears-walk.md
@@ -0,0 +1,7 @@
+---
+"@vben/styles": patch
+"@vben-core/form-ui": patch
+"@vben/web-naive": patch
+---
+
+feat(@core/form-ui): 新增 useVbenForm 数组编辑器 VbenFormFieldArray