2016-07-29 89 views
7
<TouchableHighlight onPress={this._onPress.bind(this)}> 
    <Text style={{color: 'white'}}>CLOSE</Text> 
</TouchableHighlight> 

_onPress(e) { 
    console.log(e.nativeEvent.target); 
} 

如上所述,target只是一个名为node id的数字,但我想获得真正的元素。我怎样才能做到这一点?我怎样才能得到真正的节点id? react-native

回答

9

做到这一点最近改变反应过来的时候/阵营本地公共代码周围很感动,但我的建议是对ReactNativeComponentTree

更具体地说check out Inspector codeavailable methods的代码,下面的代码应该做的把戏你:

var ReactNativeComponentTree = require('react/lib/ReactNativeComponentTree'); 
ReactNativeComponentTree.getInstanceFromNode(nativeTag); 
+0

thks,你的回答是正确的 – CoderLim

+0

你有解决方案版本0.40 reac原生? –

+0

我在React源代码中看到了这个。 'ReactDOM.render(

Hi.

,node); var inst = ReactDOMComponentTree.getInstanceFromNode(node.firstChild);'from https://github.com/facebook/react/blob/efaa26eb50169aba7f9194119faf64b67cbff460/src/renderers/shared/hooks/__tests__/ReactHostOperationHistoryHook-test.js –

5

这就是我最终为自己解决类似的情况。它不以任何方式遵循相同的方法,但它做到了!

onItemPressed(item) { 
    this.props.navigateForward(item.sceneId); 
    this.props.closeDrawer(); 
} 

render() { 
    var listItems = []; 

    for (var i=0; i < this.props.navigation.scenes.length; i++) { 
    var item = this.props.navigation.scenes[i]; 

    listItems.push(<ListItem 
     onPress={this.onItemPressed.bind(this, item)} 
     key={i} 
     title={item.title} 
     leftIcon={{name: item.icon}} 
     underlayColor={colors.lightPrimary} 
     containerStyle={styles.menuItemStyle} 
     titleStyle={styles.menuItemTitle} 
    />); 
    } 


    return (
    <View style={styles.container}> 
     <List containerStyle={styles.listContainer}> 
     {listItems} 
     </List> 
    </View> 
) 
}; 
+4

这种方法以前是可以接受的,但是现在约定是为了避免为每个渲染周期传递新创建的函数,因为由于闭包以及由于引用每次都不同而引起的高性能代价(因此触发渲染)。 – eremzeit

+0

我认为这是一个更好的解决方案,然后接受。但应该有更好的一个。 – hsafarya

+1

@eremzeit你可以使用shouldComponentUpdate(nextProps,nextState){if(this.props ...!== nextProps ....){return true; }返回false;}以避免多余的呈现。 – Stich

1

在反应本地v.0.42你需要这样的说法:

import ReactNativeComponentTree from 'react-native/Libraries/Renderer/src/renderers/native/ReactNativeComponentTree'; 
ReactNativeComponentTree.getInstanceFromNode(e.target)._currentElement; 
3

在反应本地v.0.51你需要这样的说法:

import ReactNativeComponentTree from 'react-native/Libraries/Renderer/shims/ReactNativeComponentTree'; 
ReactNativeComponentTree.getInstanceFromNode(e.target); 

._currentElement.props变更为.memoizedProps