Komponenta View v React Native je základním stavebním kamenem uživatelského rozhraní, obdobou HTML elementu div pro mobilní platformy. View podporuje vnořování do libovolné hloubky, spravuje umístění podřízených prvků přes Flexbox a zpracovává dotykové události. Podle React Native Docs, 2024 je View nejčastěji používanou komponentou v aplikacích — prakticky každá obrazovka je postavena z vnořených View kontejnerů. Komponenta se renderuje do nativního UIView na iOS a android.view.View na Androidu, což zajišťuje nativní výkon a přístupnost.
Hlavní body
View je základní komponenta React Native, která slouží jako kontejner pro ostatní komponenty. Podporuje stylování přes StyleSheet, rozvržení přes Flexbox, zpracování dotyků, animace a transformace. View je abstrakcí nad nativními kontejnerovými prvky: UIView na iOS a android.view.View na Androidu.
V React Native nelze používat HTML prvky — místo nich jsou všechna rozvržení postavena z View. Dokonce i Text a Image jsou obvykle zabaleny do View pro pozicování. Komponenta může být prázdná (jen kontejner) nebo obsahovat libovolný počet podřízených prvků v libovolné hloubce.
View podporuje renderování na obě platformy z jednoho JavaScript kódu. Vlastnosti Flexbox, okraje, pozadí, stíny a ohraničení fungují stejně na iOS i Androidu. Platformní rozdíly jsou minimální — například stíny na iOS používají shadowColor/shadowOffset, a na Androidu elevation.
Podle React Native Layout Docs, 2024 je View optimalizován pro mobilní zařízení: nevytváří zbytečné nativní reprezentace při optimalizaci flatten a správně zpracovává kaskádovou aktualizaci při změně stylů rodiče.
Komponenta View má bohatou sadu props pro správu vzhledu, umístění a interaktivity. Všechny props se dělí do několika kategorií: stylovací, dotykové události, přístupnost a platformní vlastnosti. Podívejme se na klíčové skupiny.
View podporuje všechny standardní CSS vlastnosti pro mobilní platformy. Klíčové z nich: flexDirection, justifyContent, alignItems pro pozicování; margin, padding pro okraje; backgroundColor, borderRadius pro vzhled; width, height, maxHeight pro rozměry.
View může zpracovávat dotykové události přes props onStartShouldSetResponder, onMoveShouldSetResponder a onResponderGrant. Tyto události umožňují implementovat vlastní gesta bez knihoven. Pro standardní kliknutí se používají onTouchStart, onTouchEnd a onPress (přes Pressable nebo TouchableOpacity).
Na iOS jsou k dispozici shadowColor, shadowOffset, shadowOpacity, shadowRadius pro stíny. Na Androidu jsou tyto vlastnosti ignorovány — místo nich se používá elevation. Callbacky onLayout jsou volány při změně rozměrů View, což je užitečné pro adaptivní rozvržení.
Flexbox je jediný mechanismus rozvržení v React Native (na rozdíl od Webu, kde jsou k dispozici Grid a Float). Veškeré pozicování prvků probíhá přes Flexbox vlastnosti komponenty View. Ve výchozím nastavení je flexDirection u View nastaven na column, nikoli row jako na Webu, což odpovídá vertikální orientaci mobilních obrazovek.
flexDirection určuje směr hlavní osy: column (výchozí) nebo row. justifyContent spravuje rozložení podél hlavní osy (flex-start, center, space-between). alignItems — podél příčné osy (stretch — výchozí hodnota). flex určuje podíl dostupného prostoru pro podřízený prvek.
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>
);
Příklad ukazuje typickou strukturu: vnější View — karta, vnitřní row — řádek s avatarem a textovým blokem, content — sloupec s jménem a rolí. Taková vnořená struktura View je standardem pro každou obrazovku React Native.
Ačkoli je View koncepčně podobný HTML div, existují mezi nimi klíčové rozdíly, které je důležité pochopit při přenosu kódu z Webu na React Native. Tyto rozdíly se týkají renderování, stylů a výchozího chování.
| Vlastnost | View (React Native) | div (HTML) |
|---|---|---|
| Výchozí flexDirection | column | row (v kontextu block) |
| width/height | Výchozí 100 % z rodiče | auto podle obsahu |
| Posouvání | Nepodporováno (je třeba ScrollView) | overflow: auto/scroll |
| Stíny | iOS: shadow*, Android: elevation | box-shadow |
| Zpracování událostí | Systém Responder | UDálosti DOM |
| Nativní renderování | UIView / android.view.View | Prvek DOM |
Nejdůležitější rozdíl — výchozí flexDirection: column. To znamená, že bez explicitního nastavení jsou podřízené prvky umístěny vertikálně, nikoli horizontálně. Druhý rozdíl: width a height View se ve výchozím nastavení roztahují na veškerý dostupný prostor rodiče (analogicky k width: 100 % v CSS).
Podívejme se na dva reálné příklady použití View v React Native aplikacích: centrování obsahu na celou obrazovku a vytvoření adaptivní mřížky z karet. Oba vzory se vyskytují v každém projektu.
Pro vytvoření prázdného stavu (empty state) se používá View s flex: 1 a centrováním na obou osách. Toto je standardní vzor pro obrazovky načítání, chyb a prázdných seznamů.
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 },
});
Kombinace justifyContent: center a alignItems: center ve View s flex: 1 centruje obsah na obou osách přes celou obrazovku. Toto je nejrozšířenější vzor použití View v React Native.
Pro zobrazení dvou sloupců produktů nebo článků se používá View s flexDirection: row, flexWrap: wrap a podřízenými View s pevnou šířkou. Tento vzor nahrazuje CSS Grid v 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 },
});
V tomto příkladu vnější View s flexWrap: wrap funguje jako obdoba CSS Grid. Každá karta zabírá 48 % šířky a ponechává mezery mezi sloupci. Toto je typický vzor pro katalogy a kanály obsahu.
Často kladené otázky
View má výchozí flexDirection: column (ne row jako v HTML), nepodporuje posouvání, width se ve výchozím nastavení roztahuje na 100 % rodiče a stíny se nastavují přes shadow* vlastnosti na iOS a elevation na Androidu.
Ano, View podporuje zpracování dotykových událostí přes onTouchStart, onTouchEnd a systém Responder. Pro tlačítka je však lepší použít TouchableOpacity, Pressable nebo Button — poskytují vizuální zpětnou vazbu a jsou v souladu s Accessibility API.
Ne nutně. React Native optimalizuje renderování pomocí View flattening — zbytečné View bez stylů a událostí jsou odstraněny z nativního stromu. Pro čitelnost kódu je však lepší používat View jako kontejner pro logické bloky rozhraní.
Nastavte borderRadius na polovinu šířky a výšky (např. width: 50, height: 50, borderRadius: 25). Pokud jsou šířka a výška stejné, takový View se stane kruhem. Pro avatary je to standardní vzor.
Nastavte opacity od 0 do 1 (např. opacity: 0.5). Můžete také použít backgroundColor s RGBA (backgroundColor: 'rgba(0,0,0,0.5)'). Rozdíl je v tom, že opacity se aplikuje na celý kontejner a jeho obsah, zatímco RGBA pouze na pozadí.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také