[ReactNative] Revert onItemRef removal

This commit is contained in:
Kevin Gozali 2015-07-16 17:35:54 -07:00
parent 5ec60effea
commit 77a0cf27f2

View File

@ -220,6 +220,11 @@ var Navigator = React.createClass({
*/ */
onDidFocus: PropTypes.func, onDidFocus: PropTypes.func,
/**
* Will be called with (ref, indexInStack, route) when the scene ref changes
*/
onItemRef: PropTypes.func,
/** /**
* Optionally provide a navigation bar that persists across scene * Optionally provide a navigation bar that persists across scene
* transitions * transitions
@ -313,6 +318,7 @@ var Navigator = React.createClass({
onPanResponderMove: this._handlePanResponderMove, onPanResponderMove: this._handlePanResponderMove,
onPanResponderTerminate: this._handlePanResponderTerminate, onPanResponderTerminate: this._handlePanResponderTerminate,
}); });
this._itemRefs = {};
this._interactionHandle = null; this._interactionHandle = null;
this._emitWillFocus(this.state.routeStack[this.state.presentedIndex]); this._emitWillFocus(this.state.routeStack[this.state.presentedIndex]);
}, },
@ -1000,10 +1006,22 @@ var Navigator = React.createClass({
return this.state.routeStack.slice(); return this.state.routeStack.slice();
}, },
_handleItemRef: function(itemId, route, ref) {
this._itemRefs[itemId] = ref;
var itemIndex = this.state.idStack.indexOf(itemId);
if (itemIndex === -1) {
return;
}
this.props.onItemRef && this.props.onItemRef(ref, itemIndex, route);
},
_cleanScenesPastIndex: function(index) { _cleanScenesPastIndex: function(index) {
var newStackLength = index + 1; var newStackLength = index + 1;
// Remove any unneeded rendered routes. // Remove any unneeded rendered routes.
if (newStackLength < this.state.routeStack.length) { if (newStackLength < this.state.routeStack.length) {
this.state.idStack.slice(newStackLength).map((removingId) => {
this._itemRefs[removingId] = null;
});
this.setState({ this.setState({
sceneConfigStack: this.state.sceneConfigStack.slice(0, newStackLength), sceneConfigStack: this.state.sceneConfigStack.slice(0, newStackLength),
idStack: this.state.idStack.slice(0, newStackLength), idStack: this.state.idStack.slice(0, newStackLength),
@ -1013,22 +1031,38 @@ var Navigator = React.createClass({
}, },
_renderScene: function(route, i) { _renderScene: function(route, i) {
var child = this.props.renderScene(
route,
this
);
var disabledSceneStyle = null; var disabledSceneStyle = null;
if (i !== this.state.presentedIndex) { if (i !== this.state.presentedIndex) {
disabledSceneStyle = styles.disabledScene; disabledSceneStyle = styles.disabledScene;
} }
var originalRef = child.ref;
if (originalRef != null && typeof originalRef !== 'function') {
console.warn(
'String refs are not supported for navigator scenes. Use a callback ' +
'ref instead. Ignoring ref: ' + originalRef
);
originalRef = null;
}
return ( return (
<View <View
key={'scene_' + i} key={this.state.idStack[i]}
ref={'scene_' + i} ref={'scene_' + i}
onStartShouldSetResponderCapture={() => { onStartShouldSetResponderCapture={() => {
return (this.state.transitionFromIndex != null) || (this.state.transitionFromIndex != null); return (this.state.transitionFromIndex != null) || (this.state.transitionFromIndex != null);
}} }}
style={[styles.baseScene, this.props.sceneStyle, disabledSceneStyle]}> style={[styles.baseScene, this.props.sceneStyle, disabledSceneStyle]}>
{this.props.renderScene( {React.cloneElement(child, {
route, ref: component => {
this this._handleItemRef(this.state.idStack[i], route, component);
)} if (originalRef) {
originalRef(component);
}
}
})}
</View> </View>
); );
}, },