antd table 中列内容为一组tag,tag个数自适应显示,当列宽不够时省略(+X)显示,hover时获取到隐藏的tag。

本文介绍了如何在AntDesign的Table组件中处理列内容为多行Tag标签的情况,当列宽不足时进行省略并计数,hover时显示隐藏内容。通过结合Select组件的多选功能和自定义渲染,实现了动态适应和hover效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

antd table 中列内容为一组tag,tag个数自适应显示,当列宽不够时省略(+X)显示,hover时获取到隐藏的tag。

需求描述

请添加图片描述
该列内容为一组tag标签,当列宽放不下时,省略tag并在后面显示省略的tag个数。hover个数时,tooltip显示省略tag的内容。

需求实现

实现思路首先是当列宽不够时,tag不会一行显示,所以可以通过将tag放入一个div指定其高度,比较每一个tag距离顶部的距离来判断是否放不下。增加+个数显示之后,还需要判断加上之后是不是超过了行宽。
参考文章:多行标签超出展开折叠功能

有一个问题是上述思路宽度是固定的情况,在这里也就是表格初始化的时候。但表格是自适应的,列宽可以改变。因为没有办法监控表格什么时候触发自适应,或者说获取这一列的宽度过于麻烦,所以最后采用两个组件的结合实现。

核心:table组件+Select组件

主要借助Select组件的如下功能
官方demo查看
在这里插入图片描述

  1. 使用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>
    
  2. 修改Select组件的样式
    上一步中将Selectdisabled设置为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;
    }
    }
    }
    
  3. Table组件的配合

    {
      title: '显示内容',
      width: '45%',
      dataIndex: 'field_content',
      valueType: 'tags',
      key: 'field_content',
      ellipsis: true, // 这里要开启
      render: (_, record) => (
        // 这个就是上述封装的Select组件
        <SingleMultipleContent content={record.field_content} /> 
      ),
    },
    
### 自适应Ant Design Vue Table 为了使 Ant Design Vue 的 `Table` 组件能够自动调整,可以采用两种主要策略: #### 方法一:通过 CSS 控制容器度并允许水平滚动 当表格中的数较多,可以通过在外层包裹一个具有特定样式的 `div` 来控制整个表格的最大度,并启用横向滚动条来查看超出部分的内容。 ```css .resizableTableContainer { overflow-x: auto; width: 100%; display: block; } ``` 此样式应用于包含表格组件的父级元素上[^1]。这样做的好处是可以保持页面布局整洁的同让用户自由浏览所有数据而不会破坏整体视觉效果。 #### 方法二:动态计算每的最佳度 另一种更灵活的方式是在 JavaScript 中根据实际内容长度实调整各尺寸。虽然官方文档并没有直接提供这样的功能选项,但是可以通过监听窗口大小变化事件以及遍历每一行的数据项来自定义实现这一特性。 下面是一个简单的例子展示如何基于内容长度设定初始: ```javascript import React, { useEffect, useState } from 'react'; // ...其他必要的导入语句... function AutoWidthTable({ columns, dataSource }) { const [autoColumns, setAutoColumns] = useState([]); useEffect(() => { let newCols = []; // 计算每个字段中最长字符串所占像素值作为该的基础度 columns.forEach(col => { let maxWidth = col.title.length * 8; // 字体平均度估算 dataSource.map(item => { if (item[col.dataIndex]) { const textLength = item[col.dataIndex].toString().length; const pixelWidth = Math.max(textLength * 8, maxWidth); maxWidth = pixelWidth > maxWidth ? pixelWidth : maxWidth; } }); newCols.push({ ...col, width: `${maxWidth}px`, }); }); setAutoColumns(newCols); }, []); return ( <Table columns={autoColumns} dataSource={dataSource} pagination={{ pageSize: 5 }} /> ); } export default AutoWidthTable; ``` 这段代码片段展示了如何创建一个新的组件 `AutoWidthTable` ,它接收原始的 `columns` 和 `dataSource` 参数,在首次渲染会尝试为每一个表头找到最合适的显示度,并将其应用到最终呈现给用户的表格结构中去[^2]。 需要注意的是上述逻辑仅适用于简单场景下的静态文本;对于复杂情况比如带有图片或其他富媒体内容,则可能需要更加复杂的算法来进行精确测量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值