diff --git a/package.json b/package.json index c956560739..731ae6cfbb 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "babel": "^5.8.23", "babel-core": "^5.8.38", "babel-loader": "^5.4.0", + "babel-polyfill": "^6.5.0", "expect": "^1.16.0", "json-loader": "^0.5.3", "karma": "^0.13.22", diff --git a/src/Velociraptor.js b/src/Velociraptor.js index 066b1e2d05..ad12d1323b 100644 --- a/src/Velociraptor.js +++ b/src/Velociraptor.js @@ -13,25 +13,30 @@ module.exports = React.createClass({ displayName: 'Velociraptor', propTypes: { - children: React.PropTypes.array, + // either a list of child nodes, or a single child. + children: React.PropTypes.any, + + // optional transition information for changing existing children transition: React.PropTypes.object, - container: React.PropTypes.string }, componentWillMount: function() { - this.children = {}; this.nodes = {}; - var self = this; - React.Children.map(this.props.children, function(c) { - self.children[c.key] = c; - }); + this._updateChildren(this.props.children); }, componentWillReceiveProps: function(nextProps) { + this._updateChildren(nextProps.children); + }, + + /** + * update `this.children` according to the new list of children given + */ + _updateChildren: function(newChildren) { var self = this; - var oldChildren = this.children; + var oldChildren = this.children || {}; this.children = {}; - React.Children.map(nextProps.children, function(c) { + React.Children.toArray(newChildren).forEach(function(c) { if (oldChildren[c.key]) { var old = oldChildren[c.key]; var oldNode = ReactDom.findDOMNode(self.nodes[old.key]); @@ -92,22 +97,23 @@ module.exports = React.createClass({ //console.log("start: "+JSON.stringify(startStyles[i])); } // and then we animate to the resting state - Velocity(domNode, node.props._restingStyle, transitionOpts[i-1]); + Velocity(domNode, node.props._restingStyle, + transitionOpts[i-1]) + .then(() => { + // once we've reached the resting state, hide the element if + // appropriate + domNode.style.visibility = node.props._restingStyle.visibility; + }); + //console.log("enter: "+JSON.stringify(node.props._restingStyle)); } this.nodes[k] = node; }, render: function() { - var self = this; - var childList = Object.keys(this.children).map(function(k) { - return React.cloneElement(self.children[k], { - ref: self.collectNode.bind(self, self.children[k].key) - }); - }); return ( - {childList} + {Object.values(this.children)} ); }, diff --git a/test/skinned-sdk.js b/test/skinned-sdk.js index 5d3526b797..869902dcf6 100644 --- a/test/skinned-sdk.js +++ b/test/skinned-sdk.js @@ -5,6 +5,14 @@ * application to provide */ +/* this is a convenient place to ensure we load the compatibility libraries we expect our + * app to provide + */ + +// for ES6 stuff like startsWith() and Object.values() that babel doesn't do by +// default +require('babel-polyfill'); + var sdk = require("../src/index"); var skin = require('../src/component-index.js');