From 929920b3d7df044f87d1cac14ee6c894c89a926d Mon Sep 17 00:00:00 2001 From: Philip Spitzlinger Date: Thu, 21 Aug 2025 15:32:02 +0200 Subject: [PATCH 1/3] Don't override ref property when not configured to. --- src/components/connect.tsx | 7 +++++-- test/components/connect.spec.tsx | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/components/connect.tsx b/src/components/connect.tsx index fc096d918..774c8f3f7 100644 --- a/src/components/connect.tsx +++ b/src/components/connect.tsx @@ -747,11 +747,14 @@ function connect< // Now that all that's done, we can finally try to actually render the child component. // We memoize the elements for the rendered child component as an optimization. const renderedWrappedComponent = React.useMemo(() => { + const effectiveProps = {...actualChildProps}; + if (forwardRef) { + effectiveProps.ref = reactReduxForwardedRef + } return ( // @ts-ignore ) }, [reactReduxForwardedRef, WrappedComponent, actualChildProps]) diff --git a/test/components/connect.spec.tsx b/test/components/connect.spec.tsx index fd6199353..396424761 100644 --- a/test/components/connect.spec.tsx +++ b/test/components/connect.spec.tsx @@ -2588,6 +2588,25 @@ describe('React', () => { expect(tester.getByTestId('a')).toHaveTextContent('42') }) + + it('should not override ref property when not asked to.', async () => { + const store = createStore(() => ({})) + interface RefReceiverProps { + ref: React.Ref + } + function RefReceiver(props: RefReceiverProps) { + const {ref} = props + return + } + const DecoratedRefReceiver = connect()(RefReceiver) + const testRef = React.createRef() + rtl.render( + + + + ) + expect(testRef.current).toBeInstanceOf(HTMLSpanElement); + }) }) describe('Factory functions for mapState/mapDispatch', () => { From a978553d846765e1117dae21f0012d3d03f3e10c Mon Sep 17 00:00:00 2001 From: Philip Spitzlinger Date: Thu, 21 Aug 2025 16:26:58 +0200 Subject: [PATCH 2/3] Adapt test to work with React 18. --- test/components/connect.spec.tsx | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/test/components/connect.spec.tsx b/test/components/connect.spec.tsx index 396424761..70f38e4bb 100644 --- a/test/components/connect.spec.tsx +++ b/test/components/connect.spec.tsx @@ -2590,15 +2590,20 @@ describe('React', () => { }) it('should not override ref property when not asked to.', async () => { + type RootStateType = {} const store = createStore(() => ({})) - interface RefReceiverProps { - ref: React.Ref - } - function RefReceiver(props: RefReceiverProps) { - const {ref} = props - return - } - const DecoratedRefReceiver = connect()(RefReceiver) + type RefReceiverPropsType = {} + const RefReceiver = React.forwardRef( + (props: RefReceiverPropsType, ref) => + ); + type RefReceiverNoDispatchType = null + const decorator = connect< + RefReceiverPropsType, + RefReceiverNoDispatchType, + RefReceiverPropsType, + RootStateType + >(null, null) + const DecoratedRefReceiver = decorator(RefReceiver) const testRef = React.createRef() rtl.render( From 5ba583beed080dda7c5590ef8ee45ad5ea5d0aff Mon Sep 17 00:00:00 2001 From: Philip Spitzlinger Date: Thu, 21 Aug 2025 16:40:06 +0200 Subject: [PATCH 3/3] Actually using options forwardRef when testing against React-18. --- test/components/connect.spec.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/components/connect.spec.tsx b/test/components/connect.spec.tsx index 70f38e4bb..10afe2d86 100644 --- a/test/components/connect.spec.tsx +++ b/test/components/connect.spec.tsx @@ -2602,7 +2602,9 @@ describe('React', () => { RefReceiverNoDispatchType, RefReceiverPropsType, RootStateType - >(null, null) + >(null, null, null, { + forwardRef: IS_REACT_18 + }) const DecoratedRefReceiver = decorator(RefReceiver) const testRef = React.createRef() rtl.render(