diff --git a/src/SelectTrigger.tsx b/src/SelectTrigger.tsx index 2674254e..6ceee38f 100644 --- a/src/SelectTrigger.tsx +++ b/src/SelectTrigger.tsx @@ -1,4 +1,4 @@ -import Trigger from '@rc-component/trigger'; +import Trigger, { type TriggerRef } from '@rc-component/trigger'; import type { AlignType, BuildInPlacements } from '@rc-component/trigger/lib/interface'; import classNames from 'classnames'; import * as React from 'react'; @@ -143,10 +143,10 @@ const SelectTrigger: React.ForwardRefRenderFunction(null); + const triggerPopupRef = React.useRef(null); React.useImperativeHandle(ref, () => ({ - getPopupElement: () => popupRef.current, + getPopupElement: () => triggerPopupRef.current?.popupElement, })); return ( @@ -158,11 +158,8 @@ const SelectTrigger: React.ForwardRefRenderFunction - {popupNode} - - } + popup={
{popupNode}
} + ref={triggerPopupRef} stretch={stretch} popupAlign={dropdownAlign} popupVisible={visible} diff --git a/tests/Popup.test.tsx b/tests/Popup.test.tsx new file mode 100644 index 00000000..f1768e28 --- /dev/null +++ b/tests/Popup.test.tsx @@ -0,0 +1,29 @@ +import { fireEvent, render } from '@testing-library/react'; +import React from 'react'; +import Select from '../src'; +import { injectRunAllTimers } from './utils/common'; + +// Mock Trigger. Since `__mocks__` already mock the trigger, we should back of origin one. +jest.mock('@rc-component/trigger', () => { + const OriTrigger = jest.requireActual('@rc-component/trigger').default; + return OriTrigger; +}); + +describe('Select.Popup', () => { + injectRunAllTimers(jest); + + it('click popup should not trigger close', () => { + const onDropdownVisibleChange = jest.fn(); + render( +