环境
react:17.0.2
antd:3.26.20
问题
表格头列宽度和表格体列宽度不一致,表格错乱
解决
针对这个问题官方github
仓库里面有专门的issues
https://github.com/ant-design/ant-design/issues/13825
里面给出了几种解决方案:
-
在
columns
设置中加上固定宽度const columns = [{title: "Name",dataIndex: "name",width: 200,},{title: "Address",dataIndex: "address",width:200,} ];
这种解决方案成功概率很低,基本是无用的,因为我遇到问题时都设置了固定宽度
-
设置长数字和长单词换行,与
ellipsis
配置结合columns={[{...textWrap: 'word-break',ellipsis: true, }]}
在 3.24.0 之前,你需要针对超长字段的列增加折断样式:
columns={[{...render: (text, record) => (<div style={{ wordWrap: 'break-word', wordBreak: 'break-word' }}>{text}</div>), }]}
尝试上面的方案进行处理之后仍然没有解决问题
-
重置表格样式
.ant-table-fixed {table-layout: fixed; } .ant-table-tbody > tr > td {word-wrap: break-word;word-break: break-all; }
最后尝试也没成功,看来还是要靠自己
分析
出现问题的列,设置了ellipsis
,会有不换行的样式,数据又出现非常长的,导致表格行被撑大了(只有表格体部分变大,表格头没变,出现了错乱),虽然表格列设置了宽度,审查元素也能看到表格头部分设置了宽度(在表格体部分单独的table
标签),但是宽度并不能限制住不换行的长内容撑开盒子,所以问题的关键是限制住表格体那一列的宽度。
限制宽度可以使用max-width
,那么给出现问题的列增加max-width
样式就可以解决问题
-
增加
className
columns={[{...width: 150,className: 'limit-width', }]}
.limit-width {max-width: 150px; }
-
设置行内样式
columns={[{...width: 150,onCell: () => {return {style: {maxWidth: 150,}}}, }]}
彩蛋
一维数组转化成树形结构的低复杂度方法
一般情况下一维数组转化成树形结构会采取递归方法,这种方法好理解,但是当这个一维数组特别庞大时,就会导致内存溢出。下面方法可以解决
export function generateTree(flatArr) {const tree = [];const map = new Map();// 将所有节点存储到map中flatArr.forEach((node) => {map.set(node.id, node)});// 遍历所有节点,将其添加到对应的父节点下flatArr.forEach((node) => {const parent = map.get(node.parentId);// 存在父节点,添加在父节点的childrenif (parent) {if (parent.children) {parent.children.push(node);} else {parent.children = [node];}} else {// 不存在父节点,说明是顶层节点tree.push(node);}});return tree;
}