diff --git a/src/core/__tests__/ReactIdentity-test.js b/src/core/__tests__/ReactIdentity-test.js new file mode 100644 index 0000000000..ecf71a8553 --- /dev/null +++ b/src/core/__tests__/ReactIdentity-test.js @@ -0,0 +1,83 @@ +/** + * @jsx React.DOM + * @emails react-core + */ + +"use strict"; + +var React; +var ReactTestUtils; +var reactComponentExpect; + +describe('ReactIdentity', function() { + + beforeEach(function() { + require('mock-modules').autoMockOff().dumpCache(); + React = require('React'); + ReactTestUtils = require('ReactTestUtils'); + reactComponentExpect = require('reactComponentExpect'); + }); + + it('should allow keyed objects to express identity', function() { + var instance = +
+ {{ + first:
, + second:
+ }} +
; + + React.renderComponent(instance, document.createElement('div')); + var node = instance.getDOMNode(); + reactComponentExpect(instance).toBeDOMComponentWithChildCount(2); + expect(node.childNodes[0].id).toEqual('.reactRoot[0].:0:first'); + expect(node.childNodes[1].id).toEqual('.reactRoot[0].:0:second'); + }); + + it('should allow key property to express identity', function() { + var instance = +
+
+
+
; + + React.renderComponent(instance, document.createElement('div')); + var node = instance.getDOMNode(); + reactComponentExpect(instance).toBeDOMComponentWithChildCount(2); + expect(node.childNodes[0].id).toEqual('.reactRoot[0].:apple'); + expect(node.childNodes[1].id).toEqual('.reactRoot[0].:banana'); + }); + + it('should use instance identity', function() { + + var Wrapper = React.createClass({ + render: function() { + return {this.props.children}; + } + }); + + var instance = +
+ + + +
; + + React.renderComponent(instance, document.createElement('div')); + var node = instance.getDOMNode(); + reactComponentExpect(instance).toBeDOMComponentWithChildCount(3); + expect(node.childNodes[0].id) + .toEqual('.reactRoot[0].:wrap1'); + expect(node.childNodes[0].firstChild.id) + .toEqual('.reactRoot[0].:wrap1.:squirrel'); + expect(node.childNodes[1].id) + .toEqual('.reactRoot[0].:wrap2'); + expect(node.childNodes[1].firstChild.id) + .toEqual('.reactRoot[0].:wrap2.:bunny'); + expect(node.childNodes[2].id) + .toEqual('.reactRoot[0].:2'); + expect(node.childNodes[2].firstChild.id) + .toEqual('.reactRoot[0].:2.:chipmunk'); + }); + +}); diff --git a/src/utils/flattenChildren.js b/src/utils/flattenChildren.js index f7a4bd3372..031b86e588 100644 --- a/src/utils/flattenChildren.js +++ b/src/utils/flattenChildren.js @@ -51,8 +51,7 @@ var flattenChildrenImpl = function(res, children, nameSoFar) { if (Array.isArray(children)) { for (var i = 0; i < children.length; i++) { var child = children[i]; - key = child && child.mountInContainerNode && - (child._key || child.props.key); + key = child && (child._key || (child.props && child.props.key)); escapedKey = key ? escapeTextForBrowser(key) : ('' + i); flattenChildrenImpl( res,