Pressable — mi ez, érintések kezelése a React Native-ban

Szerző: IT Sectr Megjelenés: 2026-07-06 Olvasási idő: 10 perc

Pressable — egy modern React Native komponens az érintések kezelésére, amely felváltja az elavult TouchableHighlight, TouchableOpacity és TouchableWithoutFeedback komponenseket. A Pressable egységes API-t biztosít a pressed, hovered és focused állapotok érzékelésével. A komponens a React Native 0.63-ban jelent meg, és a Meta ajánlja minden új projekthez. Bővebben a komponensről a Meta dokumentációjában olvashat.

Főbb pontok

  • Pressable — univerzális komponens érintések kezelésére pressed, hovered, focused állapotok támogatásával
  • API tartalmazza az onPress, onLongPress, onPressIn, onPressOut visszahívásokat és az állapot alapú stílusfüggvényt
  • hitSlop kiterjeszti az érintési területet a komponens látható határain túl az UX javítása érdekében
  • Touchable helyettesítése — a Pressable egyesíti az összes Touchable komponens API-ját egy rugalmas interfészbe
  • Akadálymentesítés — a komponens támogatja az ARIA szerepköröket és automatikusan kezeli a VoiceOver és TalkBack rendszereket

Mi az a Pressable?

Pressable — egy React Native komponens, amely egységes interfészt biztosít minden típusú érintés kezelésére. Három különböző Touchable komponenssel (TouchableHighlight, TouchableOpacity, TouchableWithoutFeedback) ellentétben a Pressable egyetlen komponenssel helyettesíti őket, rugalmas állapot és stílusrendszerrel.

A komponens a React Native 0.63-ban (2020 szeptemberében) került bevezetésre. A Meta adatai szerint (2026) az új React Native projektek 70%-a Pressable-t használ a Touchable komponensek helyett. A Pressable megoldja a Touchable fő problémáját — a töredezett API-t és a különböző effektekhez szükséges komponensek közötti váltogatást.

A Pressable filozófiája

Ellentétben a TouchableOpacity-val, ahol a nyomás effektus mereven meghatározott (átlátszóság változása), a Pressable egy függvényt biztosít, amely megkapja az aktuális állapotot. A fejlesztő maga dönti el, hogyan reagáljon vizuálisan az érintésre: színt, méretet, árnyékot vagy effektusok kombinációját változtat. Ez teljes kontrollt ad az UX felett.

Pressable állapotok: pressed, hovered, focused

Pressable három interakciós állapotot határoz meg: pressed (ujj a képernyőn), hovered (kurzor az elem felett Web/TV-n), focused (elem billentyűzet fókuszban). Minden állapot aktiválja a megfelelő visszahívást és továbbítódik a stílusfüggvénynek és a gyermek renderelő függvénynek.

ÁllapotFeltételTipikus reakció
pressedUjj a képernyőn vagy kattintás lenyomvaÁtlátszóság, méret, háttérszín változása
hoveredKurzor az elem felett (Web, TV)Kiemelés, árnyék, aláhúzás
focusedElem billentyűzet fókuszbanKörvonal, szegély, színváltozás

Fontos: a hovered és focused csak mutatótámogatással rendelkező platformokon működik (Web, Android TV, Apple TV). Mobileszközökön csak a pressed érhető el. Többplatformos alkalmazásokhoz tervezze a vizuális reakciókat ezt a korlátozást figyelembe véve.

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

Pressable API és visszahívások

Pressable API négy fő visszahívást tartalmaz: onPress (teljes lenyomás elengedéssel), onLongPress (hosszú lenyomás), onPressIn (érintés kezdete) és onPressOut (érintés vége). Az onPressIn és onPressOut kombinációja lehetővé teszi egyedi animációk létrehozását.

További propsok: delayLongPress (hosszú lenyomás késleltetése, alapértelmezett 500 ms), pressRetentionOffset (terület, amelyen túl a lenyomás törlődik), android_ripple (ripple effektus Androidon). Fontos: A Ripple csak Android 5+-on működik.

js
<Pressable
  onPress={() => console.log('Lenyomva')}
  onLongPress={() => console.log('Hosszú lenyomás')}
  onPressIn={() => console.log('Ujj le')}
  onPressOut={() => console.log('Ujj fel')}
  delayLongPress={300}
  android_ripple={{ color: 'rgba(0,0,0,0.1)', borderless: false }}
  style={styles.button}>
  <Text>Press me</Text>
</Pressable>

onPress csak akkor hívódik meg, ha az ujj a komponens területén belül (a pressRetentionOffset figyelembevételével) kerül felemelésre. Ha a felhasználó az ujját a határokon kívülre mozdítja, az onPress nem aktiválódik, megelőzve a téves lenyomásokat. Az onPressOut minden esetben meghívódik elengedéskor.

hitSlop: az érintési terület kiterjesztése

hitSlop — egy Pressable prop, amely kiterjeszti az érintési területet a komponens látható határain túl. Ez kritikus a kis elemeknél: ikonok, jelölőnégyzetek, választógombok. Az Apple HIG minimális érintési célméretként 44x44 pontot ajánl. A hitSlop lehetővé teszi e követelmény teljesítését a vizuális méret megváltoztatása nélkül.

A hitSlop elfogad egy { top, bottom, left, right } objektumot vagy egyetlen számot minden oldalra. Az értékek logikai pixelben (dp/pt) vannak megadva. 24x24-es ikonok esetén legalább 10-12 hitSlop ajánlott minden oldalon a 44x44-es érintési cél eléréséhez.

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

pressRetentionOffset — a hitSlop ellentéte: meghatározza azt a területet, ahol a felhasználó túlléphet a komponens határain anélkül, hogy a lenyomás érvénytelenítődne. Alapértelmezett egyenlő a hitSlop-pal. Ha szeretné, hogy a lenyomás megmaradjon a határok elhagyásakor, növelje a pressRetentionOffset értékét.

Pressable vs Touchable: mikor váltsunk

Pressable vs Touchable — a kulcskérdés az érintéskezelő komponens kiválasztásakor. A TouchableOpacity, TouchableHighlight és TouchableWithoutFeedback elavult komponensek, amelyek nem kerülnek eltávolításra, de nem kapnak új funkciókat. A Meta a Pressable-t ajánlja új projektekhez.

A Pressable fő előnyei: egységes API minden effektustípushoz, hozzáférés a pressed állapothoz egyedi stílushoz, hovered/focused állapotok támogatása, hitSlop és pressRetentionOffset, onLongPress visszahívás külön konfiguráció nélkül. A TouchableOpacity csak egyszerű átlátszóságváltoztatásra alkalmas.

ForgatókönyvTouchablePressable
Egyszerű lenyomásTouchableOpacityPressable + átlátszóság a style-ban
Háttér kiemelésTouchableHighlightPressable + backgroundColor
Vizuális effekt nélkülTouchableWithoutFeedbackPressable ürés style-sal
Hosszú lenyomásonLongPress bármely Touchable-nonLongPress a Pressable-en
Egyedi animációAnimated + onPressIn/OutPressable + useAnimatedStyle
Ripple AndroidonTouchableNativeFeedbackPressable + android_ripple

Pressable használati példák

Pressable lehetővé teszi összetett interaktív elemek létrehozását minimális kóddal. Alább — egy animált gomb példája, amely lenyomáskor méretet vált és ripple effektussal rendelkezik Androidon. Egy ilyen gomb helyettesíti a TouchableOpacity + Animated kombinációt.

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>
  );
};

Fontos: használja a useNativeDriver: true értéket a Pressable animációihoz. Ez áthelyezi az animációt a natív szálba, megelőzve a kockavesztést gyors lenyomásoknál. A transform és átlátszóság esetén a natív meghajtó minden platformon támogatott.

Gyakran Ismételt Kérdések

Használhatom a Pressable-t a TouchableOpacity helyett a kód módosítása nélkül?

Nem, a Pressable más API-val rendelkezik. A TouchableOpacity automatikusan alkalmazza az átlátszóságot lenyomáskor. A Pressable a stílus explicit megadását igényli az állapotfüggvényen keresztül. A csere egyszerű: adja át a style={({ pressed }) => [{ opacity: pressed ? 0.5 : 1 }]}.

Hogyan készítsek ripple effektust, mint a Material Design-ban?

Használja a android_ripple propsot egy { color, borderless } objektummal. A ripple színe rgba formátumban van megadva. Kerek gombokhoz használja a borderless: true értéket. A Ripple csak Android 5+-on működik. iOS-en használjon egyedi animációt.

Miért nem működik az onPress gyors görgetésnél?

A Pressable beépített védelemmel rendelkezik a véletlen lenyomások ellen görgetés közben. Ha a felhasználó egy listát görget, az onPress nem hívódik meg. Ez a viselkedés a pressRetentionOffset és delayPressIn segítségével konfigurálható.

Hogyan követhetek nyomon hosszú lenyomást a Pressable-lel?

Használja az onLongPress propsot — beépített támogatás a hosszú lenyomáshoz. A késleltetés a delayLongPress (alapértelmezett 500 ms) segítségével konfigurálható. Helyi menük és drag-and-drop esetén kombinálja az onLongPress-t az onPressIn-nel.

Támogatja a Pressable a billentyűzet navigációt?

Igen, a Pressable támogatja a focused állapotot a billentyűzet navigációhoz Android TV, Apple TV és Web esetén. Használja a stílusozást a { focused } segítségével a fókusz megjelenítéséhez. Mobileszközökön a focused állapot nem releváns.

Összefoglaló

  • Pressable — univerzális React Native komponens érintések kezelésére, amely felváltja a TouchableOpacity, TouchableHighlight és TouchableWithoutFeedback komponenseket
  • Állapotok pressed, hovered, focused továbbítódnak a stílusfüggvénynek, lehetővé téve a reakció testreszabását minden forgatókönyv számára
  • hitSlop kiterjeszti a érintési célt 44x44 pontra a vizuális méret módosítása nélkül, javítva az UX-t kis elemeken
  • API tartalmazza az onPress, onLongPress, onPressIn, onPressOut funkciókat konfigurálható késleltetéssel a delayLongPress segítségével
  • android_ripple Material Design ripple effektust ad Android 5+-hoz szín és forma konfigurációval
  • Migrálás Touchable-ről az automatikus effektusok explicit stílusozással történő helyettesítését igényli az állapotfüggvényen keresztül
  • Animated + Pressable sima lenyomási animációkat hoz létre a useNativeDriver segítségével a teljesítmény érdekében

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is