Revert "Support writing to this.refs from userspace" (#28877)
Reverts facebook/react#28867 It broke some tests, reverting until we figure out why to avoid having too much delay in the sync.
Jan Kassens committed
Apr 19, 2024 at 12:35 UTC
f5ce642deed7c74c5ae5df54ec4340a8d028eac9
3 files changed
+9
-26
packages/react-reconciler/src/ReactFiberClassComponent.js
+1
@@ -819,6 +819,7 @@ function mountClassInstance(
819
const instance = workInProgress.stateNode;
820
instance.props = newProps;
821
instance.state = workInProgress.memoizedState;
822
+ instance.refs = {};
823
824
initializeUpdateQueue(workInProgress);
825
packages/react-reconciler/src/__tests__/ReactFiberRefs-test.js
-24
@@ -138,28 +138,4 @@ describe('ReactFiberRefs', () => {
138
);
139
expect(refProp).toBe('child');
140
});
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
- });
141
});
packages/react/src/ReactBaseClasses.js
+8
-2
@@ -8,13 +8,19 @@
8
import ReactNoopUpdateQueue from './ReactNoopUpdateQueue';
9
import assign from 'shared/assign';
10
11
+const emptyObject = {};
12
+if (__DEV__) {
13
+ Object.freeze(emptyObject);
14
+}
15
+
16
/**
17
* Base class helpers for the updating state of a component.
18
*/
19
function Component(props, context, updater) {
20
this.props = props;
21
this.context = context;
17
- this.refs = {};
22
+ // If a component has string refs, we will assign a different object later.
23
+ this.refs = emptyObject;
24
// We initialize the default updater but the real one gets injected by the
25
// renderer.
26
this.updater = updater || ReactNoopUpdateQueue;
@@ -127,7 +133,7 @@ function PureComponent(props, context, updater) {
133
this.props = props;
134
this.context = context;
135
// If a component has string refs, we will assign a different object later.
130
- this.refs = {};
136
+ this.refs = emptyObject;
137
this.updater = updater || ReactNoopUpdateQueue;
138
}
139