Skip to content

Commit 1a28b79

Browse files
authored
refactor: remove getTriggerDOMNode usage (#79)
* chore: update ref logic * chore: support fallback
1 parent 2a6f8ca commit 1a28b79

File tree

2 files changed

+56
-20
lines changed

2 files changed

+56
-20
lines changed

src/Placeholder.tsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import Portal, { type PortalProps } from '@rc-component/portal';
2+
import * as React from 'react';
3+
4+
export interface PlaceholderProps
5+
extends Pick<PortalProps, 'open' | 'autoLock' | 'getContainer'> {
6+
domRef: React.RefObject<HTMLDivElement>;
7+
className: string;
8+
style: React.CSSProperties;
9+
fallbackDOM: () => HTMLElement | null;
10+
}
11+
12+
const Placeholder = React.forwardRef<HTMLElement, PlaceholderProps>(
13+
(props, ref) => {
14+
const {
15+
open,
16+
autoLock,
17+
getContainer,
18+
domRef,
19+
className,
20+
style,
21+
fallbackDOM,
22+
} = props;
23+
24+
React.useImperativeHandle(ref, () => domRef.current || fallbackDOM());
25+
26+
return (
27+
<Portal open={open} autoLock={autoLock} getContainer={getContainer}>
28+
<div ref={domRef} className={className} style={style} />
29+
</Portal>
30+
);
31+
},
32+
);
33+
34+
if (process.env.NODE_ENV !== 'production') {
35+
Placeholder.displayName = 'Placeholder';
36+
}
37+
38+
export default Placeholder;

src/Tour.tsx

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Mask from './Mask';
1414
import { getPlacements } from './placements';
1515
import TourStep from './TourStep';
1616
import { getPlacement } from './util';
17+
import Placeholder from './Placeholder';
1718

1819
const CENTER_PLACEHOLDER: React.CSSProperties = {
1920
left: '50%',
@@ -201,8 +202,8 @@ const Tour: React.FC<TourProps> = props => {
201202
typeof mergedMask === 'boolean' ? undefined : mergedMask;
202203

203204
// when targetElement is not exist, use body as triggerDOMNode
204-
const getTriggerDOMNode = node => {
205-
return node || targetElement || document.body;
205+
const fallbackDOM = () => {
206+
return targetElement || document.body;
206207
};
207208

208209
return (
@@ -237,29 +238,26 @@ const Tour: React.FC<TourProps> = props => {
237238
forceRender={false}
238239
autoDestroy
239240
zIndex={zIndex}
240-
getTriggerDOMNode={getTriggerDOMNode}
241241
arrow={!!mergedArrow}
242242
>
243-
<Portal
243+
<Placeholder
244244
open={mergedOpen}
245245
autoLock={!inlineMode}
246246
getContainer={getPopupContainer as any}
247-
>
248-
<div
249-
ref={placeholderRef}
250-
className={classNames(
251-
className,
252-
rootClassName,
253-
`${prefixCls}-target-placeholder`,
254-
)}
255-
style={{
256-
...(posInfo || CENTER_PLACEHOLDER),
257-
position: inlineMode ? 'absolute' : 'fixed',
258-
pointerEvents: 'none',
259-
...style,
260-
}}
261-
/>
262-
</Portal>
247+
domRef={placeholderRef}
248+
fallbackDOM={fallbackDOM}
249+
className={classNames(
250+
className,
251+
rootClassName,
252+
`${prefixCls}-target-placeholder`,
253+
)}
254+
style={{
255+
...(posInfo || CENTER_PLACEHOLDER),
256+
position: inlineMode ? 'absolute' : 'fixed',
257+
pointerEvents: 'none',
258+
...style,
259+
}}
260+
/>
263261
</Trigger>
264262
</>
265263
);

0 commit comments

Comments
 (0)