From 0cbe6595e5366d3b39b171905ddaf493044b3387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E8=89=B3=E5=85=B5?= Date: Fri, 22 May 2026 09:17:24 +0800 Subject: [PATCH 1/2] fix: avoid rc package deep imports --- package.json | 4 +-- src/Popup/index.tsx | 4 +-- src/UniqueProvider/index.tsx | 3 +- src/hooks/useAlign.ts | 10 +++--- src/hooks/useWatch.ts | 2 +- src/hooks/useWinClick.ts | 3 +- src/index.tsx | 61 +++++++++++++++++++++++++++----- src/mock.tsx | 37 +------------------ tests/align.test.tsx | 2 +- tests/arrow.test.jsx | 5 +-- tests/basic.test.jsx | 2 +- tests/flip-visibleFirst.test.tsx | 2 +- tests/flip.test.tsx | 2 +- tests/flipShift.test.tsx | 2 +- tests/mobile.test.tsx | 2 +- tests/open-change.test.tsx | 2 +- tests/perf.test.tsx | 2 +- tests/portal.test.jsx | 2 +- tests/rect.test.tsx | 2 +- tests/ref.test.tsx | 2 +- tests/shadow.test.tsx | 2 +- 21 files changed, 78 insertions(+), 75 deletions(-) diff --git a/package.json b/package.json index c492cad8..14b0b078 100644 --- a/package.json +++ b/package.json @@ -44,11 +44,11 @@ "@rc-component/motion": "^1.1.4", "@rc-component/portal": "^2.2.0", "@rc-component/resize-observer": "^1.1.1", - "@rc-component/util": "^1.2.1", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "devDependencies": { - "@rc-component/father-plugin": "^2.0.0", + "@rc-component/father-plugin": "^2.2.0", "@rc-component/np": "^1.0.3", "@testing-library/jest-dom": "^6.1.4", "@testing-library/react": "^16.0.0", diff --git a/src/Popup/index.tsx b/src/Popup/index.tsx index 51cff879..1f542b75 100644 --- a/src/Popup/index.tsx +++ b/src/Popup/index.tsx @@ -4,8 +4,7 @@ import CSSMotion from '@rc-component/motion'; import ResizeObserver, { type ResizeObserverProps, } from '@rc-component/resize-observer'; -import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect'; -import { composeRef } from '@rc-component/util/lib/ref'; +import { composeRef, useEvent, useLayoutEffect } from '@rc-component/util'; import * as React from 'react'; import type { TriggerProps } from '../'; import type { AlignType, ArrowPos, ArrowTypeOuter } from '../interface'; @@ -13,7 +12,6 @@ import Arrow from './Arrow'; import Mask from './Mask'; import PopupContent from './PopupContent'; import useOffsetStyle from '../hooks/useOffsetStyle'; -import { useEvent } from '@rc-component/util'; import type { PortalProps } from '@rc-component/portal'; export interface MobileConfig { diff --git a/src/UniqueProvider/index.tsx b/src/UniqueProvider/index.tsx index 148bc20b..021f93b8 100644 --- a/src/UniqueProvider/index.tsx +++ b/src/UniqueProvider/index.tsx @@ -9,9 +9,8 @@ import TriggerContext, { import useDelay from '../hooks/useDelay'; import useAlign from '../hooks/useAlign'; import Popup from '../Popup'; -import { useEvent } from '@rc-component/util'; +import { isDOM, useEvent } from '@rc-component/util'; import useTargetState from './useTargetState'; -import { isDOM } from '@rc-component/util/lib/Dom/findDOMNode'; import UniqueContainer from './UniqueContainer'; import { clsx } from 'clsx'; import { getAlignPopupClassName } from '../util'; diff --git a/src/hooks/useAlign.ts b/src/hooks/useAlign.ts index db297856..bb35dd73 100644 --- a/src/hooks/useAlign.ts +++ b/src/hooks/useAlign.ts @@ -1,7 +1,9 @@ -import { isDOM } from '@rc-component/util/lib/Dom/findDOMNode'; -import isVisible from '@rc-component/util/lib/Dom/isVisible'; -import useEvent from '@rc-component/util/lib/hooks/useEvent'; -import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect'; +import { + isDOM, + isVisible, + useEvent, + useLayoutEffect, +} from '@rc-component/util'; import * as React from 'react'; import type { TriggerProps } from '..'; import type { diff --git a/src/hooks/useWatch.ts b/src/hooks/useWatch.ts index d5d3fd66..12788153 100644 --- a/src/hooks/useWatch.ts +++ b/src/hooks/useWatch.ts @@ -1,4 +1,4 @@ -import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect'; +import { useLayoutEffect } from '@rc-component/util'; import { collectScroller, getWin } from '../util'; export default function useWatch( diff --git a/src/hooks/useWinClick.ts b/src/hooks/useWinClick.ts index 7c208d41..5ccfbc82 100644 --- a/src/hooks/useWinClick.ts +++ b/src/hooks/useWinClick.ts @@ -1,5 +1,4 @@ -import { getShadowRoot } from '@rc-component/util/lib/Dom/shadow'; -import { warning } from '@rc-component/util/lib/warning'; +import { getShadowRoot, warning } from '@rc-component/util'; import * as React from 'react'; import { getWin } from '../util'; diff --git a/src/index.tsx b/src/index.tsx index 4cad2655..4e05e6ef 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -2,12 +2,18 @@ import Portal from '@rc-component/portal'; import { clsx } from 'clsx'; import type { CSSMotionProps } from '@rc-component/motion'; import { useResizeObserver } from '@rc-component/resize-observer'; -import { getDOM, isDOM } from '@rc-component/util/lib/Dom/findDOMNode'; -import { getShadowRoot } from '@rc-component/util/lib/Dom/shadow'; -import { getNodeRef, useComposeRef } from '@rc-component/util/lib/ref'; -import useEvent from '@rc-component/util/lib/hooks/useEvent'; -import useId from '@rc-component/util/lib/hooks/useId'; -import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect'; +import { + getDOM, + getNodeRef, + getShadowRoot, + isDOM, + supportRef, + useComposeRef, + useControlledState, + useEvent, + useId, + useLayoutEffect, +} from '@rc-component/util'; import * as React from 'react'; import Popup, { type MobileConfig } from './Popup'; import type { TriggerContextProps } from './context'; @@ -22,6 +28,7 @@ import type { PortalProps } from '@rc-component/portal'; import type { ActionType, AlignType, + AnimationType, ArrowPos, ArrowTypeOuter, BuildInPlacements, @@ -31,12 +38,12 @@ import { getAlignPopupClassName } from './util'; export type { ActionType, AlignType, + AnimationType, ArrowTypeOuter as ArrowType, BuildInPlacements, }; import UniqueProvider, { type UniqueProviderProps } from './UniqueProvider'; -import { useControlledState } from '@rc-component/util'; import { flushSync } from 'react-dom'; export { UniqueProvider }; @@ -791,13 +798,17 @@ export function generateTrigger( useResizeObserver(mergedOpen, targetEle, onTargetResize); // Compose refs - const mergedRef = useComposeRef(setTargetRef, getNodeRef(child)); + const childSupportRef = supportRef(child); + const mergedRef = useComposeRef( + setTargetRef, + childSupportRef ? getNodeRef(child) : null, + ); // Child Node const triggerNode = React.cloneElement(child, { ...mergedChildrenProps, ...passedProps, - ref: mergedRef, + ref: childSupportRef ? mergedRef : undefined, }); // Render @@ -869,4 +880,36 @@ export function generateTrigger( return Trigger; } +interface MockPortalProps { + open?: boolean; + autoDestroy?: boolean; + children: React.ReactElement; + getContainer?: () => HTMLElement; +} + +const MockPortal: React.FC = ({ + open, + autoDestroy, + children, + getContainer, +}) => { + const [visible, setVisible] = React.useState(open); + + React.useEffect(() => { + getContainer?.(); + }); + + React.useEffect(() => { + if (open) { + setVisible(true); + } else if (autoDestroy) { + setVisible(false); + } + }, [open, autoDestroy]); + + return visible ? children : null; +}; + +export const MockTrigger = generateTrigger(MockPortal); + export default generateTrigger(Portal); diff --git a/src/mock.tsx b/src/mock.tsx index 50942d11..da4b6e21 100644 --- a/src/mock.tsx +++ b/src/mock.tsx @@ -1,36 +1 @@ -import * as React from 'react'; -import { generateTrigger, UniqueProvider } from './index'; - -interface MockPortalProps { - open?: boolean; - autoDestroy?: boolean; - children: React.ReactElement; - getContainer?: () => HTMLElement; -} - -const MockPortal: React.FC = ({ - open, - autoDestroy, - children, - getContainer, -}) => { - const [visible, setVisible] = React.useState(open); - - React.useEffect(() => { - getContainer?.(); - }); - - React.useEffect(() => { - if (open) { - setVisible(true); - } else if (autoDestroy) { - setVisible(false); - } - }, [open, autoDestroy]); - - return visible ? children : null; -}; - -export default generateTrigger(MockPortal); - -export { UniqueProvider }; +export { MockTrigger as default, UniqueProvider } from './index'; diff --git a/tests/align.test.tsx b/tests/align.test.tsx index d4e7386b..a22d83c4 100644 --- a/tests/align.test.tsx +++ b/tests/align.test.tsx @@ -1,5 +1,5 @@ import { act, cleanup, fireEvent, render } from '@testing-library/react'; -import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; +import { spyElementPrototypes } from '@rc-component/util'; import React from 'react'; import type { TriggerProps, TriggerRef } from '../src'; import Trigger from '../src'; diff --git a/tests/arrow.test.jsx b/tests/arrow.test.jsx index d49087ba..8ca435f4 100644 --- a/tests/arrow.test.jsx +++ b/tests/arrow.test.jsx @@ -1,10 +1,7 @@ /* eslint-disable max-classes-per-file */ import { act, cleanup, render } from '@testing-library/react'; -import { - spyElementPrototype, - spyElementPrototypes, -} from '@rc-component/util/lib/test/domHook'; +import { spyElementPrototype, spyElementPrototypes } from '@rc-component/util'; import Trigger from '../src'; describe('Trigger.Arrow', () => { diff --git a/tests/basic.test.jsx b/tests/basic.test.jsx index 1da873db..b3553d0b 100644 --- a/tests/basic.test.jsx +++ b/tests/basic.test.jsx @@ -1,6 +1,6 @@ /* eslint-disable max-classes-per-file */ import { act, cleanup, fireEvent, render } from '@testing-library/react'; -import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; +import { spyElementPrototypes } from '@rc-component/util'; import React, { StrictMode, createRef } from 'react'; import ReactDOM, { createPortal } from 'react-dom'; import Trigger from '../src'; diff --git a/tests/flip-visibleFirst.test.tsx b/tests/flip-visibleFirst.test.tsx index 83194a5e..f9c4f5c3 100644 --- a/tests/flip-visibleFirst.test.tsx +++ b/tests/flip-visibleFirst.test.tsx @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-invalid-this */ import { act, cleanup, render } from '@testing-library/react'; -import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; +import { spyElementPrototypes } from '@rc-component/util'; import * as React from 'react'; import type { AlignType, TriggerProps, TriggerRef } from '../src'; import Trigger from '../src'; diff --git a/tests/flip.test.tsx b/tests/flip.test.tsx index bc1efec6..e28cf4f7 100644 --- a/tests/flip.test.tsx +++ b/tests/flip.test.tsx @@ -1,6 +1,6 @@ import { act, cleanup, render } from '@testing-library/react'; import { _rs } from '@rc-component/resize-observer'; -import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; +import { spyElementPrototypes } from '@rc-component/util'; import * as React from 'react'; import type { AlignType, TriggerProps } from '../src'; import Trigger from '../src'; diff --git a/tests/flipShift.test.tsx b/tests/flipShift.test.tsx index 57e88e77..82e8168d 100644 --- a/tests/flipShift.test.tsx +++ b/tests/flipShift.test.tsx @@ -1,5 +1,5 @@ import { act, cleanup, render } from '@testing-library/react'; -import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; +import { spyElementPrototypes } from '@rc-component/util'; import React from 'react'; import Trigger from '../src'; diff --git a/tests/mobile.test.tsx b/tests/mobile.test.tsx index 5fecdafc..dd137a0c 100644 --- a/tests/mobile.test.tsx +++ b/tests/mobile.test.tsx @@ -1,5 +1,5 @@ import { act, fireEvent, render } from '@testing-library/react'; -import isMobile from '@rc-component/util/lib/isMobile'; +import { isMobile } from '@rc-component/util'; import React from 'react'; import Trigger, { type TriggerProps } from '../src'; import { placementAlignMap } from './util'; diff --git a/tests/open-change.test.tsx b/tests/open-change.test.tsx index aa6c4c74..ef4cd9bb 100644 --- a/tests/open-change.test.tsx +++ b/tests/open-change.test.tsx @@ -1,5 +1,5 @@ import { act, cleanup, fireEvent, render } from '@testing-library/react'; -import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; +import { spyElementPrototypes } from '@rc-component/util'; import * as React from 'react'; import Trigger from '../src'; diff --git a/tests/perf.test.tsx b/tests/perf.test.tsx index a02d0861..c4fc0bda 100644 --- a/tests/perf.test.tsx +++ b/tests/perf.test.tsx @@ -1,5 +1,5 @@ import { cleanup, fireEvent, render } from '@testing-library/react'; -import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; +import { spyElementPrototypes } from '@rc-component/util'; import React from 'react'; import Trigger, { type TriggerProps } from '../src'; import { awaitFakeTimer, placementAlignMap } from './util'; diff --git a/tests/portal.test.jsx b/tests/portal.test.jsx index f7fb5da7..5fabf84f 100644 --- a/tests/portal.test.jsx +++ b/tests/portal.test.jsx @@ -1,7 +1,7 @@ /* eslint-disable max-classes-per-file */ import { act, cleanup, fireEvent, render } from '@testing-library/react'; -import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; +import { spyElementPrototypes } from '@rc-component/util'; import React from 'react'; import ReactDOM from 'react-dom'; import Trigger from '../src'; diff --git a/tests/rect.test.tsx b/tests/rect.test.tsx index ae26a5b8..bd50945a 100644 --- a/tests/rect.test.tsx +++ b/tests/rect.test.tsx @@ -1,5 +1,5 @@ import { cleanup, render } from '@testing-library/react'; -import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; +import { spyElementPrototypes } from '@rc-component/util'; import React from 'react'; import Trigger from '../src'; import { awaitFakeTimer } from './util'; diff --git a/tests/ref.test.tsx b/tests/ref.test.tsx index 2cff5977..2b57e59b 100644 --- a/tests/ref.test.tsx +++ b/tests/ref.test.tsx @@ -1,7 +1,7 @@ /* eslint-disable max-classes-per-file */ import { cleanup, render } from '@testing-library/react'; -import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; +import { spyElementPrototypes } from '@rc-component/util'; import React from 'react'; import Trigger, { type TriggerRef } from '../src'; diff --git a/tests/shadow.test.tsx b/tests/shadow.test.tsx index ac4109f6..c4172a98 100644 --- a/tests/shadow.test.tsx +++ b/tests/shadow.test.tsx @@ -1,5 +1,5 @@ import { act, fireEvent } from '@testing-library/react'; -import { resetWarned } from '@rc-component/util/lib/warning'; +import { resetWarned } from '@rc-component/util'; import React from 'react'; import { createRoot } from 'react-dom/client'; import Trigger from '../src'; From 1a87a0a5e358b3936372115bc2db6a15d1237ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E8=89=B3=E5=85=B5?= Date: Fri, 22 May 2026 09:28:08 +0800 Subject: [PATCH 2/2] fix: remove unintended trigger changes --- src/index.tsx | 41 ++--------------------------------------- src/mock.tsx | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 40 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index 4e05e6ef..9ad1d28f 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -7,7 +7,6 @@ import { getNodeRef, getShadowRoot, isDOM, - supportRef, useComposeRef, useControlledState, useEvent, @@ -798,17 +797,13 @@ export function generateTrigger( useResizeObserver(mergedOpen, targetEle, onTargetResize); // Compose refs - const childSupportRef = supportRef(child); - const mergedRef = useComposeRef( - setTargetRef, - childSupportRef ? getNodeRef(child) : null, - ); + const mergedRef = useComposeRef(setTargetRef, getNodeRef(child)); // Child Node const triggerNode = React.cloneElement(child, { ...mergedChildrenProps, ...passedProps, - ref: childSupportRef ? mergedRef : undefined, + ref: mergedRef, }); // Render @@ -880,36 +875,4 @@ export function generateTrigger( return Trigger; } -interface MockPortalProps { - open?: boolean; - autoDestroy?: boolean; - children: React.ReactElement; - getContainer?: () => HTMLElement; -} - -const MockPortal: React.FC = ({ - open, - autoDestroy, - children, - getContainer, -}) => { - const [visible, setVisible] = React.useState(open); - - React.useEffect(() => { - getContainer?.(); - }); - - React.useEffect(() => { - if (open) { - setVisible(true); - } else if (autoDestroy) { - setVisible(false); - } - }, [open, autoDestroy]); - - return visible ? children : null; -}; - -export const MockTrigger = generateTrigger(MockPortal); - export default generateTrigger(Portal); diff --git a/src/mock.tsx b/src/mock.tsx index da4b6e21..50942d11 100644 --- a/src/mock.tsx +++ b/src/mock.tsx @@ -1 +1,36 @@ -export { MockTrigger as default, UniqueProvider } from './index'; +import * as React from 'react'; +import { generateTrigger, UniqueProvider } from './index'; + +interface MockPortalProps { + open?: boolean; + autoDestroy?: boolean; + children: React.ReactElement; + getContainer?: () => HTMLElement; +} + +const MockPortal: React.FC = ({ + open, + autoDestroy, + children, + getContainer, +}) => { + const [visible, setVisible] = React.useState(open); + + React.useEffect(() => { + getContainer?.(); + }); + + React.useEffect(() => { + if (open) { + setVisible(true); + } else if (autoDestroy) { + setVisible(false); + } + }, [open, autoDestroy]); + + return visible ? children : null; +}; + +export default generateTrigger(MockPortal); + +export { UniqueProvider };