Skip to content

Commit

Permalink
Merge pull request #2646 from jsfb/getDOMNode-becomes-findDOMNode
Browse files Browse the repository at this point in the history
Added findDOMNode, as we move toward deprecating getDOMNode
  • Loading branch information
jimfb committed Dec 22, 2014
2 parents f7166d0 + b46a6ce commit e072534
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 8 deletions.
51 changes: 51 additions & 0 deletions src/browser/__tests__/findDOMNode.-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/**
* Copyright 2013-2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
* @emails react-core
*/

"use strict";

var React = require('React');
var ReactTestUtils = require('ReactTestUtils');

describe('findDOMNode', function() {
it('findDOMNode should return null if passed null', function() {
expect(React.findDOMNode(null)).toBe(null);
});

it('findDOMNode should find dom element', function() {
var MyNode = React.createClass({
render: function() {
return <div><span>Noise</span></div>;
}
});

var myNode = ReactTestUtils.renderIntoDocument(<MyNode />);
var myDiv = React.findDOMNode(myNode);
var mySameDiv = React.findDOMNode(myDiv);
expect(myDiv.tagName).toBe('DIV');
expect(mySameDiv).toBe(myDiv);
});

it('findDOMNode should reject random objects', function() {
expect(function() {React.findDOMNode({foo: 'bar'});})
.toThrow('Invariant Violation: Element appears to be neither ' +
'ReactComponent nor DOMNode (keys: foo)'
);
});

it('findDOMNode should reject unmounted objects with render func', function() {
expect(function() {React.findDOMNode({render: function(){}});})
.toThrow('Invariant Violation: Component contains `render` ' +
'method but is not mounted in the DOM'
);
});

});

50 changes: 50 additions & 0 deletions src/browser/findDOMNode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/**
* Copyright 2013-2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
* @providesModule findDOMNode
* @typechecks static-only
*/

"use strict";

var ReactComponent = require('ReactComponent');
var ReactInstanceMap = require('ReactInstanceMap');
var ReactMount = require('ReactMount');

var invariant = require('invariant');
var isNode = require('isNode');

/**
* Returns the DOM node rendered by this element.
*
* @param {ReactComponent|DOMElement} element
* @return {DOMElement} The root node of this element.
*/
function findDOMNode(componentOrElement) {
if (componentOrElement == null) {
return null;
}
if (isNode(componentOrElement)) {
return componentOrElement;
}
if (ReactInstanceMap.has(componentOrElement)) {
return ReactMount.getNodeFromInstance(componentOrElement);
}
invariant(
!(componentOrElement.render != null && typeof(componentOrElement.render) === 'function'),
'Component contains `render` method but is not mounted in the DOM',
Object.keys(componentOrElement)
);
invariant(
false,
'Element appears to be neither ReactComponent nor DOMNode (keys: %s)',
Object.keys(componentOrElement)
);
}

module.exports = findDOMNode;
2 changes: 2 additions & 0 deletions src/browser/ui/React.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ var ReactRef = require('ReactRef');
var ReactServerRendering = require('ReactServerRendering');

var assign = require('Object.assign');
var findDOMNode = require('findDOMNode');
var onlyChild = require('onlyChild');

ReactDefaultInjection.inject();
Expand Down Expand Up @@ -69,6 +70,7 @@ var React = {
},
constructAndRenderComponent: ReactMount.constructAndRenderComponent,
constructAndRenderComponentByID: ReactMount.constructAndRenderComponentByID,
findDOMNode: findDOMNode,
render: render,
renderToString: ReactServerRendering.renderToString,
renderToStaticMarkup: ReactServerRendering.renderToStaticMarkup,
Expand Down
10 changes: 2 additions & 8 deletions src/browser/ui/ReactBrowserComponentMixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@

"use strict";

var ReactMount = require('ReactMount');

var invariant = require('invariant');
var findDOMNode = require('findDOMNode');

var ReactBrowserComponentMixin = {
/**
Expand All @@ -24,11 +22,7 @@ var ReactBrowserComponentMixin = {
* @protected
*/
getDOMNode: function() {
invariant(
this.isMounted(),
'getDOMNode(): A component must be mounted to have a DOM node.'
);
return ReactMount.getNodeFromInstance(this);
return findDOMNode(this);
}
};

Expand Down

0 comments on commit e072534

Please sign in to comment.