ควรใช้ TouchableNativeFeedback, TouchableHighlight หรือ TouchableOpacity เมื่อใด


94

ในการตอบสนองพื้นเมืองมีอย่างน้อยสามวิธีที่จะทำให้ปุ่ม: TouchableNativeFeedback, และTouchableHighlight TouchableOpacityนอกจากนี้ยังมีTouchableWithoutFeedbackซึ่งเอกสารระบุไว้อย่างชัดเจนว่าคุณไม่ควรใช้เนื่องจาก "องค์ประกอบทั้งหมดที่ตอบสนองต่อการกดควรมีการตอบสนองด้วยภาพเมื่อสัมผัส"

  • TouchableNativeFeedbackเป็น Android เท่านั้นและ "แทนที่ View ด้วย RCTView อินสแตนซ์อื่น"
  • TouchchableHighlight "เพิ่มมุมมองให้กับลำดับชั้นของมุมมอง"
  • TouchableOpacityทำงาน "โดยไม่ต้องเปลี่ยนลำดับชั้นของมุมมอง"

มีความแตกต่างที่สำคัญอื่น ๆ ระหว่างทั้งสามหรือไม่? หนึ่งในนั้นเป็นส่วนประกอบ goto หรือไม่? ในสิ่งที่กรณีที่คุณควรใช้TouchableHighlightมากกว่าTouchableOpacity? มีผลกระทบด้านประสิทธิภาพหรือไม่?

ฉันกำลังเขียนแอปพลิเคชันอยู่ในขณะนี้และพบว่าทั้งสามมีความล่าช้าอย่างมากระหว่างการแตะและการกระทำ (ในกรณีนี้คือการเปลี่ยนแปลงการนำทาง) มีวิธีใดบ้างที่จะทำให้ปลากระพง?


4
เท่าที่เกี่ยวข้องกับความรวดเร็ว ... การส่งออกทุกอย่างไปยัง console.log ทำให้การเปลี่ยนฉากช้าลงมาก ฉันเพิ่งเริ่มใช้ react native และค่อนข้างไม่ประทับใจกับความเร็วในขณะที่พัฒนาส่วนประกอบแรกของฉัน ฉันลบคำสั่ง console.log ทั้งหมด (รวมถึงการปิดใช้งานตัวบันทึก redux) และสร้างขึ้นสำหรับเป้าหมายการเปิดตัวและความเร็วก็ทำให้ฉันหายไป สิ่งนี้มาจากการพัฒนาแอพ Cordova
Travis White

คำตอบ:


115

แหล่งที่มา: https://medium.com/differential/better-cross-platform-react-native-components-cb8aadeba472โดย Nick Wientge

TouchableHighlight

•ทำอะไร: ทำให้พื้นหลังขององค์ประกอบมืดหรือสว่างขึ้นเมื่อกด

•ควรใช้เมื่อใด: บน iOS สำหรับองค์ประกอบที่สัมผัสได้หรือปุ่มที่มีรูปร่างทึบหรือพื้นหลังและในรายการ ListView

TouchableOpacity

•ให้ประโยชน์อะไรบ้าง: ลดความทึบขององค์ประกอบทั้งหมดเมื่อกด

•ควรใช้เมื่อใด: บน iOS สำหรับองค์ประกอบที่สัมผัสได้ซึ่งเป็นข้อความหรือไอคอนแบบสแตนด์อโลนที่ไม่มีสีพื้นหลัง

TouchableNativeFeedback

•มันทำอะไร: เพิ่มเอฟเฟกต์ระลอกคลื่นให้กับพื้นหลังเมื่อกด

•ควรใช้เมื่อใด: บน Android สำหรับองค์ประกอบที่สัมผัสได้เกือบทั้งหมด


ขอบคุณ! ฉันได้อ่านบทความนี้แล้ว แต่ไม่สามารถตอบคำถามของตัวเองได้อีกต่อไป มันคือสิ่งที่ฉันกำลังมองหา
damusnet

1
เมื่อใช้ TouchableNativeFeedback จะมีพื้นหลังสี่เหลี่ยมนี้ (ฉันไม่ได้หมายถึงการกระเพื่อม) เราจะปรับแต่งสิ่งนั้นได้อย่างไร (เช่นเพิ่มขนาดทำให้เป็นวงกลมหรืออาจจะลบออกและมีการกระเพื่อมเพียงอย่างเดียว)
Yasir

8

นี่คือวิธีที่ฉันมักจะตัดสินใจว่าจะใช้อะไร:

  • หากฉันกำลังสร้างสำหรับ Android เท่านั้นและส่วนประกอบมีขนาดใหญ่พอที่ความคิดเห็นดั้งเดิมจะแตกต่างอย่างเห็นได้ชัดจากการใช้งานอื่น ๆ ฉันจึงใช้ TouchableNativeFeedback
  • TouchableHighlightถ้าผมต้องการที่จะควบคุมความทึบแสงในส่วนหรือฉันต้องการให้ปุ่มที่จะมีสีเมื่อสัมผัสและฉันไม่ต้องการที่จะควบคุมรัฐที่มุ่งเน้นขององค์ประกอบบางอย่างภายในสัมผัสแล้วผมใช้ ( TouchableOpacityมีบางส่วนแปลก ๆ เมื่อคุณควบคุมความทึบด้วยตัวเอง)
  • ในกรณีอื่น ๆ ฉันใช้TouchableOpacityเพราะ "เปลือย" มากกว่าTouchableHighlight

1
คำตอบนี้เป็นการเริ่มต้นที่มีประโยชน์ ... แต่ฉันหวังว่าจะได้พบกับเหตุผลทางเทคนิคและ / หรือการออกแบบที่มั่นคงยิ่งขึ้นว่าทำไมต้องใช้อย่างอื่น
Beau Smith

2

ฉันคิดว่าความแตกต่างที่สำคัญหลัก ๆ ตามที่ระบุไว้ในเอกสาร:

TouchableHighlight must have one child (not zero or more than one). If you wish to have several child components, wrap them in a View.ลิงค์

สัมผัสได้

TouchableHighlight กระดาษห่อสำหรับทำให้มุมมองตอบสนองต่อการสัมผัสอย่างเหมาะสม เมื่อกดลงความทึบของมุมมองที่ห่อไว้จะลดลงซึ่งจะทำให้สีด้านล่างสามารถแสดงผ่านทำให้มุมมองมืดลงหรือย้อมสีได้

แผ่นรองด้านล่างมาจากการรวมเด็กไว้ในมุมมองใหม่ซึ่งอาจส่งผลต่อเลย์เอาต์และบางครั้งอาจทำให้เกิดสิ่งประดิษฐ์ภาพที่ไม่ต้องการหากใช้ไม่ถูกต้องตัวอย่างเช่นหากพื้นหลังสีของมุมมองที่ห่อไม่ได้ถูกตั้งค่าอย่างชัดเจนเป็นสีทึบแสง

สัมผัสได้

TouchableOpacity # เสื้อคลุมสำหรับทำให้มุมมองตอบสนองต่อการสัมผัสอย่างเหมาะสม เมื่อกดลงความทึบของมุมมองที่ห่อไว้จะลดลงและทำให้มืดลง


-3

ถ้าคุณต้องการ

  • ปุ่มไฮไลต์เมื่อกด - ใช้ TouchableHighlight
  • เปลี่ยนความทึบของปุ่มเมื่อกด - ใช้ TouchableOpacity

3
ฉันคิดว่าผู้เขียนตระหนักดีว่า a กำลังขอคำตอบที่ซับซ้อนกว่านี้
Rathk Czemerys

1
นอกจากนี้คุณยังสามารถใช้<TouchableHighlight underlayColor="transparent" />... และ Facebook ผสมสิ่งเหล่านี้ทั้งหมดใน F8 App github.com/fbsamples/f8app/blob/master/js/common/F8Touchable.js
damusnet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.