Skip to content

Commit d87a1cd

Browse files
authored
feat: listen for parent element size changes (#351)
* feat: listen for parent element size changes * feat: modify isWatchParent name to watchParentSizeChange
1 parent aaabc2a commit d87a1cd

File tree

3 files changed

+55
-8
lines changed

3 files changed

+55
-8
lines changed
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import React, { useState } from 'react';
2+
import { EllipsisText } from 'dt-react-component';
3+
import { Radio, RadioChangeEvent, Divider } from 'antd';
4+
5+
export default () => {
6+
const [width, setWidth] = useState(200);
7+
const onChange = (e: RadioChangeEvent) => {
8+
setWidth(e.target.value);
9+
};
10+
11+
return (
12+
<>
13+
<Radio.Group onChange={onChange} value={width}>
14+
<Radio value={200}>200px</Radio>
15+
<Radio value={500}>500px</Radio>
16+
</Radio.Group>
17+
<Divider />
18+
<div
19+
style={{
20+
width,
21+
}}
22+
>
23+
<EllipsisText
24+
value={'长长长长长长长长长长长长长长长长长长长长长长长长长长长长'}
25+
watchParentSizeChange
26+
/>
27+
</div>
28+
</>
29+
);
30+
};

src/ellipsisText/index.md

+8-6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ demo:
1919
## 示例
2020

2121
<code src="./demos/basic.tsx" title="基础使用" description="请更改窗口大小"></code>
22+
<code src="./demos/watchParent.tsx" title="监听父元素" description="在一些情况下会变更容器的宽度,如滚动条的消失隐藏。当宽度变更后需要重新计算可用区域,可以通过传递 watchParentSizeChange 开启监听父元素,当父元素大小改变时会重新进行计算"></code>
2223
<code src="./demos/maxWidth.tsx" title="宽度限制" ></code>
2324
<code src="./demos/inlineElement.tsx" title="在行内元素中使用" description="行内元素无法获得宽度,在计算时会不断向上查找,直到找到一个能够正确获取宽度的父元素,并以找到父元素宽度当作文本的可视宽度" ></code>
2425
<code src="./demos/flex.tsx" title="在 flex 中使用" description="请更改窗口大小"></code>
@@ -27,12 +28,13 @@ demo:
2728

2829
## API
2930

30-
| 参数 | 说明 | 类型 | 默认值 |
31-
| --------- | ---------------------------------- | -------------------------------- | ------ |
32-
| value | 显示文本内容 | `ReactNode \| () => ReactNode` | - |
33-
| title | 提示文字 | `ReactNode \| () => ReactNode` | value |
34-
| className | 为文本内容所在节点添加自定义样式名 | `string` | - |
35-
| maxWidth | 文本内容的最大宽度 | `string \| number` | - |
31+
| 参数 | 说明 | 类型 | 默认值 |
32+
| --------------------- | ------------------------------------------ | -------------------------------- | ------ |
33+
| value | 显示文本内容 | `ReactNode \| () => ReactNode` | - |
34+
| title | 提示文字 | `ReactNode \| () => ReactNode` | value |
35+
| className | 为文本内容所在节点添加自定义样式名 | `string` | - |
36+
| maxWidth | 文本内容的最大宽度 | `string \| number` | - |
37+
| watchParentSizeChange | 监听父元素大小的变更,默认监听 window 窗口 | ` boolean` | false |
3638

3739
:::info
3840
其余参数继承自 [继承 antd4.x 的 Tooltip](https://4x.ant.design/components/tooltip-cn/#API)

src/ellipsisText/index.tsx

+17-2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ export interface IEllipsisTextProps extends AbstractTooltipProps {
3030
* 可视区宽度
3131
*/
3232
maxWidth?: string | number;
33+
/**
34+
* 监听父元素大小的改变
35+
*/
36+
watchParentSizeChange?: boolean;
3337
/**
3438
* antd Tooltip
3539
*/
@@ -43,9 +47,20 @@ export interface NewHTMLElement extends HTMLElement {
4347
const DEFAULT_MAX_WIDTH = 120;
4448

4549
const EllipsisText = (props: IEllipsisTextProps) => {
46-
const { value, title = value, className, maxWidth, ...otherProps } = props;
50+
const {
51+
value,
52+
title = value,
53+
className,
54+
maxWidth,
55+
watchParentSizeChange = false,
56+
...otherProps
57+
} = props;
4758

4859
const ellipsisRef = useRef<HTMLSpanElement>(null);
60+
const observerEle =
61+
watchParentSizeChange && ellipsisRef.current?.parentElement
62+
? ellipsisRef.current?.parentElement
63+
: null;
4964

5065
const [visible, setVisible] = useState(false);
5166
const [width, setWidth] = useState<number | string>(DEFAULT_MAX_WIDTH);
@@ -222,7 +237,7 @@ const EllipsisText = (props: IEllipsisTextProps) => {
222237
}, [width, cursor, value]);
223238

224239
return (
225-
<Resize onResize={onResize}>
240+
<Resize onResize={onResize} observerEle={observerEle}>
226241
{visible ? (
227242
<Tooltip title={title} mouseEnterDelay={0} mouseLeaveDelay={0} {...otherProps}>
228243
{renderText()}

0 commit comments

Comments
 (0)