Pressable — vad är det, hantering av tryckningar i React Native

Författare: IT Sectr Publicerad: 2026-07-06 Lästid: 10 min

Pressable — en modern React Native-komponent för att hantera tryckningar, som ersätter föråldrade TouchableHighlight, TouchableOpacity och TouchableWithoutFeedback. Pressable tillhandahåller ett enhetligt API med detektering av pressed-, hovered- och focused-tillstånd. Komponenten introducerades i React Native 0.63 och rekommenderas av Meta för alla nya projekt. Läs mer om komponenten i Metas dokumentation.

Huvudpunkter

  • Pressable — universell komponent för tryckhantering med stöd för pressed-, hovered-, focused-tillstånd
  • API innehåller callbacks onPress, onLongPress, onPressIn, onPressOut och en tillståndsbaserad stilmallsfunktion
  • hitSlop utökar tryckområdet bortom komponentens synliga gränser för att förbättra UX
  • Ersättning av Touchable — Pressable förenar alla Touchable-komponenters API i ett flexibelt gränssnitt
  • Tillgänglighet — komponenten stödjer ARIA-roller och hanterar automatiskt VoiceOver och TalkBack

Vad är Pressable?

Pressable — en React Native-komponent som ger ett enhetligt gränssnitt för att hantera alla typer av tryckningar. Till skillnad från tre olika Touchable-komponenter (TouchableHighlight, TouchableOpacity, TouchableWithoutFeedback) ersätter Pressable dem alla med en enda med ett flexibelt system av tillstånd och styling.

Komponenten introducerades i React Native 0.63 (september 2020). Enligt Metas data (2026) använder 70% av nya projekt på React Native Pressable istället för Touchable-komponenter. Pressable löser Touchables huvudproblem — fragmenterat API och behovet av att växla mellan komponenter för olika effekter.

Pressables filosofi

Till skillnad från TouchableOpacity, där tryckeffekten är styvt definierad (ändring av opacitet), tillhandahåller Pressable en funktion som tar emot det aktuella tillståndet. Utvecklaren bestämmer själv hur de vill reagera visuellt på en tryckning: ändra färg, skala, skugga eller en kombination av effekter. Detta ger full kontroll över UX.

Pressable-tillstånd: pressed, hovered, focused

Pressable definierar tre interaktionstillstånd: pressed (finger på skärmen), hovered (markör över elementet på Web/TV), focused (element i tangentbordsfokus). Varje tillstånd aktiverar motsvarande callback och skickas till stilmallsfunktionen och renderingsfunktionen för barn.

TillståndVillkorTypisk reaktion
pressedFinger på skärmen eller klick nedtrycktÄndring av opacitet, skala, bakgrundsfärg
hoveredMarkör över elementet (Web, TV)Markering, skugga, understrykning
focusedElement i tangentbordsfokusKontur, ram, färgändring

Viktigt: hovered och focused fungerar endast på plattformar med pekarstöd (Web, Android TV, Apple TV). På mobila enheter är endast pressed tillgängligt. För plattformsoberoende applikationer, designa visuella reaktioner med hänsyn till denna begränsning.

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 och callbacks för Pressable

Pressable API innehåller fyra huvudsakliga callbacks: onPress (fullständig nedtryckning med släpp), onLongPress (lång nedtryckning), onPressIn (början av tryckning) och onPressOut (slut på tryckning). Kombinationen av onPressIn och onPressOut möjliggör att skapa anpassade animationer.

Ytterligare props: delayLongPress (fördröjning av lång nedtryckning, standard 500 ms), pressRetentionOffset (område utanför vilket trycket avbryts), android_ripple (ripple-effekt på Android). Viktigt: Ripple fungerar endast på Android 5+.

js
<Pressable
  onPress={() => console.log('Tryckt')}
  onLongPress={() => console.log('Lång tryckning')}
  onPressIn={() => console.log('Finger ned')}
  onPressOut={() => console.log('Finger upp')}
  delayLongPress={300}
  android_ripple={{ color: 'rgba(0,0,0,0.1)', borderless: false }}
  style={styles.button}>
  <Text>Press me</Text>
</Pressable>

onPress anropas endast när fingret lyfts inom komponentens område (med hänsyn till pressRetentionOffset). Om användaren flyttar fingret utanför gränserna utlöses inte onPress, vilket förhindrar falska tryckningar. onPressOut anropas i alla fall vid släpp.

hitSlop: utökning av tryckområde

hitSlop — en Pressable-prop som utökar tryckområdet bortom komponentens synliga gränser. Det är kritiskt för små element: ikoner, kryssrutor, radioknappar. Apple HIG rekommenderar en minsta touch target-storlek på 44x44 punkter. hitSlop gör det möjligt att uppfylla detta krav utan att ändra den visuella storleken.

hitSlop accepterar ett objekt { top, bottom, left, right } eller ett enda tal för alla sidor. Värden anges i logiska pixlar (dp/pt). För ikoner på 24x24 rekommenderas hitSlop på minst 10-12 på varje sida för att nå touch target på 44x44.

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

pressRetentionOffset — motsatsen till hitSlop: definierar området där användaren kan gå utanför komponentens gränser utan att trycket avbryts. Standard är lika med hitSlop. Om du vill att trycket ska bibehållas när du lämnar gränserna, öka pressRetentionOffset.

Pressable vs Touchable: när ska man byta

Pressable vs Touchable — den viktigaste frågan när du väljer komponent för tryckhantering. TouchableOpacity, TouchableHighlight och TouchableWithoutFeedback är föråldrade komponenter som inte kommer att tas bort men som inte får nya funktioner. Meta rekommenderar Pressable för nya projekt.

Huvudsakliga fördelar med Pressable: enhetligt API för alla typer av effekter, tillgång till pressed-tillstånd för anpassad styling, stöd för hovered/focused-tillstånd, hitSlop och pressRetentionOffset, onLongPress-callback utan extra konfiguration. TouchableOpacity är endast lämplig för enkel ändring av opacitet.

ScenarioTouchablePressable
Enkel tryckningTouchableOpacityPressable + opacitet i style
BakgrundsmarkeringTouchableHighlightPressable + backgroundColor
Utan visuell effektTouchableWithoutFeedbackPressable med tom style
Lång tryckningonLongPress på valfri TouchableonLongPress på Pressable
Anpassad animationAnimated + onPressIn/OutPressable + useAnimatedStyle
Ripple på AndroidTouchableNativeFeedbackPressable + android_ripple

Exempel på användning av Pressable

Pressable gör det möjligt att skapa komplexa interaktiva element med minimal kod. Nedan — ett exempel på en animerad knapp med skaländring vid tryckning och ripple-effekt på Android. En sådan knapp ersätter kombinationen 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>
  );
};

Viktigt: använd useNativeDriver: true för animationer i Pressable. Detta flyttar animationen till den ursprungliga tråden och förhindrar tappade bildrutor vid snabba tryckningar. För transform och opacitet stöds den ursprungliga drivrutinen på alla plattformar.

Vanliga frågor

Kan jag använda Pressable istället för TouchableOpacity utan att ändra koden?

Nej, Pressable har ett annat API. TouchableOpacity tillämpar automatiskt opacitet vid tryckning. Pressable kräver explicit angivelse av stil genom tillståndsfunktionen. Ersättningen är enkel: skicka style={({ pressed }) => [{ opacity: pressed ? 0.5 : 1 }]}.

Hur skapar jag en ripple-effekt som i Material Design?

Använd prop android_ripple med ett objekt { color, borderless }. Ripple-färgen anges i rgba-format. För runda knappar använd borderless: true. Ripple fungerar endast på Android 5+. På iOS använd en anpassad animation.

Varför fungerar inte onPress vid snabb scrollning?

Pressable har inbyggt skydd mot oavsiktliga tryckningar under scrollning. Om användaren scrollar en lista anropas inte onPress. Detta beteende kan konfigureras via pressRetentionOffset och delayPressIn.

Hur spårar jag lång tryckning med Pressable?

Använd prop onLongPress — inbyggt stöd för lång tryckning. Fördröjningen konfigureras via delayLongPress (standard 500 ms). För snabbmenyer och drag-and-drop, kombinera onLongPress med onPressIn.

Stödjer Pressable tangentbordsnavigering?

Ja, Pressable stödjer focused-tillstånd för tangentbordsnavigering på Android TV, Apple TV och Web. Använd styling via { focused } för att visa fokus. På mobila enheter är focused-tillstånd inte relevant.

Sammanfattning

  • Pressable — universell React Native-komponent för tryckhantering som ersätter TouchableOpacity, TouchableHighlight och TouchableWithoutFeedback
  • Tillstånd pressed, hovered, focused skickas till stilmallsfunktionen, vilket möjliggör anpassning av reaktionen för varje scenario
  • hitSlop utökar touch target till 44x44 punkter utan att ändra den visuella storleken, vilket förbättrar UX på små element
  • API innehåller onPress, onLongPress, onPressIn, onPressOut med konfigurerbar fördröjning via delayLongPress
  • android_ripple lägger till Material Design ripple-effekt på Android 5+ med konfiguration av färg och form
  • Migrering från Touchable kräver ersättning av automatiska effekter med explicit styling via tillståndsfunktionen
  • Animated + Pressable skapar smidiga tryckanimationer med useNativeDriver för prestanda

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också