Skip to content

Commit 31668e9

Browse files
authored
refactor: remove useless structure (#502)
* refactor: remove useless structure * chore: align the case * chore: clean up * chore: eng trans * test: update test * fix: ts
1 parent 1f56aa5 commit 31668e9

File tree

8 files changed

+315
-111
lines changed

8 files changed

+315
-111
lines changed

docs/examples/formError.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class Test extends Component {
3434
visible={this.state.visible}
3535
motion={{ motionName: 'rc-tooltip-zoom' }}
3636
trigger={[]}
37-
overlayStyle={{ zIndex: 1000 }}
37+
styles={{ root: { zIndex: 1000 } }}
3838
overlay={<span>required!</span>}
3939
>
4040
<input onChange={this.handleChange} />

docs/examples/placement.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ const Test: React.FC = () => (
9494
<h5>Debug Usage</h5>
9595
<Popup
9696
prefixCls="rc-tooltip"
97-
className="rc-tooltip-placement-top"
98-
style={{ display: 'inline-block', position: 'relative' }}
97+
classNames={{ body: 'rc-tooltip-placement-top' }}
98+
styles={{ body: { display: 'inline-block', position: 'relative' } }}
9999
>
100100
Test
101101
</Popup>

docs/examples/point.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const Test: React.FC = () => {
3030
<Tooltip
3131
placement="top"
3232
overlay={text}
33-
overlayInnerStyle={{ width: 300, height: 50 }}
33+
styles={{ body: { width: 300, height: 50 } }}
3434
popupVisible
3535
arrowContent={<div className="rc-tooltip-arrow-inner" />}
3636
>

docs/examples/simple.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ class Test extends Component<any, TestState> {
217217
offset: [this.state.offsetX, this.state.offsetY],
218218
}}
219219
motion={{ motionName: this.state.transitionName }}
220-
overlayInnerStyle={state.overlayInnerStyle}
220+
styles={{ body: state.overlayInnerStyle }}
221221
>
222222
<div style={{ height: 100, width: 100, border: '1px solid red' }}>trigger</div>
223223
</Tooltip>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"test": "rc-test"
4242
},
4343
"dependencies": {
44-
"@rc-component/trigger": "^3.6.0",
44+
"@rc-component/trigger": "^3.6.4",
4545
"@rc-component/util": "^1.3.0",
4646
"classnames": "^2.3.1"
4747
},

src/Popup.tsx

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,26 @@
1-
import classNames from 'classnames';
1+
import cls from 'classnames';
22
import * as React from 'react';
3+
import type { TooltipProps } from './Tooltip';
34

45
export interface ContentProps {
56
prefixCls?: string;
67
children: (() => React.ReactNode) | React.ReactNode;
78
id?: string;
8-
overlayInnerStyle?: React.CSSProperties;
9-
className?: string;
10-
style?: React.CSSProperties;
11-
bodyClassName?: string;
9+
classNames?: TooltipProps['classNames'];
10+
styles?: TooltipProps['styles'];
1211
}
1312

1413
const Popup: React.FC<ContentProps> = (props) => {
15-
const {
16-
children,
17-
prefixCls,
18-
id,
19-
overlayInnerStyle: innerStyle,
20-
bodyClassName,
21-
className,
22-
style,
23-
} = props;
14+
const { children, prefixCls, id, classNames, styles } = props;
2415

2516
return (
26-
<div className={classNames(`${prefixCls}-content`, className)} style={style}>
27-
<div
28-
className={classNames(`${prefixCls}-inner`, bodyClassName)}
29-
id={id}
30-
role="tooltip"
31-
style={innerStyle}
32-
>
33-
{typeof children === 'function' ? children() : children}
34-
</div>
17+
<div
18+
id={id}
19+
className={cls(`${prefixCls}-body`, classNames?.body)}
20+
style={styles?.body}
21+
role="tooltip"
22+
>
23+
{typeof children === 'function' ? children() : children}
3524
</div>
3625
);
3726
};

src/Tooltip.tsx

Lines changed: 51 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import type { ArrowType, TriggerProps, TriggerRef } from '@rc-component/trigger'
22
import Trigger from '@rc-component/trigger';
33
import type { ActionType, AlignType } from '@rc-component/trigger/lib/interface';
44
import useId from '@rc-component/util/lib/hooks/useId';
5-
import classNames from 'classnames';
5+
import cls from 'classnames';
66
import * as React from 'react';
77
import { useImperativeHandle, useRef } from 'react';
88
import { placements } from './placements';
99
import Popup from './Popup';
1010

11+
export type SemanticName = 'root' | 'arrow' | 'body';
12+
1113
export interface TooltipProps
1214
extends Pick<
1315
TriggerProps,
@@ -21,56 +23,46 @@ export interface TooltipProps
2123
| 'forceRender'
2224
| 'popupVisible'
2325
> {
26+
// Style
27+
classNames?: Partial<Record<SemanticName, string>>;
28+
styles?: Partial<Record<SemanticName, React.CSSProperties>>;
29+
30+
/** Config popup motion */
31+
motion?: TriggerProps['popupMotion'];
32+
33+
// Rest
2434
trigger?: ActionType | ActionType[];
2535
defaultVisible?: boolean;
2636
visible?: boolean;
2737
placement?: string;
28-
/** Config popup motion */
29-
motion?: TriggerProps['popupMotion'];
38+
3039
onVisibleChange?: (visible: boolean) => void;
3140
afterVisibleChange?: (visible: boolean) => void;
3241
overlay: (() => React.ReactNode) | React.ReactNode;
33-
/** @deprecated Please use `styles={{ root: {} }}` */
34-
overlayStyle?: React.CSSProperties;
35-
/** @deprecated Please use `classNames={{ root: '' }}` */
36-
overlayClassName?: string;
42+
3743
getTooltipContainer?: (node: HTMLElement) => HTMLElement;
3844
destroyOnHidden?: boolean;
3945
align?: AlignType;
4046
showArrow?: boolean | ArrowType;
4147
arrowContent?: React.ReactNode;
4248
id?: string;
43-
/** @deprecated Please use `styles={{ body: {} }}` */
44-
overlayInnerStyle?: React.CSSProperties;
49+
4550
zIndex?: number;
46-
styles?: TooltipStyles;
47-
classNames?: TooltipClassNames;
51+
4852
/**
4953
* Configures Tooltip to reuse the background for transition usage.
5054
* This is an experimental API and may not be stable.
5155
*/
5256
unique?: TriggerProps['unique'];
5357
}
5458

55-
export interface TooltipStyles {
56-
root?: React.CSSProperties;
57-
body?: React.CSSProperties;
58-
}
59-
60-
export interface TooltipClassNames {
61-
root?: string;
62-
body?: string;
63-
}
64-
6559
export interface TooltipRef extends TriggerRef {}
6660

6761
const Tooltip = React.forwardRef<TooltipRef, TooltipProps>((props, ref) => {
6862
const {
69-
overlayClassName,
7063
trigger = ['hover'],
7164
mouseEnterDelay = 0,
7265
mouseLeaveDelay = 0.1,
73-
overlayStyle,
7466
prefixCls = 'rc-tooltip',
7567
children,
7668
onVisibleChange,
@@ -81,13 +73,12 @@ const Tooltip = React.forwardRef<TooltipRef, TooltipProps>((props, ref) => {
8173
destroyOnHidden = false,
8274
defaultVisible,
8375
getTooltipContainer,
84-
overlayInnerStyle,
8576
arrowContent,
8677
overlay,
8778
id,
8879
showArrow = true,
89-
classNames: tooltipClassNames,
90-
styles: tooltipStyles,
80+
classNames,
81+
styles,
9182
...restProps
9283
} = props;
9384

@@ -102,18 +93,26 @@ const Tooltip = React.forwardRef<TooltipRef, TooltipProps>((props, ref) => {
10293
extraProps.popupVisible = props.visible;
10394
}
10495

105-
const getPopupElement = () => (
106-
<Popup
107-
key="content"
108-
prefixCls={prefixCls}
109-
id={mergedId}
110-
bodyClassName={tooltipClassNames?.body}
111-
overlayInnerStyle={{ ...overlayInnerStyle, ...tooltipStyles?.body }}
112-
>
113-
{overlay}
114-
</Popup>
115-
);
96+
// ========================= Arrow ==========================
97+
// Process arrow configuration
98+
const mergedArrow = React.useMemo(() => {
99+
if (!showArrow) {
100+
return false;
101+
}
102+
103+
// Convert true to object for unified processing
104+
const arrowConfig = showArrow === true ? {} : showArrow;
105+
106+
// Apply semantic styles with unified logic
107+
return {
108+
...arrowConfig,
109+
className: cls(arrowConfig.className, classNames?.arrow),
110+
style: { ...arrowConfig.style, ...styles?.arrow },
111+
content: arrowConfig.content ?? arrowContent,
112+
};
113+
}, [showArrow, classNames?.arrow, styles?.arrow, arrowContent]);
116114

115+
// ======================== Children ========================
117116
const getChildren = () => {
118117
const child = React.Children.only(children);
119118
const originalProps = child?.props || {};
@@ -124,11 +123,22 @@ const Tooltip = React.forwardRef<TooltipRef, TooltipProps>((props, ref) => {
124123
return React.cloneElement<any>(children, childProps) as any;
125124
};
126125

126+
// ========================= Render =========================
127127
return (
128128
<Trigger
129-
popupClassName={classNames(overlayClassName, tooltipClassNames?.root)}
129+
popupClassName={classNames?.root}
130130
prefixCls={prefixCls}
131-
popup={getPopupElement}
131+
popup={
132+
<Popup
133+
key="content"
134+
prefixCls={prefixCls}
135+
id={mergedId}
136+
classNames={classNames}
137+
styles={styles}
138+
>
139+
{overlay}
140+
</Popup>
141+
}
132142
action={trigger}
133143
builtinPlacements={placements}
134144
popupPlacement={placement}
@@ -141,9 +151,9 @@ const Tooltip = React.forwardRef<TooltipRef, TooltipProps>((props, ref) => {
141151
defaultPopupVisible={defaultVisible}
142152
autoDestroy={destroyOnHidden}
143153
mouseLeaveDelay={mouseLeaveDelay}
144-
popupStyle={{ ...overlayStyle, ...tooltipStyles?.root }}
154+
popupStyle={styles?.root}
145155
mouseEnterDelay={mouseEnterDelay}
146-
arrow={showArrow}
156+
arrow={mergedArrow}
147157
{...extraProps}
148158
>
149159
{getChildren()}

0 commit comments

Comments
 (0)