Skip to content

Commit 180b051

Browse files
bvaughnrhagigi
authored andcommitted
Renamed createRef .value attribute to .current (facebook#12375)
* Renamed createRef .value attribute to .current * Warn if invalid ref object is passed
1 parent 5eed8f9 commit 180b051

File tree

6 files changed

+84
-9
lines changed

6 files changed

+84
-9
lines changed

packages/react-dom/src/__tests__/ReactComponent-test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,8 @@ describe('ReactComponent', () => {
235235
}
236236

237237
componentDidMount() {
238-
expect(this.innerRef.value.getObject()).toEqual(innerObj);
239-
expect(this.outerRef.value.getObject()).toEqual(outerObj);
238+
expect(this.innerRef.current.getObject()).toEqual(innerObj);
239+
expect(this.outerRef.current.getObject()).toEqual(outerObj);
240240
mounted = true;
241241
}
242242
}

packages/react-dom/src/__tests__/ReactErrorBoundaries-test.internal.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,12 +1019,14 @@ describe('ReactErrorBoundaries', () => {
10191019
'ErrorBoundary render error',
10201020
'ErrorBoundary componentDidUpdate',
10211021
]);
1022-
expect(errorMessageRef.value.toString()).toEqual('[object HTMLDivElement]');
1022+
expect(errorMessageRef.current.toString()).toEqual(
1023+
'[object HTMLDivElement]',
1024+
);
10231025

10241026
log.length = 0;
10251027
ReactDOM.unmountComponentAtNode(container);
10261028
expect(log).toEqual(['ErrorBoundary componentWillUnmount']);
1027-
expect(errorMessageRef.value).toEqual(null);
1029+
expect(errorMessageRef.current).toEqual(null);
10281030
});
10291031

10301032
it('successfully mounts if no error occurs', () => {

packages/react-reconciler/src/ReactFiberCommitWork.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
import ReactErrorUtils from 'shared/ReactErrorUtils';
3030
import {Placement, Update, ContentReset} from 'shared/ReactTypeOfSideEffect';
3131
import invariant from 'fbjs/lib/invariant';
32+
import warning from 'fbjs/lib/warning';
3233

3334
import {commitCallbacks} from './ReactFiberUpdateQueue';
3435
import {onCommitUnmount} from './ReactFiberDevToolsHook';
@@ -147,7 +148,7 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
147148
}
148149
}
149150
} else {
150-
ref.value = null;
151+
ref.current = null;
151152
}
152153
}
153154
}
@@ -315,7 +316,19 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
315316
if (typeof ref === 'function') {
316317
ref(instanceToUse);
317318
} else {
318-
ref.value = instanceToUse;
319+
if (__DEV__) {
320+
if (!ref.hasOwnProperty('current')) {
321+
warning(
322+
false,
323+
'Unexpected ref object provided for %s. ' +
324+
'Use either a ref-setter function or Reacte.createRef().%s',
325+
getComponentName(finishedWork),
326+
getStackAddendumByWorkInProgressFiber(finishedWork),
327+
);
328+
}
329+
}
330+
331+
ref.current = instanceToUse;
319332
}
320333
}
321334
}
@@ -326,7 +339,7 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
326339
if (typeof currentRef === 'function') {
327340
currentRef(null);
328341
} else {
329-
currentRef.value = null;
342+
currentRef.current = null;
330343
}
331344
}
332345
}

packages/react/src/ReactCreateRef.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import type {RefObject} from 'shared/ReactTypes';
1111
// an immutable object with a single mutable value
1212
export function createRef(): RefObject {
1313
const refObject = {
14-
value: null,
14+
current: null,
1515
};
1616
if (__DEV__) {
1717
Object.seal(refObject);
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* Copyright (c) 2013-present, Facebook, Inc.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @emails react-core
8+
*/
9+
10+
'use strict';
11+
12+
let React;
13+
let ReactTestRenderer;
14+
15+
describe('ReactCreateRef', () => {
16+
beforeEach(() => {
17+
jest.resetModules();
18+
19+
React = require('react');
20+
ReactTestRenderer = require('react-test-renderer');
21+
});
22+
23+
it('should warn in dev if an invalid ref object is provided', () => {
24+
function Wrapper({children}) {
25+
return children;
26+
}
27+
28+
class ExampleComponent extends React.Component {
29+
render() {
30+
return null;
31+
}
32+
}
33+
34+
expect(() =>
35+
ReactTestRenderer.create(
36+
<Wrapper>
37+
<div ref={{}} />
38+
</Wrapper>,
39+
),
40+
).toWarnDev(
41+
'Unexpected ref object provided for div. ' +
42+
'Use either a ref-setter function or Reacte.createRef().\n' +
43+
' in div (at **)\n' +
44+
' in Wrapper (at **)',
45+
);
46+
47+
expect(() =>
48+
ReactTestRenderer.create(
49+
<Wrapper>
50+
<ExampleComponent ref={{}} />
51+
</Wrapper>,
52+
),
53+
).toWarnDev(
54+
'Unexpected ref object provided for ExampleComponent. ' +
55+
'Use either a ref-setter function or Reacte.createRef().\n' +
56+
' in ExampleComponent (at **)\n' +
57+
' in Wrapper (at **)',
58+
);
59+
});
60+
});

packages/shared/ReactTypes.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,5 @@ export type ReactPortal = {
101101
};
102102

103103
export type RefObject = {|
104-
value: any,
104+
current: any,
105105
|};

0 commit comments

Comments
 (0)