Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Type ReactRef #7600

Merged
merged 1 commit into from Sep 2, 2016
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file or symbol
Failed to load files and symbols.
+33 −12
Diff settings

Always

Just for now

@@ -7,12 +7,16 @@
* of patent rights can be found in the PATENTS file in the same directory.
*
* @providesModule ReactRef
* @flow
*/

'use strict';

var ReactOwner = require('ReactOwner');

import type { ReactInstance } from 'ReactInstanceType';
import type { ReactElement } from 'ReactElementType';

var ReactRef = {};

function attachRef(ref, component, owner) {
@@ -33,8 +37,11 @@ function detachRef(ref, component, owner) {
}
}

ReactRef.attachRefs = function(instance, element) {
if (element === null || element === false) {
ReactRef.attachRefs = function(
instance: ReactInstance,
element: ReactElement | string | number | null | false,
): void {
if (element === null || typeof element !== 'object') {
return;
}
var ref = element.ref;
@@ -43,7 +50,10 @@ ReactRef.attachRefs = function(instance, element) {
}
};

ReactRef.shouldUpdateRefs = function(prevElement, nextElement) {
ReactRef.shouldUpdateRefs = function(
prevElement: ReactElement | string | number | null | false,
nextElement: ReactElement | string | number | null | false,
): bool {
// If either the owner or a `ref` has changed, make sure the newest owner
// has stored a reference to `this`, and the previous owner (if different)
// has forgotten the reference to `this`. We use the element instead

This comment has been minimized.

Copy link
@vjeux

vjeux Aug 29, 2016

Author Contributor

flow is not smart enough to know that this check is flowing through the variable for the next condition

@@ -56,21 +66,32 @@ ReactRef.shouldUpdateRefs = function(prevElement, nextElement) {
// is made. It probably belongs where the key checking and
// instantiateReactComponent is done.

var prevEmpty = prevElement === null || prevElement === false;
var nextEmpty = nextElement === null || nextElement === false;
var prevRef = null;
var prevOwner = null;
if (prevElement !== null && typeof prevElement === 'object') {
prevRef = prevElement.ref;
prevOwner = prevElement._owner;
}

var nextRef = null;
var nextOwner = null;
if (nextElement !== null && typeof nextElement === 'object') {
nextRef = nextElement.ref;
nextOwner = nextElement._owner;
}

return (
// This has a few false positives w/r/t empty components.
prevEmpty || nextEmpty ||
nextElement.ref !== prevElement.ref ||
prevRef !== nextRef ||
// If owner changes but we have an unchanged function ref, don't update refs
(typeof nextElement.ref === 'string' &&
nextElement._owner !== prevElement._owner)
(typeof nextRef === 'string' && nextOwner !== prevOwner)

This comment has been minimized.

Copy link
@vjeux

vjeux Sep 2, 2016

Author Contributor

All the tests are passing but i'd love a second pair of eyes to know if this is safe

);
};

ReactRef.detachRefs = function(instance, element) {
if (element === null || element === false) {
ReactRef.detachRefs = function(
instance: ReactInstance,
element: ReactElement | string | number | null | false,
): void {
if (element === null || typeof element !== 'object') {
return;
}
var ref = element.ref;
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.