User Image

Технологии

Понимание потоков в React Native: JavaScript, Shadow и Native Threads

By Dwinner ||

 5 минут ||

 30 Августа, 2024

React Native создан, чтобы обеспечить бесперебойную работу приложений, используя несколько потоков для управления различными аспектами приложения. Эти потоки работают вместе, чтобы управлять задачами, такими как рендеринг, вычисления макета и логика приложения. В этом посте мы разберём роли JavaScript-потока, Shadow-потока и Native-потока и объясним, как компонент React Native взаимодействует с каждым из них.


Обзор потоков в React Native


1. JavaScript-поток 💡

2. Shadow-поток 💡

3. Native-поток 💡


1. JavaScript-поток 💡


JavaScript-поток — это место, где происходит вся бизнес-логика, управление состоянием и обработка событий. Здесь выполняется код JavaScript, который определяет поведение вашего приложения и управляет взаимодействиями с пользовательским интерфейсом.

Роли и обязанности:

  • Жизненный цикл компонента: Обрабатывает рендеринг, обновления состояния и изменения пропсов.
  • Обработка событий: Обрабатывает взаимодействия пользователя, такие как клики, жесты и изменения ввода.
  • Логика приложения: Управляет потоком данных и бизнес-логикой приложения.


Пример:

import React, { useState } from 'react';
import { View, Button, Text } from 'react-native';

const Counter = () => {
  const [count, setCount] = useState(0);

  return (
    <View>
      <Text>Count: {count}</Text>
      <Button title="Increment" onPress={() => setCount(count + 1)} />
    </View>
  );
};

export default Counter;

Как это работает 🔍

JavaScript-поток запускает компонент Counter. Когда нажимается кнопка, обновление состояния (setCount) вызывает повторный рендеринг. Обновлённые состояния и пропсы обрабатываются JavaScript-потоком, который планирует вычисления макета.


2. Shadow-поток 💡

Shadow-поток отвечает за вычисление макета и стилей компонентов. Он работает за кулисами, вычисляя размеры и позиции элементов на основе предоставленных стилей и свойств макета.

Роли и обязанности:

  • Вычисление макета: Вычисляет положение и размер компонентов на основе стилей.
  • Обработка стилей: Применяет изменения стилей и вычисляет, как они влияют на макет.


Пример:

import React, { useState } from 'react';
import { View, Text, Button, StyleSheet } from 'react-native';

const DynamicLayout = () => {
  const [isExpanded, setIsExpanded] = useState(false);

  return (
    <View style={styles.container}>
      <View style={isExpanded ? styles.expandedBox : styles.box} />
      <Button title="Toggle Box" onPress={() => setIsExpanded(!isExpanded)} />
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  box: {
    width: 100,
    height: 100,
    backgroundColor: 'blue',
  },
  expandedBox: {
    width: 200,
    height: 200,
    backgroundColor: 'blue',
  },
});

export default DynamicLayout;

Как это работает 🔍

JavaScript-поток обновляет состояние компонента, вызывая изменение макета. Обновлённый макет и стили отправляются в Shadow-поток. Shadow-поток вычисляет новые размеры и позиции для box и expandedBox. Эта информация о макете отправляется в Native-поток для рендеринга.


3. Native-поток 💡


Native-поток обрабатывает фактический рендеринг элементов пользовательского интерфейса на экране. Он применяет вычисления макета и свойства стилей, вычисленные Shadow-потоком, для создания визуального представления приложения.

Роли и обязанности:

  • Рендеринг: Отображает UI-компоненты на экране на основе информации о макете, полученной от Shadow-потока.
  • Анимации: Обрабатывает анимации и другие графические изменения.


Пример

Native-поток не имеет прямых примеров кода, так как он занимается рендерингом конечного визуального вывода. Тем не менее, вот как он интегрируется с предыдущими примерами.


Как это работает 🔍

После того как Shadow-поток отправляет вычисления макета, Native-поток использует эту информацию для рендеринга компонентов на экране. Для компонента DynamicLayout, когда box переключается, Native-поток применяет новые размеры и обновляет UI, чтобы показать расширенное или сжатое состояние.


Объединение всего 🧩


Вот обзор того, как компонент React Native взаимодействует со всеми тремя потоками:

  1. JavaScript-поток
    • Управляет логикой компонента, состоянием и пропсами.
    • Реагирует на взаимодействия пользователя и обновляет состояние.
  2. Shadow-поток
    • Получает обновлённую информацию о макете и стилях.
    • Вычисляет размеры и позиции макета.
    • Отправляет вычисления макета в Native-поток.
  3. Native-поток
    • Получает информацию о макете от Shadow-потока.
    • Рендерит обновлённый UI на экране.
    • Обрабатывает анимации и визуальные обновления.

Пример потока

  • Первоначальный рендеринг: JavaScript-поток создаёт компонент с определёнными стилями.
  • Shadow-поток: Вычисляет макет на основе этих стилей.
  • Native-поток: Рендерит компонент с вычисленным макетом.

Когда состояние или пропсы меняются, поток повторяется с обновлёнными значениями, обеспечивая актуальность UI.


Заключение ✅


Понимание того, как JavaScript-, Shadow- и Native-потоки работают вместе, поможет вам оптимизировать производительность и создавать плавные, отзывчивые приложения на React Native. Используя сильные стороны каждого потока и эффективно управляя их взаимодействиями, вы можете обеспечить бесшовный пользовательский опыт.

Теги:

технологии

react-native

mobile


Избранный пост

User Image

🚀 Обзор React Native 0.74: Новая Архитектура без ...

React Native продолжает активно развиваться, и версия 0.74 принесла несколько значительных изменений, которые улучшают производительность и удобство работы с фреймворком. Одним из главных нововведений...

7 Февраля, 2025
10 минут

Недавний пост

User Image

Пошаговое руководство по настройке push-уведомлени...

1. Создание нового проекта React Native (если не создано ранее)

User Image

Понимание потоков в React Native: JavaScript, Shad...

React Native создан, чтобы обеспечить бесперебойную работу приложений,...

User Image

Улучшение производительности React Native с помощь...

React Native

User Image

🚀 Как настроить .env для приложения на React Nati...

Управление переменными окружения критически важно для настройки конфиг...

User Image

Новые возможности React 19

🔧 Компилятор React: Предстоящий компилятор React, уже используемый In...

User Image

Стоимость разработки мобильных приложений в 2024 г...

Цена разработки мобильного приложения может варьироваться в зависимост...

User Image

🚀 Обзор React Native 0.74: Новая Архитектура без ...

React Native продолжает активно развиваться, и версия 0.74 принесла не...