Компонент 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 (тень от карточного представления). Коллбэки onLayout вызываются при изменении размеров View, что полезно для адаптивных макетов.
Flexbox — единственный механизм верстки в React Native (в отличие от веба, где доступен Grid и Float). Все позиционирование элементов выполняется через Flexbox-свойства компонента View. По умолчанию у View flexDirection установлен в column, а не row как в вебе, что соответствует вертикальной ориентации мобильных экранов.
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, между ними есть ключевые различия, которые важно понимать при переносе кода с веба на React Native. Эти отличия касаются рендеринга, стилей и поведения по умолчанию.
| Характеристика | View (React Native) | div (HTML) |
|---|---|---|
| Базовый flexDirection | column | row (в контексте block) |
| width/height | По умолчанию 100% от родителя | auto по содержимому |
| Скроллинг | Не поддерживается (нужен ScrollView) | overflow: auto/scoll |
| Тени | iOS: shadow*, Android: elevation | box-shadow |
| Обработка событий | Responder system | DOM Events |
| Нативный рендеринг | 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 как у flex-контейнера в 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 года. Мы проконсультируем вас и предложим наилучшее решение.