логотип PurpleSchool
логотип PurpleSchool

Работа с компонентом view в React Native

Автор

Олег Марков

Введение

В мобильной разработке на React Native компонент View — это основной строительный блок пользовательского интерфейса. Если вы уже работали с веб-технологиями, представьте View как аналог тега div в HTML. Почти все визуальные составляющие вашего приложения в React Native строятся с помощью View и компонентов, которые используют его внутри себя. Его универсальность позволяет не только структурировать компоненты, но и реализовывать гибкие макеты, управлять стилями, обрабатывать события и настраивать производительность вашего приложения.

В этой статье подробно разбирается, как работать с компонентом View, какие возможности он предоставляет и как сделать ваш интерфейс легким, отзывчивым и современным.

Основные возможности компонента View

Как подключить и использовать View

Чтобы начать использование View в вашем проекте React Native, его необходимо импортировать из основного пакета. Вот стандартный способ:

import React from 'react';
import { View } from 'react-native';

Базовое использование выглядит так:

<View>
  {/* Здесь ваши дочерние элементы */}
</View>

View может содержать другие компоненты, в том числе другие View, что позволяет строить целые иерархии и сложные интерфейсы.

Компонент View является одним из основных строительных блоков интерфейса в React Native. Правильное использование View позволяет создавать сложные и адаптивные макеты. Но чтобы в полной мере освоить работу с View, необходимо понимать принципы Flexbox, стилизации и оптимизации производительности. Если вы хотите детальнее погрузиться в особенности работы с компонентами и научиться создавать красивые и функциональные интерфейсы — приходите на наш большой курс React Native и Expo Router. На курсе 184 уроков и 11 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Свойства компонента View

Теперь посмотрим, какие свойства (props) можно использовать для настройки поведения View.

style

Чаще всего используют свойство style. Оно определяет внешний вид компонента, например размеры, отступы, фон и многое другое.

<View style={{
  backgroundColor: 'lightblue', // Цвет фона
  padding: 20, // Внутренний отступ со всех сторон
  borderRadius: 10 // Скругление углов
}}>
  {/* Вложенный контент */}
</View>

Свойство style может принимать либо объект, либо массив объектов, которые будут объединяться и применяться последовательно.

children

View может содержать другие компоненты или текст через свойство children:

<View>
  <Text>Привет, React Native!</Text>
  <Button title="Нажми меня" onPress={() => {}} />
</View>

pointerEvents

С помощью pointerEvents можно контролировать обработку событий касания:

  • auto: стандартное поведение, события касания обрабатываются этим View и его потомками.
  • none: View и дочерние компоненты не обрабатывают события касания.
  • box-only: только сам View реагирует на события, потомки — нет.
  • box-none: сам View не реагирует, потомки — да.
<View pointerEvents="none">
  {/* Ни этот View, ни его дети не получат события касания */}
</View>

accessibility и тестирование

Для обеспечения доступности и удобства тестирования View поддерживает такие свойства, как:

  • accessible: сообщает, должен ли элемент быть доступен для экранного диктора.
  • accessibilityLabel: задаёт специальную метку для вспомогательных технологий.
  • testID: идентификатор для поиска компонента в тестах.
<View accessible={true} accessibilityLabel="Основная панель">
  {/* ... */}
</View>

Создание макетов: Flexbox с View

React Native использует Flexbox для построения макетов. Благодаря этому можно гибко управлять пространством и расположением View на экране.

Пример горизонтального и вертикального размещения

<View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
  <View style={{ width: 50, height: 50, backgroundColor: 'red' }} />
  <View style={{ width: 50, height: 50, backgroundColor: 'green' }} />
  <View style={{ width: 50, height: 50, backgroundColor: 'blue' }} />
</View>

В этом примере:

  • flexDirection: 'row' — расположение дочерних View по горизонтали.
  • justifyContent: 'space-between' — максимальное распределение пространства между View.

Попробуйте поменять flexDirection на column — и элементы встанут друг под другом.

Свойство flex

flex управляет распределением пространства между дочерними View:

<View style={{ flex: 1 }}>
  {/* Этот View займет всё доступное пространство */}
</View>

Если внутри одного контейнера несколько View с разными flex (например, 1 и 2), то второй View займет в два раза больше пространства по выбранной оси.

Вложенность View

Комбинируя View внутри других View, можно строить сложные интерфейсы любых форм:

<View style={{ padding: 10 }}>
  <View style={{ backgroundColor: 'gray', padding: 5 }}>
    <Text>Первый блок</Text>
  </View>
  <View style={{ backgroundColor: 'orange', marginTop: 10, padding: 5 }}>
    <Text>Второй блок</Text>
  </View>
</View>

Обратите внимание, как с помощью отступов и вложенности можно разделять элементы и управлять их размещением.

Управление стилями: Inline, StyleSheet и композиция

Хотя стили можно указывать напрямую (inline), как показано выше, в большинстве проектов используют StyleSheet:

import { StyleSheet, View } from 'react-native';

const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: 20,
    backgroundColor: '#fff'
  },
  box: {
    height: 100,
    backgroundColor: '#cceeff',
    marginBottom: 15
  }
});

<View style={styles.container}>
  <View style={styles.box} />
</View>

Использование StyleSheet ускоряет приложение, уменьшает дублирование и облегчает сопровождаемость кода.

Если нужно объединить несколько стилей, используйте массив:

<View style={[styles.box, { backgroundColor: 'pink' }]} />
// Это перезапишет backgroundColor на 'pink'

Обработка событий: взаимодействие пользователя с View

View сам по себе не имеет событий onPress — для этого лучше использовать TouchableOpacity, Pressable или Button. Но View может участвовать в сложных логике, где, например, один View накладывается на другой и управляет их взаимодействием с помощью pointerEvents.

Если вы всё же хотите сделать View кликабельным, оберните его в TouchableOpacity или Pressable:

import { Pressable, View, Text } from 'react-native';

<Pressable onPress={() => alert('Нажали!')}>
  <View style={{ backgroundColor: 'yellow', padding: 15 }}>
    <Text>Кликни меня</Text>
  </View>
</Pressable>

Производительность и оптимизация View

Чем меньше вложенных и декоративных View — тем быстрее рисуется приложение. View — это, по сути, "чистый" контейнер, без лишних затрат, но иногда в проектах появляется слишком много вложенных слоев.

Подсказка: старайтесь минимизировать количество вложенных View, если структура может быть проще.

Также помогает:

  • Использовать FlatList или SectionList для списков вместо большого числа View
  • Выносить стили в StyleSheet для повторного использования и снижения нагрузки на рендер

Анимации для View

React Native поддерживает анимации для View, чаще всего через Animated API:

import React, { useRef } from 'react';
import { Animated, View, Button } from 'react-native';

const MyAnimatedView = () => {
  const fadeAnim = useRef(new Animated.Value(0)).current; // Начальная прозрачность

  const fadeIn = () => {
    Animated.timing(fadeAnim, {
      toValue: 1, // Конечная непрозрачность
      duration: 1000, // Продолжительность в мс
      useNativeDriver: true
    }).start();
  };

  return (
    <View>
      <Animated.View style={{ opacity: fadeAnim, width: 100, height: 100, backgroundColor: 'skyblue' }} />
      <Button title="Показать" onPress={fadeIn} />
    </View>
  );
};

В этом примере Animated.View "наследует" все возможности обычного View, но позволяет плавно менять стили.

Прозрачность и управление слоями

Для управления прозрачностью View воспользуйтесь свойством opacity:

<View style={{ opacity: 0.5 }}>
  <Text>Полупрозрачный текст</Text>
</View>

Чтобы элемент оказался поверх других, используйте zIndex:

<View style={{ position: 'absolute', zIndex: 2 }}>
  {/* Этот элемент будет выше по слою других элементов с меньшим zIndex */}
</View>

View как контейнер для Safe Area и Scroll

В реальных приложениях часто требуется защитить контент от "вырезов экрана" (например, камер или "чёлок" на телефоне), а также организовать прокрутку содержимого.

Использование SafeAreaView

Для учёта безопасных зон используйте SafeAreaView:

import { SafeAreaView } from 'react-native';

<SafeAreaView style={{ flex: 1 }}>
  <View>
    <Text>Контент не попадёт под системные элементы</Text>
  </View>
</SafeAreaView>

View внутри ScrollView

Для прокрутки большого контента:

import { ScrollView, View, Text } from 'react-native';

<ScrollView>
  <View style={{ padding: 20 }}>
    <Text>Первый абзац большого контента...</Text>
    {/* Еще много элементов... */}
  </View>
</ScrollView>

Еще совет: ScrollView всегда реализуется через View в качестве контейнера, так что грамотная комбинация этих компонентов критически важна.

View как разделитель и декоративный элемент

Иногда View используют не как контейнер, а как линию, фон, декоративный блок.

<View style={{
  height: 1,
  backgroundColor: '#ccc',
  marginVertical: 15
}} />
// Это простой горизонтальный разделитель

Дополнительные возможности: View для модальных окон, попапов и оверлеев

View часто применяют для наложенных поверх интерфейса элементов, например, модальных окон или всплывающих подсказок. Используйте абсолютное позиционирование:

<View style={{
  position: 'absolute',
  top: 0,
  left: 0,
  right: 0,
  bottom: 0,
  backgroundColor: 'rgba(0,0,0,0.6)',
  justifyContent: 'center',
  alignItems: 'center'
}}>
  <View style={{
    backgroundColor: 'white',
    padding: 30,
    borderRadius: 10
  }}>
    <Text>Это модальное окно</Text>
  </View>
</View>

Полупрозрачный фон View поверх экрана обеспечивает затемнение, а внутренний View — сами содержимое.

Заключение

Компонент View — фундаментальный элемент построения интерфейса в React Native. С его помощью можно создавать сложные структуры, гибко управлять стилями, контролировать взаимодействие пользователя, реализовывать анимации и строить современные мобильные интерфейсы. Понимание особенностей работы View помогает делать приложения быстрими, отзывчивыми и легко масштабируемыми. Главная сила View — в его универсальности и легкости интеграции с остальными компонентами React Native.

View – это только один из множества компонентов, используемых в React Native. Чтобы создавать сложные приложения, необходимо знать и другие компоненты, а также уметь их комбинировать и стилизовать. Курс React Native и Expo Router научит вас всему необходимому. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир React Native прямо сегодня.

Частозадаваемые технические вопросы по теме статьи и ответы на них

Почему View не обрабатывает нажатия напрямую? Как реализовать клик?

View не предоставляет обработчик событий onPress. Если вы хотите реагировать на клики, оберните View в компонент TouchableOpacity или Pressable и используйте их onPress:

<Pressable onPress={() => { /* ваш код */ }}>
  <View style={{ ... }}>
    {/* Контент */}
  </View>
</Pressable>

Как организовать абсолютное позиционирование нескольких View на экране?

Используйте стиль position absolute и задайте координаты top, bottom, left, right для каждого View. Для управления порядком наложения используйте zIndex:

<View style={{ position: 'absolute', top: 10, left: 10, zIndex: 2 }}>...</View>

Почему View "не видно" на экране (не отображается)?

Проверьте, указаны ли у View размеры (height, width или flex). Если размеры не заданы и View пустой, компонент не будет виден. Добавьте стили или контент.

Как сделать закругленные края только для определённых углов?

Используйте отдельные свойства например borderTopLeftRadius, borderBottomRightRadius и так далее:

<View style={{ borderTopLeftRadius: 20, borderBottomRightRadius: 10 }} />

Как ускорить рендеринг большого количества View в списках?

Используйте специализированные компоненты FlatList или SectionList. Они оптимизированы для виртуализации и эффективной отрисовки большого числа элементов.

<FlatList data={...} renderItem={({item}) => <View>{/* ... */}</View>} />
Работа с компонентом text в React NativeСтрелочка вправо

Постройте личный план изучения React-native до уровня Middle — бесплатно!

React-native — часть карты развития Mobile

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по React-native

Работа со ScrollView в React NativeРабота с видео в React NativeКак реализовать аудиоплеер на React NativeНастройка и использование input и textinput в React NativeИнтеграция видео плеера в приложение на React NativeИспользование выпадающих списков в React NativeСоздание и настройка native module на React NativeКак создать модальные окна в React NativeРабота с изображениями в React NativeОтображение списков данных в React NativeГайд по файловой системе в React NativeИнтеграция камеры в приложение на React NativeСоздание интерактивных кнопок в React Native
Как использовать векторные иконки в React Native5 популярных библиотек UI компонентов React NativeСоздание и использование tabs в React NativeРуководство по стилизации компонентов в React NativeОптимизация переходов между экранами в React NativeАдаптация safe area context на React NativeОбзор библиотек для навигации в React NativeСоздание сложных анимаций (reanimated) на React NativeИспользование библиотеки стилей Paper в React NativeРуководство по navigation в React NativeОптимизация отображения списков в React NativeКак реализовать linking на React NativeГайд по UI-китам для React NativeГде искать elements для приложения на React NativeРабота с цветами в React Native
Открыть базу знаний

Лучшие курсы по теме

изображение курса

React Native и Expo Router

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Основы JavaScript

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий