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

react固定容器标签超出n+展示

思路:
  • 容器宽度监听

    • 需要知道当前容器的宽度。

    • 可以用 ResizeObserver 来实时监听容器大小变化。

  • 计算可展示的标签数量

    • 遍历标签,测量每个 Tag 占的宽度(包括 margin/padding)。

    • 累计标签宽度,直到超出容器最大宽度。

    • 一旦超出,就停止,记录下来能展示的数量。

  • 预留空间给 +n 标签

    • 因为可能会有超出的情况,需要给 +n 预留宽度(比如 40px 左右)。

  • 渲染逻辑

    • 如果标签总数 ≤ 可展示数量 → 全部渲染。

    • 如果标签总数 > 可展示数量 → 渲染前 N 个,剩余的合并为 +n

    • +n 上可以挂载 TooltipPopover,用于展示完整的隐藏标签。

关键点:
  • 如何测量单个标签的宽度?
    常见做法是临时创建一个隐藏的 DOM 元素,把标签内容放进去测量 clientWidth
    也可以直接渲染在页面中,用 getBoundingClientRect() 获取。

  • 如何保证响应式?
    ResizeObserver 会在容器大小变化时重新计算,不需要手动监听 window.onresize

  • 性能优化

    • 标签数如果很多,可以提前缓存测量结果。

    • 只在标签数据或容器宽度变化时重新计算。

初始化 → 监听容器宽度 → 计算可展示数量↓遍历标签 → 累计宽度 → 超出则停止↓渲染:前 N 个标签 + (超出的 +n 标签)

代码:
import React, { useRef, useState, useEffect } from "react";
import { Tag, Tooltip } from "antd";// 标签列表组件
const TagList = ({ data = [] }) => {const containerRef = useRef(null);const [visibleCount, setVisibleCount] = useState(data.length);useEffect(() => {if (!containerRef.current) return;const resizeObserver = new ResizeObserver(() => {calcVisibleCount();});resizeObserver.observe(containerRef.current);return () => {resizeObserver.disconnect();};}, [data]);const calcVisibleCount = () => {const container = containerRef.current;if (!container) return;const containerWidth = container.clientWidth;let total = 0;let count = data.length;// 临时创建元素测量宽度const temp = document.createElement("div");temp.style.position = "absolute";temp.style.visibility = "hidden";temp.style.whiteSpace = "nowrap";document.body.appendChild(temp);for (let i = 0; i < data.length; i++) {temp.innerHTML = `<span class="ant-tag">${data[i]}</span>`;const w = temp.clientWidth + 8; // 8px = margin-right 近似if (total + w > containerWidth - 40) {// 40 给 +N 预留宽度count = i;break;}total += w;}document.body.removeChild(temp);setVisibleCount(count);};const showTags = data.slice(0, visibleCount);const hiddenTags = data.slice(visibleCount);return (<divref={containerRef}style={{ width: "100%", overflow: "hidden", whiteSpace: "nowrap" }}>{showTags.map((item, index) => (<Tag key={index}>{item}</Tag>))}{hiddenTags.length > 0 && (<Tooltiptitle={<div style={{ display: "flex", flexWrap: "wrap", gap: 4 }}>{hiddenTags.map((item, idx) => (<Tag key={idx}>{item}</Tag>))}</div>}><Tag>+{hiddenTags.length}</Tag></Tooltip>)}</div>);
};export default TagList;
使用:
      <divstyle={{width: 300,maxWidth: 300,}}><TagList data={tags} /></div>

http://www.dtcms.com/a/391145.html

相关文章:

  • ​​HarmonyOS应用开发:从入门到实战的完整指南​
  • QT与GTK生态最新进展及特性对比(2025年)
  • 包管理器分析
  • XC7K325T-2FBG676I Xilinx AMD Kintex-7 FPGA
  • FPGA入门-红外遥控
  • qml实现多页面切换显示的导航栏
  • 20250919的学习笔记
  • iOS 26 游戏测试实战,兼容性、帧率、GPU 性能与 Liquid Glass 动效在游戏中的影响(游戏开发与 uni-app 场景指南)
  • kind部署K8S集群并将“修仙业务“部署到kind集群
  • 《C++程序设计》笔记p2
  • 第1章:项目前言
  • 实现类似word 文档下划线输入功能
  • AR技术赋能高风险作业:重塑安全与效率
  • Axure-图片旋转人机验证
  • web:ts中class、interface、type的区别
  • css中的vm和vh,页面滚动的卡片网页
  • git cherry pick怎么用
  • 40岁从智驾转具身智能之路
  • 串口连接失败排坑步骤
  • QML学习笔记(三)QML基础语法其一:Rectangle及帮助文档的使用
  • 工业相机与镜头靶面尺寸的关系:从原理到选型的避坑指南
  • javaweb tomcat的使用
  • AI 赋能 APP 界面设计公司:从美学到交互的智能升级
  • Java 中的 static:从动机到内存模型、并发与最佳实践
  • 【数据结构与算法(C语言版)】从 0 实现 线性表之顺序表(代码实现增删查功能全解析)
  • MethodSignature signature = (MethodSignature) joinPoint.getSignature()
  • CN2香港服务器是否适合SEO优化?
  • 查看电脑IP地址、修改IP操作,查询本地网络使用的公网IP,判断路由器是否有公网IP,内网IP又怎么让外网上访问
  • 合成孔径雷达干涉测量InSAR:从星载与地基系统原理到多领域应用实战,涵盖数据处理、地形三维重建、形变监测与案例解析
  • Activity 之间跳转时,生命周期的变化