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 — 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.
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.
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.
| Estado | Kondisyon | |
|---|---|---|
| pressed | Daliri sa screen o click na pinipindot | Pagbabago ng opacity, scale, kulay ng background |
| hovered | Cursor sa ibabaw ng elemento (Web, TV) | Pag-highlight, anino, salungguhit |
| focused | Elemento sa focus ng keyboard | Outline, 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.
<Pressable
style={({ pressed }) => [
styles.button,
pressed && styles.buttonPressed,
]}
onPress={handlePress}>
{({ pressed }) => (
<Text style={pressed ? styles.textPressed : styles.text}>
{pressed ? 'Release' : 'Press'}
</Text>
)}
</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+.
<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 — 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.
<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 — 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.
| Scenario | Touchable | Pressable |
|---|---|---|
| Simpleng pagpindot | TouchableOpacity | Pressable + opacity sa style |
| Pag-highlight ng background | TouchableHighlight | Pressable + backgroundColor |
| Walang visual na epekto | TouchableWithoutFeedback | Pressable na walang laman na style |
| Mahabang pagpindot | onLongPress sa anumang Touchable | onLongPress sa Pressable |
| Custom na animation | Animated + onPressIn/Out | Pressable + useAnimatedStyle |
| Ripple sa Android | TouchableNativeFeedback | Pressable + android_ripple |
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.
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
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 }]}.
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.
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.
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.
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
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.
Basahin din