🐛[BUG]BetaSchemaForm组件 使用查询表单 当第一列数据设置colSize=4时,设置的defaultColsNumber不生效,永远默认就只展示了一行数据
提问前先看看:
https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md
🐛 bug 描述
BetaSchemaForm组件 使用查询表单 当第一列数据设置colSize=4时(只要是大于内置的每行的列数都有问题),设置的defaultColsNumber不生效,永远默认就只展示了一行数据
📷 复现步骤
import type { ProFormColumnsType, ProFormLayoutType, } from "@ant-design/pro-components"; import { BetaSchemaForm, ProFormSelect } from "@ant-design/pro-components"; import { Alert, DatePicker, Space } from "antd"; import dayjs from "dayjs"; import { useState } from "react";
const columns = new Array(10).fill(1).map((, index) => {
return {
id: (Date.now() + index).toString(),
title: 活动名称${index},
colSize: index === 0 ? 1 : 1,
};
});
const columns1 = new Array(10).fill(1).map((, index) => {
return {
id: (Date.now() + index).toString(),
title: 活动名称${index},
colSize: index === 0 ? 4 : 1,
};
});
const columns2 = new Array(10).fill(1).map((_, index) => {
return {
id: (Date.now() + index).toString(),
title: 活动名称${index},
colSize: index === 1 ? 4 : 1,
};
});
export default () => {
return (
<>
!!! 第一行colSize=1 defaultColsNumber=10
<BetaSchemaForm<DataItem>
layoutType={"QueryFilter"}
defaultColsNumber={10}
columns={columns}
autoFocusFirstInput={false}
/>
!!! 第一行colSize=4 defaultColsNumber=10 显示错误 只能默认展开一行
<BetaSchemaForm<DataItem>
layoutType={"QueryFilter"}
defaultColsNumber={10}
columns={columns1}
autoFocusFirstInput={false}
/>
!!! 第二行colSize=4 defaultColsNumber=10 能正确显示
<BetaSchemaForm<DataItem>
layoutType={"QueryFilter"}
defaultColsNumber={10}
columns={columns2}
autoFocusFirstInput={false}
/>
</>
);
};
设置的三种方式 colSize只要第一列数据大于了设置的每行的列数 就只能显示默认展示一行 第二列数据设置colSize就是正确的
🏞 期望结果
当设置第一行为colSize>1时,设置的defaultColsNumber依然生效 有需求就是查询表单第一项需要整行展示,这个bug就无法实现这个需求
💻 复现代码
© 版本信息
- @ant-design/[email protected]
- umi 版本
- 浏览器环境
- 开发环境 [e.g. mac OS]
🚑 其他信息
这是一个已知的 BetaSchemaForm(QueryFilter 布局)bug:当第一列 colSize 设置较大(如 4),会导致 defaultColsNumber 不生效,只显示一行。根因是 QueryFilter 的内部逻辑会在第一项 colSpan=24 时(即占满整行)强制只展示一行,忽略 defaultColsNumber 的设置相关源码分析。
社区有多个类似反馈,维护者也确认了这个问题,并指出 defaultColsNumber 实际控制的是“控件数量”,不是“行数”相关讨论1 相关讨论2。如果你需要“默认展示多行”,建议升级到 2.8.6 及以上版本,使用 defaultFormItemsNumber 属性来控制默认展示的表单项数量,这样可以绕开 defaultColsNumber 的限制,满足你的需求官方说明。
简单总结:
- 这是组件的已知限制,老版本(1.60.1 之前)没有这个问题。
- 2.8.6+ 版本推荐用
defaultFormItemsNumber控制默认展示项数。 - 如果必须用旧版本,目前没有官方 workaround,只能调整表单结构或升级组件版本。
如需进一步自定义行为,只能自行修改 QueryFilter 的源码逻辑。
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
https://codesandbox.io/p/sandbox/fu-ceng-chuang-kou-forked-cl7pyy?file=%2FApp.tsx%3A34%2C46
你遇到的问题是 QueryFilter 的已知限制:当第一个表单项的 colSize 设置较大(比如 colSize=4,导致 colSpan=24 占满整行),组件内部会强制只展示一行,无论你设置 defaultFormItemsNumber 还是 defaultColsNumber 都不会生效。这是因为 collapse 展开逻辑优先判断第一行是否“满行”,只要满行就只显示这一行,后面的表单项会被隐藏,和你实际需求不符源码分析。
社区和维护者已经确认这是设计约束,不是 bug,且目前没有官方 workaround相关讨论1。即使升级到 2.8.6+ 并使用 defaultFormItemsNumber,也无法解决“第一项占整行但希望默认展示多行”的需求,firstRowFull 的逻辑仍然优先级最高。
如果你的场景必须第一项整行且要默认展开多行,目前只能考虑调整表单结构(比如把整行项放到后面),或者自定义 QueryFilter 的源码逻辑。可以关注后续社区讨论和 PR,看是否有更灵活的布局方案官方说明。
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other