是
Table
目前的table列宽,只有width,min-width和fit属性。我们的需求是要根据数据循环输出不定列的table,其中有的列内容很多,有的内容很少。
能否增加新特性,使table能像原生表格一样被内容撑开,使得table列宽自适应内容呢?
谢谢:)
Hi,请问能否提供这个功能或组件的参考链接?
@element-bot 链接在这里 https://jsfiddle.net/pd7kbqoe/
赞同,希望支持!
同求。。。。数据格式不确定时候太丑了。应该是比如在50字以内不会换行,50字以上自动省略最好
希望支持,数据长度不定时确实很麻烦
目前个人实现是:
设置一个基准宽度,比如120px,内容转换为字符串长度为20,然后遍历列内容获取最长字符串长度len, 然后计算该列宽度为 120 * len / 20。
但是遍历表格所有内容就有个性能问题,所以这部分计算交给了服务器端,然后接口返回表头数据时,每个表头为一个对象,里面包含有关宽度的属性 col_width
值。
最后补充点个人看法:虽然这个功能的确需求很多,但是仔细想想,如果交给框架,要做到自适应,思路也差不多,一样会遇到性能问题,与其要求框架提供需求,不如自己想办法实现。
@yugasun 计算字符串长度给相应的宽度是一个思路,我之前也想过但是被否决了,原因如下:
1.前后端交互的数据应该尽可能干净一些,为了一个布局问题去进行计算,再弄脏数据得不偿失;
2.像你说的性能问题,只是把计算从前端转嫁给了后端,大量访问的时候后端压力也会很大;
3.实际上解决这个问题并不需要去计算字符串长度,通过一些css布局就能实现,这是原生表格都支持的特性,不应该舍近求远。
最后,把问题交给后端不算解决了问题,只是一种妥协式的做法。解决问题的思路很好,但是我们希望的是能够有更好的方式去解决他,谢谢你的建议。
@Creabine 你说的对,我的解决方法的确不太合理,等项目闲下来,要研究下使用css的方式解决,谢谢提醒,如果解决了,可以提个PR试试~
@yugasun :+1:
@Creabine @yugasun 你们用css解决了吗?
急需这样的功能
急需这样的功能
这个很实用,因为有些列的长度是不固定的,根据内容动态调整比较好。再加上max-width
和,show-overflow-tooltip
就能完美解决问题
说拿CSS解决,数据都是异步灌进来的 单凭CSS能取到最长的 然后设宽度吗?况且即使写自适应 但是不同行的相同列 怎么共享一个属性? 。。。
的确最终还是css没法解决,还是需要遍历计算,这种功能还是别交给框架了.....
CSS加tooltip
Sorry, we have no plan to support this.
迫切需求
希望官方支持表格自适应的功能,有些列的数据长度较短,但实际分配宽度时分配的很大
1年了,还是没好的解决办法?
希望官方可以解决
2年了……
2019了,还是没解决。
写段代码处理下这个问题吧。另外有个大坑,就是scroll x之后,,每一列都要给宽度但是最后一列不要给宽度,不然可能会对不齐。
const getTextLength = (str, textSize) =>
((str || '').replace(/[\u0391-\uFFE5]/g, 'aa').length / 2) * textSize;
const getColumnMaxLength = (dataSource, dataIndex, textSize, minWidth = 50) =>
Math.max(
minWidth,
...(dataSource || []).map(row => getTextLength(row[dataIndex], textSize)),
);
export default (
columns = [],
dataSource = [],
textSize = 16,
minWidth,
totalPadding = 16,
) => {
const newColumns = (columns || []).map((column, index) => ({
width:
index < columns.length - 1
? getColumnMaxLength(
dataSource,
column.dataIndex || column.key,
textSize,
minWidth,
) + totalPadding
: undefined,
...column,
}));
const totalWidth = newColumns.reduce(
(accumulator, column) => accumulator + column.width || 0,
0,
);
return {
columns: newColumns,
scroll: {
x:
totalWidth + columns.length > 0
? getColumnMaxLength(
dataSource,
columns[columns.length - 1].dataIndex ||
columns[columns.length - 1].key,
textSize,
minWidth,
)
: minWidth,
},
};
};
被关闭了
我基于 el-column 二次封装的支持"根据内容适应列宽"的 af-column 组件, 还支持自定义适应的比例, 大家看看怎么样~
https://github.com/legendJaden/AFTableColumn
还管不管了,官方一点音信没有了?
哎
fix属性是没有起作用?
2019年7月19了还没解决
这个问题还没解决吗?急需
2019年8月21日了还没解决呢
2019年8月26了还没解决
2019年 9.3 还没解决吗?产品后期提出来的,难搞哦,我是column循环遍历的。
bootstrap的table就支持的非常好,能否参考下呢?
2019/9/19还没解决
2019/9/25 还没解决
2019/9/26还没解决
2019/10/08 还没解决
2019/10/10了
2019/10/11 还没解决
无语了 找到这里来了 都没解决
2019/10/14
2019/10/16
2019/10/28
2019/10/31
2019/11/11
2019/11/22
别评论了,弃了这个库了。
2019/11/29
2019/12/03
2019/12/04
2019/12/06
别评论了,自己研究下就知道这功能不是不做,是不好搞,需要自己去遍历数据长度,根据数据长度来给宽度,但是数字,英文,中文,符号宽度不一样又不能统一度量,这东西不好做的,我自己写了一个太麻烦了,而且计算量大不友好
2019/12/07 打卡
还有个思路,里面的table改回 table-layout: auto;,内部的colgroup col标签再屏蔽掉(display:none),通过这个可以还原成原生table,🙄但是因为不管是iview还是element, table都是thead和tbody分开的两个table所以这么处理会导致thead,tbody对不齐。后续可以直接从dom层找到tbody对应的每一列的宽再赋给thead应该就可以了
别评论了,自己研究下就知道这功能不是不做,是不好搞,需要自己去遍历数据长度,根据数据长度来给宽度,但是数字,英文,中文,符号宽度不一样又不能统一度量,这东西不好做的,我自己写了一个太麻烦了,而且计算量大不友好
其实也不是不好搞,原生table就是可以做到自动适配宽度的,不用计算字符来实现,就跟普通div一样自自动关机撑开,但是el-table将其做了固定宽度。
写段代码处理下这个问题吧。另外有个大坑,就是scroll x之后,,每一列都要给宽度但是最后一列不要给宽度,不然可能会对不齐。
const getTextLength = (str, textSize) => ((str || '').replace(/[\u0391-\uFFE5]/g, 'aa').length / 2) * textSize; const getColumnMaxLength = (dataSource, dataIndex, textSize, minWidth = 50) => Math.max( minWidth, ...(dataSource || []).map(row => getTextLength(row[dataIndex], textSize)), ); export default ( columns = [], dataSource = [], textSize = 16, minWidth, totalPadding = 16, ) => { const newColumns = (columns || []).map((column, index) => ({ width: index < columns.length - 1 ? getColumnMaxLength( dataSource, column.dataIndex || column.key, textSize, minWidth, ) + totalPadding : undefined, ...column, })); const totalWidth = newColumns.reduce( (accumulator, column) => accumulator + column.width || 0, 0, ); return { columns: newColumns, scroll: { x: totalWidth + columns.length > 0 ? getColumnMaxLength( dataSource, columns[columns.length - 1].dataIndex || columns[columns.length - 1].key, textSize, minWidth, ) : minWidth, }, }; };
之前写过的一段代码处理这个问题的。有需要的同学可以拿过去用。
过了这么久了,这个问题还在评论并且没有解决。。。。这个库看来要衰亡了。。
2019-12-27 准备跨年了
马上2020年了 为么那么多人提这个需求 官方就是不改
2019-12-31 还没改,再过十几个小时就要2020年了
2020-01-20 2020年了哦
2020-01-03 这个问题还没得到很好的解决,有个基于element扩展的库可以解决,但是问题也挺多的
https://github.com/legendJaden/AFTableColumn
9103-01-07 了,打印的时候用到多层表头,结果三个table的首列单元格宽度逐步增大,导致内容肉眼可见的并不对齐。手动覆盖样式强制让首列一样宽,结果也不影响后面几列的“错位”,咋搞呢
可以参考antd实现
Sorry, we have no plan to support this.
So, why? This is a very reasonable demand!
2020年2月14日,希望此功能特性能够实现。
2020年2月27日,我们产品经理也来要求此功能了。
2020年3月7日,陪女朋友过节的我看到这个需求留下了眼泪
2020/03/16
哈哈哈,真有意思,给爷整笑了
还在没弄好啊。。这个。。。
我觉得为啥不用脚投票呢?不用这个库了不就好了?
牛皮,真的牛皮
牛皮,真的牛皮
What is niubility?
逐一看完了评论,看来很多人需要呀,刚好今天产品经理提了,看来~~~
哇 我老板也提出了这个需求..
哇 心累,我也需要这个功能
看完了所有评论,因为我真的需要这个功能
确实需要宽度自适应的功能,希望官方能看到
现在这个 问题 是不是官方都不维护啦。。。。
今天刚好也遇到了这个需求,因为电量很大,所以要展示很长的数字···
内容不能撑开宽是真的头皮发麻
表头也不能撑开,看来只能靠自己了
2020-06-11 老板提出了这个需求,
2020/07/08 我是来找解决方案的,table向来都是需求极大的组件,希望官方重视起来
我也来一波看看啊,需求很大啊。但是这个确实不好解决,等待强大的兄弟们,出问题。
官方有看到吗,这么多人都有这个需求,为么就是不改!
2020/07/28 老板提出了这个需求
2020/08/06 老板提出了这个需求
2020/08/06 ui提出来这个需求
我们也有这个问题,宽度没设置,就自动换行了,很丑的
熟悉项目代码,发现全部是计算之后设置min-width, 太难看了,找来找去找到这,官方这么久都没有回应,太过分了
element的table居然表头和body是两个table,奇葩啊
2020/10/19,组长提出这个需求
2020-10-27 老板提出来需求了。 三年了
Cannot believe that such a reasonable feature request could not be supported after 3 years.
2021-01-05
2021-1-7 此项目已经死了?
2021-1-26,我又来看了一下
+1
Most helpful comment
@yugasun 计算字符串长度给相应的宽度是一个思路,我之前也想过但是被否决了,原因如下:
1.前后端交互的数据应该尽可能干净一些,为了一个布局问题去进行计算,再弄脏数据得不偿失;
2.像你说的性能问题,只是把计算从前端转嫁给了后端,大量访问的时候后端压力也会很大;
3.实际上解决这个问题并不需要去计算字符串长度,通过一些css布局就能实现,这是原生表格都支持的特性,不应该舍近求远。
最后,把问题交给后端不算解决了问题,只是一种妥协式的做法。解决问题的思路很好,但是我们希望的是能够有更好的方式去解决他,谢谢你的建议。