Skip to content

refactor(ellipsisText): add dynamic prop for ellipsis modes (DTStack#666) - #667

Open
jin-sir wants to merge 3 commits into
DTStack:masterfrom
jin-sir:feat_666
Open

jin-sir wants to merge 3 commits into
DTStack:masterfrom
jin-sir:feat_666

Conversation

@jin-sir

@jin-sir jin-sir commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator

变更类型

请选择以下选项以描述 PR 的类型:

  • 新功能(添加了一个功能)
  • 代码优化(性能改进、代码重构)
  • Bug 修复(修复现有问题)
  • 文档更新
  • 单测新增或修改
  • 其他(请说明):

相关问题

#666

详细描述

EllipsisText 组件的动态计算功能是在 rc@4.x 新增的功能,在实现上,动态计算是融入了maxWidth的计算中的,融入了 EllipsisText 组件中的宽度计算逻辑。即不论需不需要动态计算功能,都会走动态计算逻辑。这一点引出了很多的问题。
在调研了 Antd 的 Typography.Text 组件后,Antd 的 Typography.Text 组件除了动态计算剩余宽度的功能外,其余功能都已实现。故此,对 EllipsisText 做以下改造:

  • 保留原组件 EllipsisText ,转为内部组件。
  • 新增属性:是否开启动态测量
    • 是:走原组件 EllipsisText
    • 否:走 Typography.Text

变更内容

  1. 提取宽度计算逻辑为独立 Hook / 工具函数:将 EllipsisText 内部的文本宽度测 useEllipsisTextStyle.ts 与 utils.ts,并补充 useEllipsisTextStyle.test.tsx 单测。
  2. 宽度最小值限制:对计算出的容器宽度做 MIN_WIDTH 最小值限制,避免极端布局下算出负宽度。
  3. 新增 dynamic 开关,拆分默认 / 动态测量两条路径:
    • 默认(不传 dynamic)走 antd Typography.Text 的 ellipsis,轻量省略、无需测量,性能更优;
    • 开启 dynamic 走动态测量(新增 measureEllipsis.tsx),支持 maxWidth 精确限宽、Tooltip 属性透传,并自动监听容器尺寸变化重测;
    • 移除已失效的 watchParentSizeChange,容器监听改由 dynamic 路径默认承担。
  4. getActualWidth 兜底:getBoundingClientRect().width 会被 CSS transform 缩放影响(如 an 缩动画期 rect 被缩放为 0),此时回退用 offsetWidth 取真实布局宽(display:none 时两者均为 0,兜底无效,注释已注明)。

迁移

  • 案例 1:基础用法(无 maxWidth) —— 改前自动算剩余宽度,所以要保留必须加 dynamic
// 改造前:向上找有效父容器,先隐藏文本 → 容器宽−其他内容宽 = 剩余可用宽度,设 max-width 省略
<EllipsisText value={title} />

// 改造后:
// ① 想保留「自动算剩余宽度」省略 → 必须 dynamic
<EllipsisText value={title} dynamic />
// ② 仅当盒子本身宽度受限(如固定 width 块),纯 CSS 省略即可 → 可不传
<EllipsisText value={title} />
  • 案例 2:传 maxWidth —— 必须加 dynamic
// 改造前:maxWidth 直接生效
<EllipsisText value={name} maxWidth={200} />

// 改造后:
// ① 默认分支忽略 maxWidth(dev 会 warn),只有 dynamic 走 transitionWidth
<EllipsisText value={name} dynamic maxWidth={200} />
// ② 仅当父元素盒子本身宽度受限(如固定 width 块),纯 CSS 实现即可
<EllipsisText value={title} style={{ maxWidth: 200 }} />
  • 案例 3:watchParentSizeChange → 删除,改用 dynamic
// 改造前:watchParentSizeChange 控制「RO 监听父元素 / 退回 window resize」
<EllipsisText value={item.title} watchParentSizeChange maxWidth="100%" />
// 改造后:该 prop 已删,dynamic 路径始终 RO 监听容器
<EllipsisText value={item.title} dynamic maxWidth="100%" />

对应 Previewer

https://jin-sir.github.io/dt-react-component

@jin-sir
jin-sir requested a review from LuckyFBB September 28, 2026 13:33
@jin-sir jin-sir changed the title Feat 666 refactor(ellipsisText): extract text style logic into hook Sep 28, 2026
@jin-sir jin-sir changed the title refactor(ellipsisText): extract text style logic into hook refactor(ellipsisText): add dynamic prop for ellipsis modes (DTStack#666) Sep 29, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant