Komponent View w React Native to podstawowy budulec interfejsu użytkownika, odpowiednik HTML-owego div dla platform mobilnych. View obsługuje zagnieżdżanie na dowolną głębokość, zarządza rozmieszczeniem elementów potomnych przez Flexbox i przetwarza zdarzenia dotyku. Według React Native Docs, 2024, View jest najczęściej używanym komponentem w aplikacjach — praktycznie każdy ekran jest zbudowany z zagnieżdżonych kontenerów View. Komponent renderuje się do natywnego UIView na iOS i android.view.View na Androidzie, co zapewnia natywną wydajność i dostępność.
Najważniejsze
View to fundamentalny komponent React Native, który służy jako kontener dla innych komponentów. Obsługuje stylizację przez StyleSheet, układ przez Flexbox, obsługę dotyku, animacje i transformacje. View jest abstrakcją nad natywnymi elementami kontenerów: UIView na iOS i android.view.View na Androidzie.
W React Native nie można używać elementów HTML — zamiast nich wszystkie układy są budowane z View. Nawet Text i Image są zwykle owinięte w View do pozycjonowania. Komponent może być pusty (tylko kontener) lub zawierać dowolną liczbę elementów potomnych o dowolnym zagnieżdżeniu.
View obsługuje renderowanie na obie platformy z jednego kodu JavaScript. Właściwości Flexbox, marginesy, tło, cienie i obramowania działają tak samo na iOS i Androidzie. Różnice platformowe są minimalne — na przykład cienie na iOS używają shadowColor/shadowOffset, a na Androidzie — elevation.
Według React Native Layout Docs, 2024, View jest zoptymalizowany dla urządzeń mobilnych: nie tworzy niepotrzebnych natywnych reprezentacji przy optymalizacji flatten i poprawnie obsługuje kaskadową aktualizację przy zmianie stylów rodzica.
Komponent View ma bogaty zestaw propsów do zarządzania wyglądem, rozmieszczeniem i interaktywnością. Wszystkie propsy dzielą się na kilka kategorii: stylowe, zdarzenia dotyku, dostępność i cechy platformowe. Przyjrzyjmy się kluczowym grupom.
View obsługuje wszystkie standardowe właściwości CSS dla platform mobilnych. Kluczowe z nich: flexDirection, justifyContent, alignItems do pozycjonowania; margin, padding do marginesów; backgroundColor, borderRadius do wyglądu; width, height, maxHeight do rozmiarów.
View może przetwarzać zdarzenia dotyku przez propsy onStartShouldSetResponder, onMoveShouldSetResponder i onResponderGrant. Te zdarzenia pozwalają na implementację niestandardowych gestów bez bibliotek. Do standardowych kliknięć używa się onTouchStart, onTouchEnd i onPress (przez Pressable lub TouchableOpacity).
Na iOS dostępne są shadowColor, shadowOffset, shadowOpacity, shadowRadius do cieni. Na Androidzie te właściwości są ignorowane — zamiast nich używa się elevation (cień z reprezentacji karty). Callbacki onLayout są wywoływane przy zmianie rozmiarów View, co jest przydatne do adaptacyjnych układów.
Flexbox to jedyny mechanizm układu w React Native (w przeciwieństwie do Web, gdzie dostępne są Grid i Float). Całe pozycjonowanie elementów odbywa się przez właściwości Flexbox komponentu View. Domyślnie u View flexDirection jest ustawiony na column, a nie row jak w Web, co odpowiada pionowej orientacji ekranów mobilnych.
flexDirection określa kierunek głównej osi: column (domyślnie) lub row. justifyContent zarządza rozmieszczeniem wzdłuż osi głównej (flex-start, center, space-between). alignItems — wzdłuż osi poprzecznej (stretch — wartość domyślna). flex określa udział dostępnego miejsca dla elementu potomnego.
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>
);
W przykładzie pokazano typową strukturę: zewnętrzny View — karta, wewnętrzny row — wiersz z awatarem i blokiem tekstu, content — kolumna z nazwą i rolą. Taka zagnieżdżona struktura View to standard dla każdego ekranu React Native.
Chociaż View jest koncepcyjnie podobny do HTML div, istnieją między nimi kluczowe różnice, które ważne jest zrozumieć przy przenoszeniu kodu z Web na React Native. Różnice te dotyczą renderowania, stylów i domyślnego zachowania.
| Cecha | View (React Native) | div (HTML) |
|---|---|---|
| Domyślny flexDirection | column | row (w kontekście block) |
| width/height | Domyślnie 100% rodzica | auto według treści |
| Przewijanie | Nieobsługiwane (potrzebny ScrollView) | overflow: auto/scroll |
| Cienie | iOS: shadow*, Android: elevation | box-shadow |
| Obsługa zdarzeń | System Responder | Zdarzenia DOM |
| Natywne renderowanie | UIView / android.view.View | Element DOM |
Najważniejsza różnica — domyślnie flexDirection: column. Oznacza to, że bez jawnego ustawienia elementy potomne są rozmieszczane pionowo, a nie poziomo. Druga różnica: width i height View domyślnie rozciągają się na całe dostępne miejsce rodzica (analogicznie do width: 100% w CSS).
Przyjrzyjmy się dwóm rzeczywistym przykładom użycia View w aplikacjach React Native: centrowanie treści na całym ekranie i tworzenie adaptacyjnej siatki kafelek. Oba wzorce występują w każdym projekcie.
Do tworzenia pustego stanu (empty state) używa się View z flex: 1 i centrowaniem w obu osiach. To standardowy wzorzec dla ekranów ładowania, błędów i pustych list.
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 },
});
Połączenie justifyContent: center i alignItems: center w View z flex: 1 środkuje zawartość w obu osiach na całym ekranie. To najpopularniejszy wzorzec użycia View w React Native.
Do wyświetlania dwóch kolumn produktów lub artykułów używa się View z flexDirection: row, flexWrap: wrap i potomnymi View o stałej szerokości. Ten wzorzec zastępuje CSS Grid w 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 },
});
W tym przykładzie zewnętrzny View z flexWrap: wrap działa jak odpowiednik CSS Grid. Każdy kafelek zajmuje 48% szerokości, pozostawiając odstępy między kolumnami. To typowy wzorzec dla katalogów i kanałów treści.
Często zadawane pytania
View ma domyślnie flexDirection: column (nie row jak w HTML), nie obsługuje przewijania, width domyślnie rozciąga się na 100% rodzica, a cienie są ustawiane przez shadow* na iOS i elevation na Androidzie.
Tak, View obsługuje przetwarzanie zdarzeń dotyku przez onTouchStart, onTouchEnd i system Responder. Jednak do przycisków lepiej używać TouchableOpacity, Pressable lub Button — zapewniają one wizualne sprzężenie zwrotne i są zgodne z Accessibility API.
Niekoniecznie. React Native optymalizuje renderowanie przez View flattening — zbędne View bez stylów i zdarzeń są usuwane z natywnego drzewa. Jednak dla czytelności kodu lepiej używać View jako kontenerów dla logicznych bloków interfejsu.
Ustaw borderRadius równe połowie szerokości i wysokości (np. width: 50, height: 50, borderRadius: 25). Jeśli szerokość i wysokość są takie same, taki View stanie się okręgiem. Dla awatarów to standardowy wzorzec.
Ustaw opacity od 0 do 1 (np. opacity: 0.5). Można też użyć backgroundColor z RGBA (backgroundColor: 'rgba(0,0,0,0.5)'). Różnica polega na tym, że opacity stosuje się do całego kontenera i jego zawartości, a RGBA — tylko do tła.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również