A View komponens React Native-ban a felhasználói felület alapvető építőeleme, a HTML div elem megfelelője mobil platformokon. A View támogatja a tetszőleges mélységű beágyazást, kezeli a gyermekelemek elhelyezését Flexbox segítségével és feldolgozza az érintéses eseményeket. A React Native Docs, 2024 szerint a View a leggyakrabban használt komponens az alkalmazásokban — gyakorlatilag minden képernyő beágyazott View konténerekből épül fel. A komponens natív UIView-ként renderelődik iOS-en és android.view.View-ként Androidon, ami natív teljesítményt és akadálymentességet biztosít.
Főbb pontok
View a React Native alapvető komponense, amely konténerként szolgál más komponensek számára. Támogatja a stílusozást StyleSheet-en keresztül, az elrendezést Flexbox segítségével, az érintéskezelést, az animációkat és a transzformációkat. A View absztrakció a natív konténerelemek felett: UIView iOS-en és android.view.View Androidon.
A React Native-ban nem használhatók HTML elemek — helyettük az összes elrendezés View-ból épül fel. Még a Text és Image is általában View-ba van csomagolva a pozicionáláshoz. A komponens lehet üres (csak konténer) vagy tetszőleges számú gyermekelemből állhat bármilyen mélységben.
A View támogatja a renderelést mindkét platformon ugyanabból a JavaScript kódból. A Flexbox tulajdonságok, margók, háttér, árnyékok és szegélyek ugyanúgy működnek iOS-en és Androidon. A platform különbségek minimálisak — például az árnyékok iOS-en shadowColor/shadowOffset-t használnak, Androidon pedig elevation-t.
A React Native Layout Docs, 2024 szerint a View optimalizált mobil eszközökre: nem hoz létre felesleges natív megjelenítéseket a flatten optimalizáláskor és helyesen kezeli a kaszkád frissítést a szülő stílusainak változásakor.
A View komponens gazdag props készlettel rendelkezik a megjelenés, elhelyezés és interaktivitás kezeléséhez. Az összes props több kategóriára oszlik: stílus, érintéses események, akadálymentesség és platformjellemzők. Nézzük meg a fő csoportokat.
A View támogatja az összes szabványos CSS tulajdonságot mobil platformokhoz. A legfontosabbak: flexDirection, justifyContent, alignItems a pozicionáláshoz; margin, padding a távolságokhoz; backgroundColor, borderRadius a megjelenéshez; width, height, maxHeight a méretekhez.
A View képes érintéses események feldolgozására az onStartShouldSetResponder, onMoveShouldSetResponder és onResponderGrant props-okon keresztül. Ezek az események lehetővé teszik egyedi gesztusok implementálását könyvtárak nélkül. A szabványos kattintásokhoz onTouchStart, onTouchEnd és onPress (Pressable vagy TouchableOpacity segítségével) használható.
iOS-en elérhetők a shadowColor, shadowOffset, shadowOpacity, shadowRadius árnyékokhoz. Androidon ezek a tulajdonságok figyelmen kívül maradnak — helyettük elevation használandó. Az onLayout callback-ek a View méretváltozásakor hívódnak meg, ami hasznos az adaptív elrendezésekhez.
Flexbox az egyetlen elrendezési mechanizmus React Native-ban (ellentétben a Web-el, ahol Grid és Float is elérhető). Az elemek összes pozicionálása a View komponens Flexbox tulajdonságain keresztül történik. Alapértelmezésben a View flexDirection értéke column-ra van állítva, nem row-ra mint a Web-en, ami megfelel a mobil képernyők függőleges tájolásának.
flexDirection meghatározza a főtengely irányát: column (alapértelmezett) vagy row. justifyContent kezeli az elosztást a főtengely mentén (flex-start, center, space-between). alignItems — a keresztirányú tengely mentén (stretch — alapértelmezett érték). A flex meghatározza a gyermekelem számára elérhető hely arányát.
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>
);
A példa egy tipikus struktúrát mutat: külső View — kártya, belső row — sor avatárral és szöveges blokkal, content — oszlop névvel és szerepkörrel. Ez a beágyazott View struktúra a szabvány minden React Native képernyőn.
Bár a View koncepcionálisan hasonlít a HTML div-hez, vannak közöttük fontos különbségek, amelyeket érdemes megérteni a kód Web-ről React Native-ba történő átvitelénél. Ezek a különbségek a renderelést, a stílusokat és az alapértelmezett viselkedést érintik.
| Jellemző | View (React Native) | div (HTML) |
|---|---|---|
| Alapértelmezett flexDirection | column | row (block kontextusban) |
| width/height | Alapértelmezetten a szülő 100%-a | auto a tartalom alapján |
| Görgetés | Nem támogatott (ScrollView szükséges) | overflow: auto/scroll |
| Árnyékok | iOS: shadow*, Android: elevation | box-shadow |
| Eseménykezelés | Responder rendszer | DOM események |
| Natív renderelés | UIView / android.view.View | DOM elem |
A legfontosabb különbség — alapértelmezett flexDirection: column. Ez azt jelenti, hogy explicit beállítás nélkül a gyermekelemek függőlegesen helyezkednek el, nem vízszintesen. A második különbség: a View width és height alapértelmezetten a szülő teljes rendelkezésre álló helyére nyújlik (analóg a CSS width: 100%-val).
Nézzünk két valós példát a View használatára React Native alkalmazásokban: tartalom középre igazítása a teljes képernyőre és adaptív kártyarács létrehozása. Mindkét minta megtalálható minden projektben.
Üres állapot (empty state) létrehozásához flex: 1 és mindkét tengelyen történő középre igazítás használatos View-val. Ez a szabványos minta a betöltő, hibajelző és üres lista képernyőkhöz.
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 },
});
A justifyContent: center és alignItems: center kombinációja egy flex: 1 View-ban középre igazítja a tartalmat mindkét tengelyen a teljes képernyőn. Ez a leggyakoribb View használati minta React Native-ban.
Két oszlopos termékek vagy cikkek megjelenítéséhez flexDirection: row, flexWrap: wrap és fix szélességű gyermek View-k használatosak. Ez a minta helyettesíti a CSS Grid-et React Native-ban.
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 },
});
Ebben a példában a külső View flexWrap: wrap beállítással a CSS Grid megfelelőjeként működik. Minden kártya a szélesség 48%-át foglalja el, hézagokat hagyva az oszlopok között. Ez tipikus minta a katalógusok és tartalomcsatornák számára.
Gyakran ismételt kérdések
A View alapértelmezett flexDirection: column (nem row mint a HTML-ben), nem támogatja a görgetést, a width alapértelmezetten a szülő 100%-ra nyújlik, az árnyékok pedig shadow* tulajdonságokkal iOS-en és elevation-nel Androidon állíthatók be.
Igen, a View támogatja az érintéses események feldolgozását onTouchStart, onTouchEnd és a Responder rendszeren keresztül. A gombokhoz azonban érdemesebb TouchableOpacity, Pressable vagy Button használata — ezek vizuális visszajelzést adnak és megfelelnek az Accessibility API-nak.
Nem feltétlenül. A React Native optimalizálja a renderelést View flattening segítségével — a felesleges View-k stílusok és események nélkül eltávolításra kerülnek a natív fából. A kód olvashatósága érdekében azonban érdemes View-t használni konténerként a felület logikai blokkjaihoz.
Állítsa a borderRadius-t a szélesség és magasság felére (például width: 50, height: 50, borderRadius: 25). Ha a szélesség és magasség megegyezik, az ilyen View körré válik. Az avatárokhoz ez a szabványos minta.
Állítsa be az opacity-t 0 és 1 között (például opacity: 0.5). Használhat backgroundColor-t RGBA-val is (backgroundColor: 'rgba(0,0,0,0.5)'). A különbség, hogy az opacity a teljes konténerre és tartalmára vonatkozik, míg az RGBA csak a háttérre.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is