Skip to content

Commit d4568bd

Browse files
authored
fix: ref check to avoid loop (#342)
1 parent dac7918 commit d4568bd

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

src/index.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import Portal from '@rc-component/portal';
22
import classNames from 'classnames';
33
import type { CSSMotionProps } from 'rc-motion';
44
import ResizeObserver from 'rc-resize-observer';
5+
import { isDOM } from 'rc-util/lib/Dom/findDOMNode';
56
import useEvent from 'rc-util/lib/hooks/useEvent';
67
import useId from 'rc-util/lib/hooks/useId';
78
import useLayoutEffect from 'rc-util/lib/hooks/useLayoutEffect';
8-
import { isDOM } from 'rc-util/lib/Dom/findDOMNode';
99
import * as React from 'react';
1010
import type { TriggerContextProps } from './context';
1111
import TriggerContext from './context';
@@ -214,23 +214,23 @@ export function generateTrigger(
214214
const id = useId();
215215
const [popupEle, setPopupEle] = React.useState<HTMLDivElement>(null);
216216

217-
const setPopupRef = React.useCallback((node: HTMLDivElement) => {
218-
if (isDOM(node)) {
217+
const setPopupRef = useEvent((node: HTMLDivElement) => {
218+
if (isDOM(node) && popupEle !== node) {
219219
setPopupEle(node);
220220
}
221221

222222
parentContext?.registerSubPopup(id, node);
223-
}, []);
223+
});
224224

225225
// =========================== Target ===========================
226226
// Use state to control here since `useRef` update not trigger render
227227
const [targetEle, setTargetEle] = React.useState<HTMLElement>(null);
228228

229-
const setTargetRef = React.useCallback((node: HTMLElement) => {
230-
if (isDOM(node)) {
229+
const setTargetRef = useEvent((node: HTMLElement) => {
230+
if (isDOM(node) && targetEle !== node) {
231231
setTargetEle(node);
232232
}
233-
}, []);
233+
});
234234

235235
// ========================== Children ==========================
236236
const child = React.Children.only(children) as React.ReactElement;

0 commit comments

Comments
 (0)