Компонента View у React Native је основни градивни блок корисничког интерфејса, пандан HTML елементу div за мобилне платформе. View подржава угњежђавање било које дубине, управља положајем доњих елемената путем Flexbox-а и обрађује догађаје додира. Према React Native Docs, 2024, View је најчешће коришћена компонента у апликацијама — практично сваки екран је изграђен од угњежђених View контејнера. Компонента се рендерује у изворни UIView на iOS и android.view.View на Android-у, што обезбеђује изворне перформансе и доступност.
Главно
View је темељна компонента React Native која служи као контејнер за друге компоненте. Подржава стилизовање кроз StyleSheet, распоред кроз Flexbox, обраду додира, анимације и трансформације. View је апстракција над изворним контејнерским елементима: UIView на iOS и android.view.View на Android-у.
У React Native није могуће користити HTML елементе — уместо њих сви распореди се граде од View. Чак су Text и Image обично умотани у View ради позиционирања. Компонента може бити празна (само контејнер) или садржати било који број доњих елемената било које дубине.
View подржава рендеровање на обе платформе из једног JavaScript кода. Flexbox особине, маргине, позадина, сенке и ивице раде исто на iOS и Android-у. Платформске разлике су минималне — на пример, сенке на iOS користе shadowColor/shadowOffset, а на Android-у — elevation.
Према React Native Layout Docs, 2024, View је оптимизован за мобилне уређаје: не ствара сувишне изворне приказе при flatten оптимизацији и коректно обрађује каскадно ажурирање при промени стилова родитеља.
Компонента View има богат скуп пропсова за управљање изгледом, положајем и интерактивношћу. Сви пропсови се деле у неколико категорија: стилски, догађаји додира, доступност и платформске карактеристике. Размотримо кључне групе.
View подржава сва стандардна CSS својства за мобилне платформе. Кључна од њих: flexDirection, justifyContent, alignItems за позиционирање; margin, padding за размаке; backgroundColor, borderRadius за изглед; width, height, maxHeight за величине.
View може да обрађује догађаје додира кроз пропсове onStartShouldSetResponder, onMoveShouldSetResponder и onResponderGrant. Ови догађаји омогућавају имплементацију прилагођених гестова без библиотека. За стандардне кликове користе се onTouchStart, onTouchEnd и onPress (путем Pressable или TouchableOpacity).
На iOS су доступни shadowColor, shadowOffset, shadowOpacity, shadowRadius за сенке. На Android-у се ова својства игноришу — уместо њих се користи elevation. Callback-ови onLayout се позивају при промени димензија View, што је корисно за адаптивне распореде.
Flexbox је једини механизам распореда у React Native (за разлику од Web-а где су доступни Grid и Float). Све позиционирање елемената врши се кроз Flexbox својства компоненте View. Подразумевано, View има flexDirection постављен на column, а не row као у Web-у, што одговара вертикалној оријентацији мобилних екрана.
flexDirection одређује правац главне осе: column (подразумевано) или row. justifyContent управља расподелом дуж главне осе (flex-start, center, space-between). alignItems — дуж попречне осе (stretch — подразумевана вредност). flex одређује удео доступног простора за доњи елемент.
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>
);
У примеру је приказана типична структура: спољашњи View — картица, унутрашњи row — ред са аватаром и текстуалним блоком, content — колона са именом и улогом. Оваква угњежђена структура View је стандард за сваки екран React Native.
Иако је View концептуално сличан HTML div-у, постоје кључне разлике између њих које је важно разумети при преношењу кода са Web-а на React Native. Ове разлике се тичу рендеровања, стилова и подразумеваног понашања.
| Карактеристика | View (React Native) | div (HTML) |
|---|---|---|
| Подразумевани flexDirection | column | row (у контексту block) |
| width/height | Подразумевано 100% од родитеља | auto по садржају |
| Скроловање | Није подржано (потребан ScrollView) | overflow: auto/scroll |
| Сенке | iOS: shadow*, Android: elevation | box-shadow |
| Обрада догађаја | Responder систем | DOM догађаји |
| Изворни рендер | UIView / android.view.View | DOM елемент |
Најважнија разлика — подразумевано flexDirection: column. То значи да без експлицитног подешавања доњи елементи бивају постављени вертикално, а не хоризонтално. Друга разлика: width и height View се подразумевано шире на сав доступан простор родитеља (аналогно width: 100% у CSS-у).
Размотримо два реална примера употребе View у React Native апликацијама: центрирање садржаја на цео екран и креирање адаптивне мреже картица. Оба обрасца се срећу у сваком пројекту.
За креирање празног стања (empty state) користи се View са flex: 1 и центрирањем по обе осе. Ово је стандардни образац за екране учитавања, грешака и празних листи.
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 },
});
Комбинација justifyContent: center и alignItems: center у View са flex: 1 центрира садржај по обе осе на цео екран. Ово је најраспрострањенији образац употребе View у React Native.
За приказ две колоне производа или чланака користи се View са flexDirection: row, flexWrap: wrap и доњим View-овима са фиксном ширином. Овај образац замењује CSS Grid у 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 },
});
У овом примеру спољашњи View са flexWrap: wrap ради као пандан CSS Grid-у. Свака картица заузима 48% ширине, остављајући размаке између колона. Ово је типичан образац за каталоге и токове садржаја.
Често постављана питања
View има подразумевано flexDirection: column (не row као у HTML-у), не подржава скроловање, width се подразумевано шири на 100% родитеља, а сенке се задају кроз shadow* својства на iOS и elevation на Android-у.
Да, View подржава обраду догађаја додира кроз onTouchStart, onTouchEnd и Responder систем. Међутим, за дугмад је боље користити TouchableOpacity, Pressable или Button — они пружају визуелну повратну информацију и у складу су са Accessibility API.
Не обавезно. React Native оптимизује рендеровање кроз View flattening — сувишни View-ови без стилова и догађаја се уклањају из изворног стабла. Ипак, за читљивост кода боље је користити View као контејнере за логичке блокове интерфејса.
Подесите borderRadius једнак половини ширине и висине (нпр. width: 50, height: 50, borderRadius: 25). Ако су ширина и висина исте, такав View постаје круг. За аватаре је ово стандардни образац.
Подесите opacity од 0 до 1 (нпр. opacity: 0.5). Такође можете користити backgroundColor са RGBA (backgroundColor: 'rgba(0,0,0,0.5)'). Разлика је у томе што се opacity примењује на цео контејнер и његов садржај, а RGBA — само на позадину.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође