antd table 中列内容为一组tag,tag个数自适应显示,当列宽不够时省略(+X)显示,hover时获取到隐藏的tag。
需求描述
该列内容为一组tag
标签,当列宽放不下时,省略tag
并在后面显示省略的tag个数。hover
个数时,tooltip
显示省略tag的内容。
需求实现
实现思路首先是当列宽不够时,tag
不会一行显示,所以可以通过将tag
放入一个div
指定其高度,比较每一个tag距离顶部的距离来判断是否放不下。增加+个数
显示之后,还需要判断加上之后是不是超过了行宽。
参考文章:多行标签超出展开折叠功能
有一个问题是上述思路宽度是固定的情况,在这里也就是表格初始化的时候。但表格是自适应的,列宽可以改变。因为没有办法监控表格什么时候触发自适应,或者说获取这一列的宽度过于麻烦,所以最后采用两个组件的结合实现。
核心:table组件+Select组件
主要借助Select
组件的如下功能
官方demo查看
-
使用
Selet
组件
模式选择多选,最大的tag数选择自适应。
maxTagPlaceholder
设置如果超出的省略显示,其参数omittedValues
表示没有显示完的options
。
tagRender
自定义tag
的内容,我这里TooltipsTag
是封装好的组件,功能大概是如果tag
超过数字px
长就显示省略号,并且有hover效果。
注意将默认值defaultValue
设置为全量,因为我们只是借用select
组件,没有下拉等功能。import Style from './index.scss'; const omitContent = (omittedValues) => { return ( <Tooltip title={omittedValues.map(({ label }) => label).join('、')}> <span>+ {omittedValues.length}</span> </Tooltip> ); }; <Select mode="multiple" maxTagCount="responsive" className={Style.content} options={options} style={{ width: '100%' }} defaultValue={options.map((option) => option.value)} tagRender={(options) => <TooltipsTag tag={options.value} />} maxTagPlaceholder={omitContent } disabled={true}> </Select>
-
修改
Select
组件的样式
上一步中将Select
的disabled
设置为true
是为了禁止Select
点击事件的同时其内容的hover
事件还能触发。
现在还需要修改Select
组件的样式,首先局部引入样式(content
生成hash
值来识别组件),然后使用:global
修改全局样式,由于content
的hash值选中了局部组件,其实这里的全局修改还是局部修改的。// 大概是这些内容,需要根据具体场景调整 .content { :global { .ant-select-arrow { display: none; } .ant-select-selector { border: none !important; background: transparent !important; cursor: default !important; .ant-select-selection-item { background: transparent; cursor: pointer; color: black; } } .ant-select-selection-overflow-item-suffix { display: none; } } }
-
Table
组件的配合{ title: '显示内容', width: '45%', dataIndex: 'field_content', valueType: 'tags', key: 'field_content', ellipsis: true, // 这里要开启 render: (_, record) => ( // 这个就是上述封装的Select组件 <SingleMultipleContent content={record.field_content} /> ), },