Pressable — bu nima, React Native-da bosishlarni qayta ishlash

Muallif: IT Sectr Nashr etilgan: 2026-07-06 O'qish vaqti: 10 daq

Pressable — eskirgan TouchableHighlight, TouchableOpacity va TouchableWithoutFeedback o‘rnini bosuvchi, teginishlarni qayta ishlash uchun zamonaviy React Native komponenti. Pressable pressed, hovered va focused holatlarini aniqlash bilan yagona API taqdim etadi. Komponent React Native 0.63 da paydo bo‘lgan va Meta tomonidan barcha yangi loyihalar uchun tavsiya etiladi. Komponent haqida batafsil Meta hujjatlarida o‘qing.

Asosiy

  • Pressable — pressed, hovered, focused holatlarini qo‘llab-quvvatlovchi universal teginish komponenti
  • API onPress, onLongPress, onPressIn, onPressOut chaqiruvlari va holatga asoslangan stilizatsiya funksiyasini o‘z ichiga oladi
  • hitSlop UX ni yaxshilash uchun teginish maydonini komponentning ko‘rinadigan chegaralaridan tashqariga kengaytiradi
  • Touchable ni almashtirish — Pressable barcha Touchable komponentlari API-ni yagona moslashuvchan interfeysda birlashtiradi
  • Foydalanish qulayligi — komponent ARIA rollarini qo‘llab-quvvatlaydi va VoiceOver va TalkBack-ni avtomatik boshqaradi

Pressable nima?

Pressable — barcha turdagi teginishlarni qayta ishlash uchun yagona interfeysni taqdim etuvchi React Native komponenti. Uch xil Touchable komponentidan (TouchableHighlight, TouchableOpacity, TouchableWithoutFeedback) farqli o‘laroq, Pressable ularning barchasini moslashuvchan holat va stilizatsiya tizimi bilan bitta komponentda almashtiradi.

Komponent React Native 0.63 da (sentyabr 2020) taqdim etilgan. Meta ma’lumotlariga ko‘ra (2026), React Native-dagi yangi loyihalarning 70% i Touchable komponentlari o‘rniga Pressable dan foydalanadi. Pressable Touchable ning asosiy muammosini — tarqoq API va turli effektlar uchun komponentlar o‘rtasida almashish zaruriyatini hal qiladi.

Pressable falsafasi

TouchableOpacity dan farqli o‘laroq, bu erda bosish effekti qat’iy belgilangan (shaffoflikni o‘zgartirish), Pressable joriy holatni qabul qiluvchi funksiyani taqdim etadi. Dasturchi teginishga vizual reaksiyani o‘zi belgilaydi: rangni, masshtabni, soyani yoki effektlar kombinatsiyasini o‘zgartirish. Bu UX ustidan to‘liq nazorat beradi.

Pressable holatlari: pressed, hovered, focused

Pressable uchta o‘zaro ta’sir holatini belgilaydi: pressed (barmoq ekranda), hovered (kursor element ustida Web/TV da), focused (element klaviatura fokusida). Har bir holat tegishli chaqiruvni faollashtiradi va stillar funksiyasiga va bola render funksiyasiga uzatiladi.

HolatShartOdatiy reaksiya
pressedBarmoq ekranda yoki klik bosilganShaffoflik, masshtab, fon rangining o‘zgarishi
hoveredKursor element ustida (Web, TV)Yoritish, soya, pastki chiziq
focusedElement klaviatura fokusidaKontur, ramka, rang o‘zgarishi

Muhim: hovered va focused faqat ko‘rsatgichni qo‘llab-quvvatlovchi platformalarda ishlaydi (Web, Android TV, Apple TV). Mobil qurilmalarda faqat pressed mavjud. Platformalararo ilovalar uchun vizual reaksiyalarni ushbu cheklovni hisobga olgan holda loyihalashtiring.

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 va chaqiruvlari

Pressable API to‘rtta asosiy chaqiruvni o‘z ichiga oladi: onPress (qo‘yib yuborish bilan to‘liq bosish), onLongPress (uzun bosish), onPressIn (teginish boshlanishi) va onPressOut (teginish tugashi). onPressIn va onPressOut kombinatsiyasi maxsus animatsiyalar yaratishga imkon beradi.

Qo‘shimcha propslar: delayLongPress (uzun bosish kechikishi, standart 500 ms), pressRetentionOffset (bosish bekor qilinadigan maydon), android_ripple (Android da ripple effekti). Muhim: Ripple faqat Android 5+ da ishlaydi.

js
<Pressable
  onPress={() => console.log('Bosildi')}
  onLongPress={() => console.log('Uzun bosish')}
  onPressIn={() => console.log('Barmoq pastga')}
  onPressOut={() => console.log('Barmoq yuqoriga')}
  delayLongPress={300}
  android_ripple={{ color: 'rgba(0,0,0,0.1)', borderless: false }}
  style={styles.button}>
  <Text>Press me</Text>
</Pressable>

onPress faqat barmoq komponent ichida (pressRetentionOffset ni hisobga olgan holda) ko‘tarilganda chaqiriladi. Agar foydalanuvchi barmog‘ini chegaradan tashqariga olib chiqsa, onPress ishlamaydi, bu noto‘g‘ri bosishlarning oldini oladi. onPressOut har qanday holatda qo‘yib yuborilganda chaqiriladi.

hitSlop: teginish maydonini kengaytirish

hitSlop — teginish maydonini komponentning ko‘rinadigan chegaralaridan tashqariga kengaytiruvchi Pressable propsidir. Bu kichik elementlar uchun juda muhim: ikonkalar, chekbokslar, radio tugmalar. Apple HIG minimal teginish nishoni o‘lchami sifatida 44x44 nuqtani tavsiya qiladi. hitSlop vizual o‘lchamni o‘zgartirmasdan ushbu talabni bajarishga imkon beradi.

hitSlop { top, bottom, left, right } obyektini yoki barcha tomonlar uchun yagona sonni qabul qiladi. Qiymatlar mantiqiy piksel (dp/pt) larda beriladi. 24x24 ikonkalar uchun 44x44 teginish nishoniga erishish uchun har tomondan kamida 10-12 hitSlop tavsiya etiladi.

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

pressRetentionOffset — hitSlop ning teskarisi: foydalanuvchi bosishni bekor qilmasdan komponent chegaralaridan tashqariga chiqishi mumkin bo‘lgan maydonni belgilaydi. Standart hitSlop ga teng. Agar bosish chegaradan tashqarida saqlanishi kerak bo‘lsa, pressRetentionOffset ni oshiring.

Pressable vs Touchable: qachon o‘tish kerak

Pressable vs Touchable — teginishlarni qayta ishlash uchun komponent tanlashda asosiy savol. TouchableOpacity, TouchableHighlight va TouchableWithoutFeedback eskirgan komponentlar bo‘lib, ular o‘chirilmaydi, ammo yangi imkoniyatlar olmaydi. Meta yangi loyihalar uchun Pressable ni tavsiya qiladi.

Pressable ning asosiy afzalliklari: barcha turdagi effektlar uchun yagona API, maxsus stilizatsiya uchun pressed holatiga kirish, hovered/focused holatlarini qo‘llab-quvvatlash, hitSlop va pressRetentionOffset, qo‘shimcha sozlamalarsiz onLongPress chaqiruvi. TouchableOpacity faqat oddiy shaffoflikni o‘zgartirish uchun mos keladi.

SsenariyTouchablePressable
Oddiy bosishTouchableOpacityPressable + style da shaffoflik
Fon yoritishiTouchableHighlightPressable + backgroundColor
Vizual effektsizTouchableWithoutFeedbackBo‘sh style bilan Pressable
Uzun bosishHar qanday Touchable da onLongPressPressable da onLongPress
Maxsus animatsiyaAnimated + onPressIn/OutPressable + useAnimatedStyle
Android da RippleTouchableNativeFeedbackPressable + android_ripple

Pressable dan foydalanish misollari

Pressable minimal kod bilan murakkab interaktiv elementlar yaratishga imkon beradi. Quyida — bosilganda masshtabni o‘zgartiruvchi va Android da ripple effektiga ega animatsiyali tugma namunasi. Bunday tugma TouchableOpacity + Animated kombinatsiyasini almashtiradi.

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

Muhim: Pressable da animatsiyalar uchun useNativeDriver: true dan foydalaning. Bu animatsiyani native oqimga o‘tkazadi va tez bosishlarda kadr yo‘qotishlarining oldini oladi. Transform va shaffoflik uchun native drayver barcha platformalarda qo‘llab-quvvatlanadi.

Tez-tez beriladigan savollar

Kodni o‘zgartirmasdan TouchableOpacity o‘rniga Pressable ishlatish mumkinmi?

Yo‘q, Pressable ning boshqa API si bor. TouchableOpacity bosilganda avtomatik shaffoflikni qo‘llaydi. Pressable holat funksiyasi orqali aniq stillashni talab qiladi. Almashtirish oddiy: style={({ pressed }) => [{ opacity: pressed ? 0.5 : 1 }]} ni uzating.

Material Design dagi kabi ripple effektini qanday qilish kerak?

android_ripple propsidan { color, borderless } obyekti bilan foydalaning. Ripple rangi rgba formatida beriladi. Dumaloq tugmalar uchun borderless: true dan foydalaning. Ripple faqat Android 5+ da ishlaydi. iOS da maxsus animatsiyadan foydalaning.

Tez skroll qilishda onPress nima uchun ishlamaydi?

Pressable skroll paytida tasodifiy bosishlardan himoyaga ega. Agar foydalanuvchi ro‘yxatni skroll qilsa, onPress chaqirilmaydi. Bu xatti-harakatni pressRetentionOffset va delayPressIn orqali sozlash mumkin.

Pressable bilan uzun bosishni qanday kuzatish mumkin?

onLongPress propsidan foydalaning — uzun bosishning o‘rnatilgan qo‘llab-quvvatlashi. Kechikish delayLongPress (standart 500 ms) orqali sozlanadi. Kontekst menyulari va drag-and-drop uchun onLongPress ni onPressIn bilan birlashtiring.

Pressable klaviatura navigatsiyasini qo‘llab-quvvatlaydimi?

Ha, Pressable Android TV, Apple TV va Web da klaviatura navigatsiyasi uchun focused holatini qo‘llab-quvvatlaydi. Fokusni ko‘rsatish uchun { focused } orqali stilizatsiyadan foydalaning. Mobil qurilmalarda focused holati tegishli emas.

Xulosa

  • Pressable — TouchableOpacity, TouchableHighlight va TouchableWithoutFeedback o‘rnini bosuvchi universal React Native teginish komponenti
  • Holatlar pressed, hovered, focused stillar funksiyasiga uzatiladi, har bir ssenariy uchun reaksiyani sozlashga imkon beradi
  • hitSlop vizual o‘lchamni o‘zgartirmasdan teginish nishonini 44x44 nuqtagacha kengaytiradi, kichik elementlarda UX ni yaxshilaydi
  • API onPress, onLongPress, onPressIn, onPressOut ni o‘z ichiga oladi, kechikish delayLongPress orqali sozlanadi
  • android_ripple Android 5+ da rang va shakl sozlamalari bilan Material Design ripple effektini qo‘shadi
  • Touchable dan migratsiya avtomatik effektlarni holat funksiyasi orqali aniq stilizatsiya bilan almashtirishni talab qiladi
  • Animated + Pressable unumdorlik uchun useNativeDriver bilan silliq bosish animatsiyalarini yaratadi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing