Pressable — ano ito, paghawak ng mga pagpindot sa React Native

May-akda: IT Sectr Nai-publish: 2026-07-06 Oras ng pagbabasa: 10 min

Pressable — isang modernong React Native component para sa paghawak ng mga pagpindot, na pumapalit sa mga lumang TouchableHighlight, TouchableOpacity at TouchableWithoutFeedback. Ang Pressable ay nagbibigay ng nagkakaisang API na may detection ng pressed, hovered at focused na mga estado. Lumitaw ang component sa React Native 0.63 at inirerekomenda ng Meta para sa lahat ng bagong proyekto. Magbasa pa tungkol sa component sa dokumentasyon ng Meta.

Mga Pangunahing

  • Pressable — unibersal na component para sa paghawak ng pagpindot na may suporta sa pressed, hovered, focused na mga estado
  • API ay may kasamang mga callback na onPress, onLongPress, onPressIn, onPressOut at function ng styling batay sa estado
  • hitSlop nagpapalawak ng lugar ng pagpindot lampas sa nakikitang hangganan ng component para mapabuti ang UX
  • Pagpapalit ng Touchable — Pinag-iisa ng Pressable ang API ng lahat ng Touchable component sa isang flexible na interface
  • Accessibility — sinusuportahan ng component ang mga ARIA role at awtomatikong hinahawakan ang VoiceOver at TalkBack

Ano ang Pressable?

Pressable — isang React Native component na nagbibigay ng nagkakaisang interface para sa paghawak ng lahat ng uri ng pagpindot. Hindi tulad ng tatlong magkakaibang Touchable component (TouchableHighlight, TouchableOpacity, TouchableWithoutFeedback), pinapalitan silang lahat ng Pressable ng isa na may flexible na sistema ng mga estado at styling.

Pilosopiya ng Pressable

Hindi tulad ng TouchableOpacity kung saan ang epekto ng pagpindot ay mahigpit na tinukoy (pagbabago ng opacity), ang Pressable ay nagbibigay ng function na tumatanggap ng kasalukuyang estado. Ang developer mismo ang nagpapasya kung paano tutugon nang biswal sa pagpindot: baguhin ang kulay, scale, anino o kumbinasyon ng mga epekto. Nagbibigay ito ng buong kontrol sa UX.

Mga Estado ng Pressable: pressed, hovered, focused

Pressable ay tumutukoy sa tatlong estado ng interaksyon: pressed (daliri sa screen), hovered (cursor sa ibabaw ng elemento sa Web/TV), focused (elemento sa focus ng keyboard). Ang bawat estado ay nag-a-activate ng kaukulang callback at ipinapasa sa function ng mga style at sa render function ng mga anak.

EstadoKondisyon
pressedDaliri sa screen o click na pinipindotPagbabago ng opacity, scale, kulay ng background
hoveredCursor sa ibabaw ng elemento (Web, TV)Pag-highlight, anino, salungguhit
focusedElemento sa focus ng keyboardOutline, border, pagbabago ng kulay

Mahalaga: ang hovered at focused ay gumagana lamang sa mga platform na may suporta sa pointer (Web, Android TV, Apple TV). Sa mga mobile device, pressed lamang ang available. Para sa mga cross-platform na application, idisenyo ang mga visual na reaksyon na isinasaalang-alang ang limitasyong ito.

js
<Pressable
  style={({ pressed }) => [
    styles.button,
    pressed && styles.buttonPressed,
  ]}
  onPress={handlePress}>
  {({ pressed }) => (
    <Text style={pressed ? styles.textPressed : styles.text}>
      {pressed ? 'Release' : 'Press'}
    </Text>
  )}
</Pressable>

API at mga callback ng Pressable

API ng Pressable ay may kasamang apat na pangunahing callback: onPress (buong pagpindot na may pagbitaw), onLongPress (mahabang pagpindot), onPressIn (simula ng pagpindot) at onPressOut (pagtatapos ng pagpindot). Ang kombinasyon ng onPressIn at onPressOut ay nagbibigay-daan sa paglikha ng mga custom na animation.

Mga karagdagang props: delayLongPress (pagkaantala ng mahabang pagpindot, default na 500 ms), pressRetentionOffset (lugar kung saan kinansela ang pagpindot), android_ripple (ripple effect sa Android). Mahalaga: Ang Ripple ay gumagana lamang sa Android 5+.

js
<Pressable
  onPress={() => console.log('Pinindot')}
  onLongPress={() => console.log('Mahabang pagpindot')}
  onPressIn={() => console.log('Daliri pababa')}
  onPressOut={() => console.log('Daliri pataas')}
  delayLongPress={300}
  android_ripple={{ color: 'rgba(0,0,0,0.1)', borderless: false }}
  style={styles.button}>
  <Text>Press me</Text>
</Pressable>

onPress ay tinatawag lamang kapag ang daliri ay itinaas sa loob ng lugar ng component (isinasaalang-alang ang pressRetentionOffset). Kung ililipat ng user ang daliri sa labas ng mga hangganan, hindi magti-trigger ang onPress, na pumipigil sa mga maling pagpindot. Ang onPressOut ay tinatawag sa anumang kaso kapag binitawan.

hitSlop: pagpapalawak ng lugar ng pagpindot

hitSlop — isang prop ng Pressable na nagpapalawak ng lugar ng pagpindot lampas sa nakikitang hangganan ng component. Ito ay kritikal para sa maliliit na elemento: mga icon, checkbox, radio button. Inirerekomenda ng Apple HIG ang minimum na laki ng touch target na 44x44 puntos. Pinapayagan ng hitSlop na matugunan ang kinakailangang ito nang hindi binabago ang visual na laki.

Tumatanggap ang hitSlop ng object na { top, bottom, left, right } o isang numero para sa lahat ng panig. Ang mga halaga ay tinutukoy sa logical pixels (dp/pt). Para sa mga icon na 24x24, inirerekomenda ang hitSlop na hindi bababa sa 10-12 sa bawat panig upang maabot ang touch target na 44x44.

js
<Pressable
  hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}
  onPress={handleIconPress}
  style={styles.iconButton}>
  <Icon name="star" size={24} />
</Pressable>

pressRetentionOffset — kabaligtaran ng hitSlop: tumutukoy sa lugar kung saan ang user ay maaaring lumampas sa mga hangganan ng component nang hindi kinakansela ang pagpindot. Default ay katumbas ng hitSlop. Kung gusto mong manatili ang pagpindot kapag lumampas sa mga hangganan, dagdagan ang pressRetentionOffset.

Pressable vs Touchable: kailan lilipat

Pressable vs Touchable — ang pangunahing tanong sa pagpili ng component para sa paghawak ng pagpindot. Ang TouchableOpacity, TouchableHighlight at TouchableWithoutFeedback ay mga lumang component na hindi tatanggalin, ngunit hindi nakakatanggap ng mga bagong feature. Inirerekomenda ng Meta ang Pressable para sa mga bagong proyekto.

Mga pangunahing bentahe ng Pressable: nagkakaisang API para sa lahat ng uri ng epekto, access sa pressed status para sa custom na styling, suporta sa hovered/focused status, hitSlop at pressRetentionOffset, callback onLongPress nang walang karagdagang configuration. Ang TouchableOpacity ay angkop lamang para sa simpleng pagbabago ng opacity.

ScenarioTouchablePressable
Simpleng pagpindotTouchableOpacityPressable + opacity sa style
Pag-highlight ng backgroundTouchableHighlightPressable + backgroundColor
Walang visual na epektoTouchableWithoutFeedbackPressable na walang laman na style
Mahabang pagpindotonLongPress sa anumang TouchableonLongPress sa Pressable
Custom na animationAnimated + onPressIn/OutPressable + useAnimatedStyle
Ripple sa AndroidTouchableNativeFeedbackPressable + android_ripple

Mga halimbawa ng paggamit ng Pressable

Pressable ay nagbibigay-daan sa paglikha ng mga kumplikadong interactive na elemento na may kaunting code. Sa ibaba — halimbawa ng isang animated na button na may pagbabago ng scale kapag pinindot at ripple effect sa Android. Ang ganitong button ay pumapalit sa kombinasyon ng TouchableOpacity + Animated.

js
const AnimatedButton = ({ title, onPress }) => {
  const scale = React.useRef(new Animated.Value(1)).current;

  const handlePressIn = () => {
    Animated.spring(scale, {
      toValue: 0.96,
      useNativeDriver: true,
    }).start();
  };

  const handlePressOut = () => {
    Animated.spring(scale, {
      toValue: 1,
      friction: 3,
      useNativeDriver: true,
    }).start();
  };

  return (
    <Pressable
      onPress={onPress}
      onPressIn={handlePressIn}
      onPressOut={handlePressOut}
      android_ripple={{ color: 'rgba(255,255,255,0.3)' }}
      style={styles.button}>
      <AnimatedView style={[styles.inner, { transform: [{ scale }] }]}>
        <Text style={styles.text}>{title}</Text>
      </AnimatedView>
    </Pressable>
  );
};

Mahalaga: gamitin ang useNativeDriver: true para sa mga animation sa Pressable. Inililipat nito ang animation sa native thread, na pumipigil sa pagbaba ng frame sa mabilis na pagpindot. Para sa transform at opacity, ang native driver ay sinusuportahan sa lahat ng platform.

Mga Madalas Itanong

Maaari ko bang gamitin ang Pressable sa halip na TouchableOpacity nang hindi binabago ang code?

Hindi, ang Pressable ay may ibang API. Awtomatikong naglalapat ang TouchableOpacity ng opacity kapag pinindot. Ang Pressable ay nangangailangan ng malinaw na pagtukoy ng style sa pamamagitan ng function ng estado. Ang pagpapalit ay simple: ipasa ang style={({ pressed }) => [{ opacity: pressed ? 0.5 : 1 }]}.

Paano gumawa ng ripple effect tulad ng sa Material Design?

Gamitin ang prop na android_ripple na may object na { color, borderless }. Ang kulay ng ripple ay tinutukoy sa rgba format. Para sa mga bilog na button gamitin ang borderless: true. Ang Ripple ay gumagana lamang sa Android 5+. Sa iOS gumamit ng custom na animation.

Bakit hindi gumagana ang onPress kapag mabilis na nag-i-scroll?

Ang Pressable ay may built-in na proteksyon laban sa hindi sinasadyang pagpindot habang nag-i-scroll. Kung nag-i-scroll ang user ng listahan, hindi tinatawag ang onPress. Ang pag-uugaling ito ay maaaring i-configure sa pamamagitan ng pressRetentionOffset at delayPressIn.

Paano subaybayan ang mahabang pagpindot gamit ang Pressable?

Gamitin ang prop na onLongPress — built-in na suporta para sa mahabang pagpindot. Ang pagkaantala ay naka-configure sa pamamagitan ng delayLongPress (default na 500 ms). Para sa mga context menu at drag-and-drop, pagsamahin ang onLongPress sa onPressIn.

Sinusuportahan ba ng Pressable ang keyboard navigation?

Oo, ang Pressable ay sumusuporta sa focused status para sa keyboard navigation sa Android TV, Apple TV at Web. Gamitin ang styling sa pamamagitan ng { focused } para ipakita ang focus. Sa mga mobile device, ang focused status ay hindi nauugnay.

Buod

  • Pressable — unibersal na React Native component para sa paghawak ng pagpindot, na pumapalit sa TouchableOpacity, TouchableHighlight at TouchableWithoutFeedback
  • Mga Estado pressed, hovered, focused ay ipinapasa sa function ng mga style, na nagbibigay-daan sa pag-customize ng reaksyon para sa bawat scenario
  • hitSlop nagpapalawak ng touch target sa 44x44 puntos nang hindi binabago ang visual na laki, na nagpapabuti ng UX sa maliliit na elemento
  • API ay may kasamang onPress, onLongPress, onPressIn, onPressOut na may nako-configure na pagkaantala sa pamamagitan ng delayLongPress
  • android_ripple nagdaragdag ng Material Design ripple effect sa Android 5+ na may configuration ng kulay at hugis
  • Migrasyon mula sa Touchable ay nangangailangan ng pagpapalit ng mga automatic effect ng malinaw na styling sa pamamagitan ng function ng estado
  • Animated + Pressable lumilikha ng maayos na mga animation ng pagpindot gamit ang useNativeDriver para sa performance

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din