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(