React Native: View onPress ไม่ทำงาน


108

ฉันกำลังเจอปัญหาแปลก ๆ ในแอปตอบกลับของฉันหากฉันตั้งค่าonPressเหตุการณ์เป็นViewมันจะไม่ถูกทริกเกอร์ แต่ถ้าฉันตั้งค่าให้เหมือนกันTextภายใน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

คำตอบ:


181

คุณสามารถใช้TouchableOpacityสำหรับonPressกิจกรรม Viewไม่มีonPressเสา

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

4
เอกสารอ้างอิงฉบับสมบูรณ์อยู่ที่นี่: facebook.github.io/react-native/docs/touchableopacity.html
Muhammad Hannan

onPress สามารถทำงานกับฟังก์ชัน async เป็นการเรียกกลับได้หรือไม่? ฉันไม่เห็นการกล่าวถึงเรื่องนี้ในเอกสารอย่างเป็นทางการ
ryanwebjackson

27

คุณสามารถห่อมุมมองด้วย a 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! ไม่pointerEventsNoneเกี่ยวกับการกดบล็อกเด็กในปกครองห่อ?
Noitidart

6

คุณสามารถใช้ TouchableOpacity, TouchableHighlight, TouchableNativeFeedback เพื่อบรรลุเป้าหมายนี้ ดูคอมโพเนนต์ไม่ได้ให้ 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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.