@samitouri / QOS-React / commits / f5ce642dee

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