162 votes

React Native : View onPress ne fonctionne pas

Je suis confronté à un problème étrange. Dans mon application react native, si je mets onPress à l'événement View il n'est pas déclenché mais si je mets la même chose à Text à l'intérieur de View il fait feu. Qu'est-ce que je rate ici ?

<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>

Pourquoi en est-il ainsi ? Est-ce un problème avec React Native ? J'utilise la version 0.43

273voto

Ahsan Ali Points 2640

Vous pouvez utiliser TouchableOpacity pour onPress événement. View ne fournit pas onPress prop.

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

4 votes

La documentation de référence complète se trouve ici : facebook.github.io/react-native/docs/touchableopacity.html

0 votes

Est-ce que onPress peut fonctionner avec une fonction asynchrone comme callback ? Je ne vois pas de mention de cela dans la documentation officielle.

39voto

Noitidart Points 3818

Vous pouvez envelopper la vue avec un TouchableWithoutFeedback et ensuite utiliser onPress et vos amis comme d'habitude. Vous pouvez aussi toujours bloquer pointerEvents en définissant l'attribut on sur la vue enfant, il bloque même les événements de pointeur sur la vue parent TouchableWithoutFeedback C'est intéressant, c'était mon besoin sur Android, je n'ai pas testé sur 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 votes

Testé sur iOS et cela fonctionne très bien. Aussi bien avec touchable sans feedback qu'avec touchable en surbrillance.

0 votes

Merci de partager @habed ! Est-ce que le pointerEventsNone sur le bloc enfant appuie sur le parent qui l'enveloppe ?

15voto

Sydney C. Points 55

Vous pouvez également fournir onStartShouldSetResponder à votre vue, comme suit :

<View onStartShouldSetResponder={() => console.log("View click")}>
  // some code here
</View>

7voto

Vous pouvez utiliser TouchableOpacity, TouchableHighlight, TouchableNativeFeedback, pour y parvenir. Le composant View ne fournit pas onPress comme props. Vous pouvez donc utiliser ces éléments à la place.

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

OR

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

OR

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

5voto

bisma Points 31

OnPress ne fonctionne pas sur <View> utilisation des étiquettes <TouchableOpacity> au lieu de View

<View>
<TouchableOpacity onPress={() => 'call your function here'}>
</TouchableOpacity>
</View>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X