Skip to content

Commit ec073b5

Browse files
authored
Revert "Revert "Support writing to this.refs from userspace" (#28877)"
This reverts commit f5ce642.
1 parent f5ce642 commit ec073b5

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

packages/react-reconciler/src/ReactFiberClassComponent.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,6 @@ function mountClassInstance(
819819
const instance = workInProgress.stateNode;
820820
instance.props = newProps;
821821
instance.state = workInProgress.memoizedState;
822-
instance.refs = {};
823822

824823
initializeUpdateQueue(workInProgress);
825824

packages/react-reconciler/src/__tests__/ReactFiberRefs-test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,28 @@ describe('ReactFiberRefs', () => {
138138
);
139139
expect(refProp).toBe('child');
140140
});
141+
142+
test('strings refs can be codemodded to callback refs', async () => {
143+
let app;
144+
class App extends React.Component {
145+
render() {
146+
app = this;
147+
return (
148+
<div
149+
prop="Hello!"
150+
ref={el => {
151+
// `refs` used to be a shared frozen object unless/until a string
152+
// ref attached by the reconciler, but it's not anymore so that we
153+
// can codemod string refs to userspace callback refs.
154+
this.refs.div = el;
155+
}}
156+
/>
157+
);
158+
}
159+
}
160+
161+
const root = ReactNoop.createRoot();
162+
await act(() => root.render(<App />));
163+
expect(app.refs.div.prop).toBe('Hello!');
164+
});
141165
});

packages/react/src/ReactBaseClasses.js

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,13 @@
88
import ReactNoopUpdateQueue from './ReactNoopUpdateQueue';
99
import assign from 'shared/assign';
1010

11-
const emptyObject = {};
12-
if (__DEV__) {
13-
Object.freeze(emptyObject);
14-
}
15-
1611
/**
1712
* Base class helpers for the updating state of a component.
1813
*/
1914
function Component(props, context, updater) {
2015
this.props = props;
2116
this.context = context;
22-
// If a component has string refs, we will assign a different object later.
23-
this.refs = emptyObject;
17+
this.refs = {};
2418
// We initialize the default updater but the real one gets injected by the
2519
// renderer.
2620
this.updater = updater || ReactNoopUpdateQueue;
@@ -133,7 +127,7 @@ function PureComponent(props, context, updater) {
133127
this.props = props;
134128
this.context = context;
135129
// If a component has string refs, we will assign a different object later.
136-
this.refs = emptyObject;
130+
this.refs = {};
137131
this.updater = updater || ReactNoopUpdateQueue;
138132
}
139133

0 commit comments

Comments
 (0)