Added findDOMNode, as we move toward deprecating getDOMNode

This commit is contained in:
Jim
2014-12-18 13:55:44 -08:00
parent d488f534ae
commit b46a6ce4bb
4 changed files with 105 additions and 8 deletions
@@ -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
View File
@@ -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
View File
@@ -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();
@@ -69,6 +70,7 @@ var React = {
},
constructAndRenderComponent: ReactMount.constructAndRenderComponent,
constructAndRenderComponentByID: ReactMount.constructAndRenderComponentByID,
findDOMNode: findDOMNode,
render: render,
renderToString: ReactServerRendering.renderToString,
renderToStaticMarkup: ReactServerRendering.renderToStaticMarkup,
+2 -8
View File
@@ -11,9 +11,7 @@
"use strict";
var ReactMount = require('ReactMount');
var invariant = require('invariant');
var findDOMNode = require('findDOMNode');
var ReactBrowserComponentMixin = {
/**
@@ -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);
}
};