当前位置: 首页 > news >正文

【详解ProTable源码】高级筛选栏如何实现一行五列

实现方式

<ProTablerowKey='id'search={{span: 5,defaultFormItemsNumber: 4,submitterColSpanProps: {// @ts-ignorespan: 'auto',flex: '20',},
/>

源码解析

https://github.com/ant-design/pro-components/blob/master/packages/form/src/layouts/QueryFilter/index.tsx

spanSize

spanSize 决定了每行可容纳的表单项个数。

const spanSize = useMemo(() => getSpanConfig(layout, width + 16, span),[layout, width, span],
);

getSpanConfig

getSpanConfig返回一个对象,包含spanlayout属性。

  1. 如果传入的span是一个具体数字,就直接返回这个值,不需要做响应式适配。

  2. 如果传入的span是一个响应式对象(例如span = { sm: 3, md: 2 }),生成spanConfig
    spanConfig 是一个二维数组, 其中每个元素可以是 stringnumber 类型。 每个数组包含三项:
    a. 对应断点的最大宽度(如 xs, sm, md 等对应的宽度)。
    b. 每个表单项的 span 宽度,计算方式是 24 / span[key],这里 24 是栅格系统的总列数。
    c. 布局方式,默认为 'horizontal'

  3. 如果未传入span,使用默认断点配置。

找到当前width落在哪个断点区间,加了16是考虑row的-8pxmargin的两侧padding。

  • 如果找不到断点(例如宽度特别大或异常),默认使用span = 8layout = 'horizontal'
  • 否则使用找到的断点的配置值
const getSpanConfig = (layout: FormProps['layout'],width: number,span?: SpanConfig,
): { span: number; layout: FormProps['layout'] } => {if (span && typeof span === 'number') {return {span,layout,};}const spanConfig: (string | number)[][] = span? ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].map((key) => [CONFIG_SPAN_BREAKPOINTS[key as 'xs'],24 / (span as any)[key as 'sm'],'horizontal',]): BREAKPOINTS[(layout as 'default') || 'default'];const breakPoint = (spanConfig || BREAKPOINTS.default).find((item) => width < (item[0] as number) + 16, // 16 = 2 * (ant-row -8px margin));if (!breakPoint) {return {span: 8,layout: 'horizontal',};}return {span: 24 / (breakPoint[1] as number),layout: breakPoint?.[2] as 'horizontal',};
};

showLength

用于控制默认展示几个表单项,避免换行。

const showLength = useMemo(() => {if (defaultFormItemsNumber !== undefined) {return defaultFormItemsNumber;}if (defaultColsNumber !== undefined) {// 折叠为一行,需要处理多行的情况请使用 defaultFormItemsNumberconst oneRowControlsNumber = 24 / spanSize.span - 1;return defaultColsNumber > oneRowControlsNumber? oneRowControlsNumber: defaultColsNumber;}return Math.max(1, 24 / spanSize.span - 1);
}, [defaultColsNumber, defaultFormItemsNumber, spanSize.span]);

defaultFormItemsNumber代表默认展示几个表单项,span是配置列数,一般而言是 8 的倍数。

  1. defaultFormItemsNumber存在时,以defaultFormItemsNumber的值为主
  2. defaultColsNumber存在时,会根据spanSize.span获得一行能放几个表单项oneRowControlsNumber,即const oneRowControlsNumber = 24 / spanSize.span - 1;。当defaultColsNumber > oneRowControlsNumber时,则返回oneRowControlsNumber,否则返回defaultColsNumber
  3. defaultFormItemsNumberdefaultColsNumber都不存在时,返回Math.max(1, 24 / spanSize.span - 1)

即 “最多一行展示多少减去一个按钮”,但最少保证展示一个。

processedList

processedList 用于遍历所有表单项,并根据 showLength 控制哪些需要折叠隐藏。

totalSize是用于计算当前一行的表单项数,当totalSize > showLength,则把剩下的表单项的hidden属性变为true进行隐藏

const processedList = flatMapItems(items, props.ignoreRules).map((item,index,): { itemDom: React.ReactNode; hidden: boolean; colSpan: number } => {// 如果 formItem 自己配置了 hidden,默认使用它自己的const colSize = React.isValidElement < any > (item)? (item?.props?.colSize ?? 1): 1;const colSpan = Math.min(spanSize.span * (colSize || 1), 24);// 计算总的 totalSpan 长度totalSpan += colSpan;// 计算总的 colSize 长度totalSize += colSize;// ........................................const hidden: boolean =(item as ReactElement<{ hidden: boolean }>)?.props?.hidden ||// 如果收起了(collapsed &&(firstRowFull ||// 如果 超过显示长度 且 总长度超过了 24totalSize > showLength) &&!!index);// ........................................return {itemDom: item,colSpan,hidden: false,};},
);

submitterColSpanProps

按钮栏配置,控制查询/重置按钮区域的样式

submitterColSpanProps 是一个可选属性,类型为一个对象。该对象使用 Omit 泛型去除了 ColProps 中的 ‘span’ 属性,并新增了一个 ‘span’ 属性,类型为 number 类型。也就是说,submitterColSpanProps 对象除了 ‘span’ 属性外,还可以包含 ColProps 中的其他所有属性。

spanSize.span也用于查询、重置按钮的span

当赋值给span的值为number类型的时候,他会给出现ant-col-number值 ant-col-offset-(24-number值)的css样式

所以在本示例中给出string类型的字符串'auto',则只会出现ant-col-auto,由于不存在这种css样式,所以会受到flex: '20'的影响

const offset = useMemo(() => {const offsetSpan =(currentSpan % 24) + (props.submitterColSpanProps?.span ?? spanSize.span);if (offsetSpan > 24) {return 24 - (props.submitterColSpanProps?.span ?? spanSize.span);}return 24 - offsetSpan;
}, [currentSpan,(currentSpan % 24) + (props.submitterColSpanProps?.span ?? spanSize.span),props.submitterColSpanProps?.span,
]);

代码解析

search={{span: 5,defaultFormItemsNumber: 4,submitterColSpanProps: {// @ts-ignorespan: 'auto',flex: '20',}
}}

由于有span: 5,spanSize

spanSize:{span:5,layout:'horizontal'
}
  1. 没有defaultFormItemsNumber: 4只有span: 5,则showLength = 3.8,因为向下取整,才会只展示3个
  2. defaultFormItemsNumbe: 4没有span:5,则showLength = 4。而span=8(默认),那么一行展示3个,但是由于defaultFormItemsNumber = 4,会换行展示1个,相当于两行。
  3. defaultFormItemsNumbe: 4span:5,则showLength = 4。而span=5,在24/5的情况下,向下取整一行展示4个,由于defaultFormItemsNumber = 4,不会换行展示。
http://www.dtcms.com/a/276306.html

相关文章:

  • Elasticsearch 的 `modules` 目录
  • AMD 锐龙 AI MAX+ 395 处理器与端侧 AI 部署的行业实践
  • 【华为OD】MVP争夺战2(C++、Java、Python)
  • 拼多多电商运营技巧---价格体系设置
  • 数据的计算与格式化
  • [Python] Flask 多线程绘图时报错“main thread is not in main loop”的解决方案
  • SuperClaude命令参考手册:AI编程革命中的20个核心指令详解
  • JavaEE多线程——锁策略 CAS synchronized优化
  • UI前端大数据可视化新探索:如何利用色彩心理学提升数据传达效果?
  • [vroom] 启发式算法(路径评估) | 局部搜索优化引擎 | 解决方案输出解析
  • 单向链表反转 如何实现
  • 蓝牙BT UUID的含义以及使用方法案例说明
  • 第十八天,7月12日,八股
  • 【MySQL笔记】事务的ACID特性与隔离级别
  • 动态规划基本操作
  • AutoGen框架官方文档梳理-完整学习指南
  • Java中的方法传参机制
  • 【工程数学基础】条件极值与拉格朗日乘数法
  • uniapp弹出手机键盘,布局被顶飞,导致页面混乱问题
  • 使用包管理工具CocoaPods、SPM、Carthage的利弊与趋势
  • C#与FX5U进行Socket通信
  • 数据结构之并查集和LRUCache
  • OGC:开放地理空间联盟简介
  • YOLO家族内战!v5/v8/v10谁才是你的真命天子?(附保姆级选择指南)
  • SpringAI实现保存聊天记录到redis中
  • Softmax回归(多类逻辑回归)原理及完整代码示例实现
  • 如何查询服务器的操作系统
  • 算法题(173):枚举排列
  • Arduino 无线通信实战:使用 RadioHead实现 315MHz 433M模块数据传输
  • MS Azure Eventhub 发送 AD log 到cribl