Componenta View din React Native este elementul de bază al interfeței utilizatorului, echivalentul elementului HTML div pentru platformele mobile. View suportă înnestirea la orice adâncime, gestionează aranjarea elementelor copil prin Flexbox și procesează evenimentele tactile. Conform React Native Docs, 2024, View este cea mai frecvent utilizată componentă în aplicații — practic fiecare ecran este construit din containere View înnestite. Componenta se redă ca UIView nativ pe iOS și android.view.View pe Android, asigurând performanță și accesibilitate nativă.
Principalele puncte
View este componenta fundamentală React Native care servește ca container pentru alte componente. Suportă stilizarea prin StyleSheet, layout-ul prin Flexbox, gestionarea atingerilor, animațiile și transformările. View este o abstractizare peste elementele native de container: UIView pe iOS și android.view.View pe Android.
În React Native nu se pot folosi elemente HTML — în schimb toate layout-urile sunt construite din View. Chiar și Text și Image sunt de obicei împachetate în View pentru poziționare. Componenta poate fi goală (doar container) sau poate conține orice număr de elemente copil la orice adâncime.
View suportă redarea pe ambele platforme din același cod JavaScript. Proprietățile Flexbox, marginile, fundalul, umbrele și bordurile funcționează la fel pe iOS și Android. Diferențele de platformă sunt minime — de exemplu, umbrele pe iOS folosesc shadowColor/shadowOffset, iar pe Android — elevation.
Conform React Native Layout Docs, 2024, View este optimizat pentru dispozitive mobile: nu creează reprezentări native inutile la optimizarea flatten și procesează corect actualizarea în cascadă la modificarea stilurilor părintelui.
Componenta View are un set bogat de props pentru gestionarea aspectului, amplasării și interactivității. Toate props-urile se împart în mai multe categorii: stilizare, evenimente tactile, accesibilitate și caracteristici specifice platformei. Să analizăm grupurile cheie.
View suportă toate proprietățile CSS standard pentru platforme mobile. Principalele: flexDirection, justifyContent, alignItems pentru poziționare; margin, padding pentru margini; backgroundColor, borderRadius pentru aspect; width, height, maxHeight pentru dimensiuni.
View poate procesa evenimente tactile prin props-urile onStartShouldSetResponder, onMoveShouldSetResponder și onResponderGrant. Aceste evenimente permit implementarea gesturilor personalizate fără biblioteci. Pentru clicuri standard se folosesc onTouchStart, onTouchEnd și onPress (prin Pressable sau TouchableOpacity).
Pe iOS sunt disponibile shadowColor, shadowOffset, shadowOpacity, shadowRadius pentru umbre. Pe Android aceste proprietăți sunt ignorate — în locul lor se folosește elevation. Callback-urile onLayout sunt apelate la modificarea dimensiunilor View, ceea ce este util pentru layout-uri adaptive.
Flexbox este singurul mecanism de layout în React Native (spre deosebire de Web unde sunt disponibile Grid și Float). Toată poziționarea elementelor se face prin proprietățile Flexbox ale componentei View. În mod implicit, la View flexDirection este setat pe column, nu pe row ca în Web, ceea ce corespunde orientării verticale a ecranelor mobile.
flexDirection determină direcția axei principale: column (implicit) sau row. justifyContent gestionează distribuția de-a lungul axei principale (flex-start, center, space-between). alignItems — de-a lungul axei transversale (stretch — valoarea implicită). flex stabilește cota de spațiu disponibil pentru elementul copil.
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
const CardLayout = () => (
<View style={styles.card}>
<View style={styles.row}>
<View style={styles.avatar} />
<View style={styles.content}>
<Text style={styles.name}>John Doe</Text>
<Text style={styles.role}>Developer</Text>
</View>
</View>
</View>
);
Exemplul arată o structură tipică: View exterior — card, row interior — rând cu avatar și bloc text, content — coloană cu nume și rol. Această structură înnestită de View este standardul pentru orice ecran React Native.
Deși View este conceptual similar cu div HTML, există diferențe cheie între ele care sunt importante de înțeles la transferul codului de pe Web pe React Native. Aceste diferențe privesc redarea, stilurile și comportamentul implicit.
| Caracteristică | View (React Native) | div (HTML) |
|---|---|---|
| flexDirection implicit | column | row (în context block) |
| width/height | Implicit 100% din părinte | auto după conținut |
| Derulare | Neacceptată (necesită ScrollView) | overflow: auto/scroll |
| Umbre | iOS: shadow*, Android: elevation | box-shadow |
| Procesare evenimente | Sistemul Responder | Evenimente DOM |
| Redare nativă | UIView / android.view.View | Element DOM |
Cea mai importantă diferență — implicit flexDirection: column. Aceasta înseamnă că fără setare explicită, elementele copil sunt aranjate vertical, nu orizontal. A doua diferență: width și height ale View se întind implicit pe tot spațiul disponibil al părintelui (analog cu width: 100% în CSS).
Să analizăm două exemple reale de utilizare a View în aplicații React Native: centrarea conținutului pe tot ecranul și crearea unei grile adaptive de carduri. Ambele modele se întâlnesc în fiecare proiect.
Pentru crearea stării goale (empty state) se folosește View cu flex: 1 și centrare pe ambele axe. Acesta este modelul standard pentru ecranele de încărcare, erori și liste goale.
const EmptyState = ({ message }) => (
<View style={styles.container}>
<Text style={styles.icon}>{icon}</Text>
<Text style={styles.message}>{message}</Text>
</View>
);
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: 'center', alignItems: 'center' },
icon: { fontSize: 48 },
message: { fontSize: 16, color: '#666', marginTop: 16 },
});
Combinația justifyContent: center și alignItems: center în View cu flex: 1 centrează conținutul pe ambele axe pe tot ecranul. Acesta este cel mai răspândit model de utilizare a View în React Native.
Pentru afișarea două coloane de produse sau articole se folosește View cu flexDirection: row, flexWrap: wrap și View-uri copil cu lățime fixă. Acest model înlocuiește CSS Grid în React Native.
const ProductGrid = ({ products }) => (
<View style={styles.grid}>
{products.map((product) => (
<View key={product.id} style={styles.card}>
<Image source={{ uri: product.image }} />
<Text>{product.name}</Text>
</View>
))}
</View>
);
const styles = StyleSheet.create({
grid: {
flexDirection: 'row',
flexWrap: 'wrap',
justifyContent: 'space-between',
},
card: { width: '48%', marginBottom: 16 },
});
În acest exemplu, View exterior cu flexWrap: wrap funcționează ca echivalentul CSS Grid. Fiecare card ocupă 48% din lățime, lăsând spații între coloane. Acesta este modelul tipic pentru cataloage și fluxuri de conținut.
Întrebări frecvente
View are implicit flexDirection: column (nu row ca în HTML), nu suportă derularea, width se întinde implicit pe 100% din părinte, iar umbrele se setează prin shadow* pe iOS și elevation pe Android.
Da, View suportă procesarea evenimentelor tactile prin onTouchStart, onTouchEnd și sistemul Responder. Totuși, pentru butoane este mai bine să folosiți TouchableOpacity, Pressable sau Button — acestea oferă feedback vizual și respectă Accessibility API.
Nu neapărat. React Native optimizează redarea prin View flattening — View-urile inutile fără stiluri și evenimente sunt eliminate din arborele nativ. Totuși, pentru lizibilitatea codului, este mai bine să folosiți View ca containere pentru blocurile logice ale interfeței.
Setați borderRadius egal cu jumătate din lățime și înălțime (de exemplu, width: 50, height: 50, borderRadius: 25). Dacă lățimea și înălțimea sunt egale, un astfel de View devine cerc. Pentru avataruri, acesta este modelul standard.
Setați opacity de la 0 la 1 (de exemplu, opacity: 0.5). De asemenea, puteți folosi backgroundColor cu RGBA (backgroundColor: 'rgba(0,0,0,0.5)'). Diferența este că opacity se aplică întregului container și conținutului său, iar RGBA — doar fundalului.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și