Pressable — wat is het, afhandeling van tikken in React Native

Auteur: IT Sectr Gepubliceerd: 2026-07-06 Leestijd: 10 min

Pressable — een moderne React Native-component voor het afhandelen van aanrakingen, ter vervanging van verouderde TouchableHighlight, TouchableOpacity en TouchableWithoutFeedback. Pressable biedt een uniforme API met detectie van pressed-, hovered- en focused-statussen. De component verscheen in React Native 0.63 en wordt door Meta aanbevolen voor alle nieuwe projecten. Lees meer over de component in de Meta-documentatie.

Belangrijkste

  • Pressable — universele component voor aanraakafhandeling met ondersteuning voor pressed-, hovered-, focused-statussen
  • API bevat callbacks onPress, onLongPress, onPressIn, onPressOut en een op status gebaseerde stylingfunctie
  • hitSlop breidt het aanraakgebied uit buiten de zichtbare grenzen van de component voor betere UX
  • Vervanging van Touchable — Pressable verenigt de API van alle Touchable-componenten in één flexibele interface
  • Toegankelijkheid — de component ondersteunt ARIA-rollen en verwerkt automatisch VoiceOver en TalkBack

Wat is Pressable?

Pressable — een React Native-component die een uniforme interface biedt voor het afhandelen van alle soorten aanrakingen. In tegenstelling tot drie verschillende Touchable-componenten (TouchableHighlight, TouchableOpacity, TouchableWithoutFeedback), vervangt Pressable ze allemaal door één met een flexibel systeem van statussen en styling.

De component werd geïntroduceerd in React Native 0.63 (september 2020). Volgens Meta-gegevens (2026) gebruikt 70% van de nieuwe projecten op React Native Pressable in plaats van Touchable-componenten. Pressable lost het belangrijkste probleem van Touchable op — versnipperde API en de noodzaak om tussen componenten te schakelen voor verschillende effecten.

Filosofie van Pressable

In tegenstelling tot TouchableOpacity, waar het druk-effect vastligt (wijziging van doorzichtigheid), biedt Pressable een functie die de huidige status ontvangt. De ontwikkelaar beslist zelf hoe visueel te reageren op een aanraking: kleur, schaal, schaduw of een combinatie van effecten wijzigen. Dit geeft volledige controle over de UX.

Pressable-statussen: pressed, hovered, focused

Pressable definieert drie interactiestatussen: pressed (vinger op het scherm), hovered (cursor boven het element op Web/TV), focused (element in toetsenbordfocus). Elke status activeert de bijbehorende callback en wordt doorgegeven aan de stijlfunctie en de renderfunctie van kinderen.

StatusVoorwaardeTypische reactie
pressedVinger op het scherm of klik ingedruktWijziging van doorzichtigheid, schaal, achtergrondkleur
hoveredCursor boven het element (Web, TV)Verlichting, schaduw, onderstreping
focusedElement in toetsenbordfocusOmtrek, rand, kleurwijziging

Belangrijk: hovered en focused werken alleen op platforms met aanwijzerondersteuning (Web, Android TV, Apple TV). Op mobiele apparaten is alleen pressed beschikbaar. Voor cross-platform-applicaties ontwerpt u visuele reacties met deze beperking in gedachten.

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 en callbacks van Pressable

Pressable API bevat vier hoofdcallbacks: onPress (volledig indrukken met loslaten), onLongPress (lang indrukken), onPressIn (begin van aanraking) en onPressOut (einde van aanraking). De combinatie van onPressIn en onPressOut maakt het mogelijk om aangepaste animaties te maken.

Aanvullende props: delayLongPress (vertraging van lang indrukken, standaard 500 ms), pressRetentionOffset (gebied waarbuiten het indrukken wordt geannuleerd), android_ripple (ripple-effect op Android). Belangrijk: Ripple werkt alleen op Android 5+.

js
<Pressable
  onPress={() => console.log('Ingedrukt')}
  onLongPress={() => console.log('Lang indrukken')}
  onPressIn={() => console.log('Vinger omlaag')}
  onPressOut={() => console.log('Vinger omhoog')}
  delayLongPress={300}
  android_ripple={{ color: 'rgba(0,0,0,0.1)', borderless: false }}
  style={styles.button}>
  <Text>Press me</Text>
</Pressable>

onPress wordt alleen aangeroepen wanneer de vinger binnen het componentgebied (rekening houdend met pressRetentionOffset) wordt opgetild. Als de gebruiker de vinger buiten de grenzen beweegt, wordt onPress niet geactiveerd, wat valse tikken voorkomt. onPressOut wordt in elk geval bij loslaten aangeroepen.

hitSlop: aanraakgebied uitbreiden

hitSlop — een Pressable-prop die het aanraakgebied buiten de zichtbare grenzen van de component uitbreidt. Dit is cruciaal voor kleine elementen: pictogrammen, checkboxes, radioknoppen. Apple HIG beveelt een minimale touch target-grootte van 44x44 punten aan. hitSlop maakt het mogelijk om aan deze vereiste te voldoen zonder de visuele grootte te wijzigen.

hitSlop accepteert een object { top, bottom, left, right } of een enkel getal voor alle zijden. Waarden worden opgegeven in logische pixels (dp/pt). Voor pictogrammen van 24x24 wordt een hitSlop van minimaal 10-12 aan elke kant aanbevolen om een touch target van 44x44 te bereiken.

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

pressRetentionOffset — de omgekeerde van hitSlop: definieert het gebied waarbinnen de gebruiker buiten de grenzen van de component kan gaan zonder het indrukken te annuleren. Standaard gelijk aan hitSlop. Als u wilt dat het indrukken behouden blijft bij het verlaten van de grenzen, verhoogt u pressRetentionOffset.

Pressable vs Touchable: wanneer overstappen

Pressable vs Touchable — de belangrijkste vraag bij het kiezen van een component voor aanraakafhandeling. TouchableOpacity, TouchableHighlight en TouchableWithoutFeedback zijn verouderde componenten die niet worden verwijderd, maar geen nieuwe functies krijgen. Meta beveelt Pressable aan voor nieuwe projecten.

Belangrijkste voordelen van Pressable: uniforme API voor alle soorten effecten, toegang tot de pressed-status voor aangepaste styling, ondersteuning voor hovered/focused-statussen, hitSlop en pressRetentionOffset, onLongPress-callback zonder extra configuratie. TouchableOpacity is alleen geschikt voor eenvoudige wijziging van de doorzichtigheid.

ScenarioTouchablePressable
Eenvoudig tikkenTouchableOpacityPressable + doorzichtigheid in style
AchtergrondverlichtingTouchableHighlightPressable + backgroundColor
Zonder visueel effectTouchableWithoutFeedbackPressable met lege style
Lang indrukkenonLongPress op elke TouchableonLongPress op Pressable
Aangepaste animatieAnimated + onPressIn/OutPressable + useAnimatedStyle
Ripple op AndroidTouchableNativeFeedbackPressable + android_ripple

Voorbeelden van Pressable-gebruik

Pressable maakt het mogelijk om complexe interactieve elementen te maken met minimale code. Hieronder — een voorbeeld van een geanimeerde knop met schaalwijziging bij indrukken en een ripple-effect op Android. Zo'n knop vervangt de combinatie 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>
  );
};

Belangrijk: gebruik useNativeDriver: true voor animaties in Pressable. Dit verplaatst de animatie naar de native thread, waardoor frameverlies bij snel indrukken wordt voorkomen. Voor transform en doorzichtigheid wordt de native driver op alle platforms ondersteund.

Veelgestelde vragen

Kan ik Pressable gebruiken in plaats van TouchableOpacity zonder de code te wijzigen?

Nee, Pressable heeft een andere API. TouchableOpacity past automatisch doorzichtigheid toe bij indrukken. Pressable vereist expliciete opgave van de stijl via de statusfunctie. De vervanging is triviaal: geef style={({ pressed }) => [{ opacity: pressed ? 0.5 : 1 }]} door.

Hoe maak ik een ripple-effect zoals in Material Design?

Gebruik de prop android_ripple met een object { color, borderless }. De ripple-kleur wordt opgegeven in rgba-formaat. Voor ronde knoppen gebruikt u borderless: true. Ripple werkt alleen op Android 5+. Op iOS gebruikt u een aangepaste animatie.

Waarom werkt onPress niet bij snel scrollen?

Pressable heeft ingebouwde bescherming tegen onbedoeld indrukken tijdens het scrollen. Als de gebruiker een lijst scrollt, wordt onPress niet aangeroepen. Dit gedrag kan worden geconfigureerd via pressRetentionOffset en delayPressIn.

Hoe volg ik lang indrukken met Pressable?

Gebruik de prop onLongPress — ingebouwde ondersteuning voor lang indrukken. De vertraging wordt geconfigureerd via delayLongPress (standaard 500 ms). Voor contextmenu's en drag-and-drop combineert u onLongPress met onPressIn.

Ondersteunt Pressable toetsenbordnavigatie?

Ja, Pressable ondersteunt de focused-status voor toetsenbordnavigatie op Android TV, Apple TV en Web. Gebruik styling via { focused } voor het weergeven van focus. Op mobiele apparaten is de focused-status niet relevant.

Samenvatting

  • Pressable — universele React Native-component voor aanraakafhandeling, ter vervanging van TouchableOpacity, TouchableHighlight en TouchableWithoutFeedback
  • Statussen pressed, hovered, focused worden doorgegeven aan de stijlfunctie, waardoor reactie voor elk scenario kan worden aangepast
  • hitSlop breidt de touch target uit tot 44x44 punten zonder de visuele grootte te wijzigen, wat de UX op kleine elementen verbetert
  • API bevat onPress, onLongPress, onPressIn, onPressOut met configureerbare vertraging via delayLongPress
  • android_ripple voegt een Material Design ripple-effect toe op Android 5+ met configuratie van kleur en vorm
  • Migratie van Touchable vereist vervanging van automatische effecten door expliciete styling via de statusfunctie
  • Animated + Pressable creëeren vloeiende drukanimaties met useNativeDriver voor prestaties

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook