React Native:View onPress不起作用


104

我面临一个奇怪的问题。在我的本机应用程序中,如果我未将onPress事件设置View为触发,但如果将其设置为Textinside View,则会触发。我在这里想念什么?

<View style={{backgroundColor: "red", padding: 20}}>
  <Text onPress={()=> {
    console.log('works');
    }
  }>X</Text>
</View>


<View style={{backgroundColor: "red", padding: 20}} onPress={()=> {
    console.log('does not work');
    }
  }>
  <Text>X</Text>
</View>

为什么会这样呢?这是React Native的问题吗?我正在使用版本0.43

Answers:


176

您可以使用TouchableOpacityonPress事件。 View不提供onPress道具。

<TouchableOpacity style={{backgroundColor: "red", padding: 20}} onPress={()=> {
    console.log('does not work');
    }
  }>
  <Text>X</Text>
</TouchableOpacity>


onPress可以将异步功能用作其回调吗?我没有在官方文档中提到这一点。
ryanwebjackson

27

您可以使用来包装视图,TouchableWithoutFeedback然后onPress像往常一样使用和朋友。同样,您仍然可以pointerEvents通过在子视图上设置属性来阻止,它甚至阻止父视图上的指针事件TouchableWithoutFeedback,这很有趣,这是我在Android上的需要,我没有在iOS上进行测试:

https://facebook.github.io/react-native/docs/touchablewithoutfeedback.html

<TouchableWithoutFeedback onPressIn={this.closeDrawer}>
    <Animated.View style={[styles.drawerBackground, styleBackground]} pointerEvents={isOpen ? undefined : 'none'} />
</TouchableWithoutFeedback>

2
在iOS上进行了测试,效果很好。都与可触摸无反馈和可触摸的亮点
habed

感谢您分享@habed!做了pointerEventsNone对包装父子块机?
Noitidart '18

6

您可以使用TouchableOpacity,TouchableHighlight,TouchableNativeFeedback来实现。View组件不提供onPress作为道具。因此,您可以使用这些代替。

<TouchableNativeFeedback
        onPress={this._onPressButton}
</TouchableNativeFeedback>

OR

<TouchableHighlight onPress={this._onPressButton}>
</TouchableHighlight>

OR

<TouchableOpacity onPress={this._onPressButton}>
</TouchableOpacity>


2

另外,您也可以向视图提供onStartShouldSetResponder,如下所示:

<View onStartShouldSetResponder={() => console.log("View click")}>
  // some code here
</View>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.