游乐游手机版
首页/前端开发/文章详情

DTO中Form Layout配置复杂表单支持Tabs/Groups/Sections

时间:2026-07-19 20:12
在DTO中通过FormLayout配置复杂表单布局,支持字段排序、分组、响应式分栏及标签页拆分。布局仅控制字段位置,字段类型与校验仍由schema负责,实现了结构与行为的清晰分离,使布局与业务逻辑解耦,便于维护和扩展。

Cabloy 的 Form Layout 组件正是为应对这一挑战而诞生。它允许开发者在 DTO 中定义字段在表单中的位置与层级关系,前端则依据这份配置自动渲染布局。

在 DTO 中使用 Form Layout 配置复杂表单,支持 Tabs/Groups/Sections

其核心设计理念十分清晰:Form Layout 仅专注于“字段的定位”,而字段类型、校验规则等行为逻辑,仍由原有的 schema 和表单配置独立处理。


Form Layout 的主要功能

通过 Form Layout,我们可以在 DTO 中轻松实现以下常见需求:

  • 自由调整字段的显示顺序;
  • 将相关字段归入带有标题的业务分组;
  • 在桌面端实现多列布局,在移动端自动切换为单列;
  • 将“基本信息”“培训记录”等相互独立的内容,拆分到不同的 Tab 标签页;
  • 让 Create、Update、View 等不同表单场景共享统一的布局方案。

它常用的几个节点并不复杂:

  • field:用于放置单个字段;
  • section:将字段排列为一列或多列;
  • group:将相关字段组织成一个业务分组;
  • tabs / tab:将不同业务内容分配到独立的标签页中。

示例:使用 Form Layout 组织 Student 表单

以下代码片段摘自 Student Create DTO 中与 Form Layout 相关的配置。为突出布局结构,我们省略了 DTO 的外层定义、页面操作及其他字段配置。

 复制代码ZovaRender.block('basic-form:blockFormLayout', {
  formLayout: {
    children: [
      {
        type: 'tabs',
        children: [
          {
            type: 'tab',
            title: $locale('BasicInformation'),
            children: [
              {
                type: 'group',
                title: $locale('StudentProfile'),
                children: [
                  {
                    type: 'section',
                    columns: { default: 1, md: 2 },
                    children: [
                      { type: 'field', name: 'name' },
                      { type: 'field', name: 'mobile' },
                      {
                        type: 'field',
                        name: 'imageId',
                        span: { default: 1, md: 2 },
                      },
                    ],
                  },
                ],
              },
            ],
          },
          {
            type: 'tab',
            title: $locale('TrainingRecords'),
            children: [
              { type: 'field', name: 'level' },
              { type: 'field', name: 'trainingRecords' },
            ],
          },
        ],
      },
    ],
  },
});

从外到内依次解读这段代码,便能清晰理解其最终呈现的布局效果。

1. tabstab:按业务区域划分页面

最外层的 tabs 创建了一组标签页。这里有两个 tab

  • BasicInformation:基本信息;
  • TrainingRecords:培训记录。

当表单包含多个彼此独立的业务区域时,Tab 标签页能帮助用户每次只聚焦当前内容。当然,字段较少时无需强行使用 Tab,直接分组通常更为直观。

2. group:为相关字段划定归属分组

在基本信息标签页中,group 的标题为 StudentProfile,它将姓名、手机号和头像统一归入“学员资料”这一共同语义下。

我们可以将 group 理解为带有标题的业务分组。联系方式、收货地址、审批信息等场景,都非常适合使用 Group 来组织。

3. section:控制响应式分栏布局

columns: { default: 1, md: 2 } 表示默认使用单列,当屏幕宽度达到 md 及以上断点时,自动切换为两列。因此,namemobile 两个字段在桌面端可并排显示,在移动端则自然变为上下排列。

4. field:引用 DTO 中已定义的字段

每个 field 通过 name 属性关联 DTO schema 中的字段,例如 name。其输入控件、标题和校验规则,均沿用字段自身已有的定义。

值得留意的是 imageId 的配置:span: { default: 1, md: 2 } 表示默认单列时占一列,而在两列布局中则横跨两列。这种设置非常适合头像、备注、说明等需要独占一行的字段。

如何选择合适的布局节点

第一次配置 Form Layout 时,可以从最小结构开始尝试:

需求建议使用
仅需调整字段顺序field
希望在宽屏并排显示字段section
希望相关字段拥有共同标题和边界group
希望拆分完全独立的业务内容tabs / tab

一个常见的组合策略是:Tab 划分业务区域,Group 体现业务分组,Section 处理响应式分栏,Field 放置具体字段。

不过需要提醒:切忌为了追求层级“完整”而套用所有容器。简单的表单,使用 field 即可;需要两列布局时再加 section;字段确属于同一业务块时,才考虑添加 group

一个容易被忽略的要点

Form Layout 控制的是字段的布局位置,而非字段的可见性配置。

如果某个字段不应显示,正确的做法是在字段自身的 schema metadata 中设置可见性。仅仅不将其写入 formLayout,并不等同于隐藏该字段;因为可见字段仍可能出现在表单末尾。

总结

Form Layout 让我们可以在 DTO 中描述复杂表单的结构:

  • 使用 field 决定字段顺序;
  • 使用 section 实现响应式分栏;
  • 使用 group 表达业务分组;
  • 使用 tabs / tab 拆分独立内容。

牢记这一分工即可:DTO 描述字段结构,schema 和表单运行时负责字段的行为逻辑。 当表单字段增加或调整时,只需同步修改 DTO 中的布局配置,无需在多个页面重复维护字段的排列方式。

延伸阅读

  • Form Layout Guide
  • Form Guide
  • Student Create DTO 示例
来源:https://juejin.cn/post/7663390191793176626
上一篇垂直对齐(vertical-align)在项目中的实际应用与优化策略 下一篇时间选择器仅在获得焦点时设置默认值的方法
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
如何用纯CSS实现移动端双列Flex容器子元素交替排列
前端开发 · 2026-07-20

如何用纯CSS实现移动端双列Flex容器子元素交替排列

在移动端响应式布局中,使用`display:contents`消除列容器布局边界,使子元素直接成为Flex项目,再配合`order`属性即可实现跨列交错排列,无需JavaScript干预,从而简化代码、提升性能与自适应能力。

根据视口可见性动态控制固定按钮的显示与隐藏
前端开发 · 2026-07-20

根据视口可见性动态控制固定按钮的显示与隐藏

利用getBoundingClientRect()检测目标按钮是否进入视口,滚动时实时控制另一固定按钮的显隐,确保两者永不同时可见。采用严格边界判断,配合requestAnimationFrame节流,用visibility:hidden隐藏以保留布局空间,适用于电商购物车等场景。

每个折叠区域独立控制展开收起的方法
前端开发 · 2026-07-20

每个折叠区域独立控制展开收起的方法

在React中实现多段可折叠内容独立展开收起,核心是为每个区域维护独立状态而非共享布尔值。推荐在map内使用useState,或自定义Hook基于唯一ID管理状态,避免依赖标题作为标识,确保key稳定唯一。

移动端菜单点击导航栏外部自动关闭实现方法
前端开发 · 2026-07-20

移动端菜单点击导航栏外部自动关闭实现方法

利用useRef和useEffect监听全局点击事件,通过contains方法判断点击目标是否在菜单容器外,并排除菜单按钮自身触发,实现移动端导航栏点击外部区域时自动关闭菜单,有效防止误关闭,从而显著提升用户交互体验。

JavaScript计数器数字拼接而非累加问题的修复方法
前端开发 · 2026-07-20

JavaScript计数器数字拼接而非累加问题的修复方法

JavaScript中,使用textContent获取计数器值时返回字符串,故直接使用+=运算符会导致数字拼接而非数值累加。需显式将字符串转为数字,推荐使用Number()或一元加号,以确保正确递增。这是常见陷阱,在循环中尤其需要注意类型转换。