декабря 21, 2025
13 мин. чтения

Junior React Native разработчик: вопросы и ответы для собеседования

interview
career-advice
job-search
entry-level
Junior React Native разработчик: вопросы и ответы для собеседования
Milad Bonakdar

Milad Bonakdar

Автор

Практикуйте вопросы для Junior React Native: компоненты, хуки, навигация, API-запросы, списки, AsyncStorage и мобильные основы.


Введение

На собеседовании Junior React Native обычно проверяют, умеете ли вы создавать простые мобильные экраны на React, объяснять нативный рендеринг, управлять состоянием с помощью хуков, переходить между экранами, получать данные из API и хранить локальные не чувствительные данные. Сильный ответ должен быть практичным: что вы используете, когда этого избегаете и какой компромисс есть на iOS и Android.

Используйте это руководство, чтобы отработать вопросы, которые чаще всего встречаются на первой роли React Native. Сфокусируйтесь на основах React, ключевых компонентах, навигации, формах, списках, API-запросах, хранении данных и мобильной отладке, а не на заучивании деталей библиотек.


Основы React (6 вопросов)

1. Что такое React Native и чем он отличается от React?

Ответ:

  • React: JavaScript-библиотека для создания веб-интерфейсов
  • React Native: Фреймворк для создания нативных мобильных приложений с использованием React
  • Ключевые отличия:
    • React Native рендерит в нативные компоненты (не в DOM)
    • Использует нативные API вместо веб-API
    • Другой подход к стилизации (нет CSS, используется StyleSheet)
    • Платформо-специфичный код для iOS и Android
// React (Web)
import React from 'react';

function App() {
  return <div className="container">Hello Web</div>;
}

// React Native (Mobile)
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';

function App() {
  return (
    <View style={styles.container}>
      <Text>Hello Mobile</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
});

Распространенность: Очень часто Сложность: Легко


2. Какие основные компоненты есть в React Native?

Ответ: React Native предоставляет встроенные компоненты, которые соответствуют нативным элементам UI:

  • View: Компонент-контейнер (как div в вебе)
  • Text: Отображение текста (весь текст должен быть в компоненте Text)
  • Image: Отображение изображений
  • ScrollView: Контейнер с возможностью прокрутки
  • TextInput: Поле ввода текста
  • TouchableOpacity/Pressable: Элементы, на которые можно нажать
  • FlatList: Эффективный рендеринг списков
  • Button: Базовый компонент кнопки
import {
  View,
  Text,
  Image,
  TextInput,
  TouchableOpacity,
  StyleSheet,
} from 'react-native';

function MyComponent() {
  return (
    <View style={styles.container}>
      <Text style={styles.title}>Welcome</Text>
      <Image source={{ uri: 'https://example.com/image.jpg' }} style={styles.image} />
      <TextInput placeholder="Enter name" style={styles.input} />
      <TouchableOpacity style={styles.button} onPress={() => console.log('Pressed')}>
        <Text style={styles.buttonText}>Click Me</Text>
      </TouchableOpacity>
    </View>
  );
}

Распространенность: Очень часто Сложность: Легко


3. Объясните разницу между View и ScrollView.

Ответ:

  • View: Статический контейнер. Контент за пределами экрана не прокручивается.
  • ScrollView: Контейнер с возможностью прокрутки. Рендерит все дочерние элементы сразу (может быть ресурсоемким для больших списков).
  • Когда использовать:
    • View: Для макетов, которые помещаются на экране
    • ScrollView: Для небольшого количества прокручиваемого контента
    • FlatList: Для больших списков (рендерит только видимые элементы)
// View - не прокручивается
<View style={{ height: 200 }}>
  <Text>Content 1</Text>
  <Text>Content 2</Text>
  {/* Если контент превышает 200px, он будет обрезан */}
</View>

// ScrollView - прокручивается
<ScrollView style={{ height: 200 }}>
  <Text>Content 1</Text>
  <Text>Content 2</Text>
  <Text>Content 3</Text>
  {/* Можно прокрутить, чтобы увидеть весь контент */}
</ScrollView>

// FlatList - эффективен для больших списков
<FlatList
  data={items}
  renderItem={({ item }) => <Text>{item.name}</Text>}
  keyExtractor={item => item.id}
/>

Распространенность: Очень часто Сложность: Легко


4. Что такое React Hooks и какие из них наиболее часто используются?

Ответ: Хуки - это функции, которые позволяют использовать состояние и функции жизненного цикла в функциональных компонентах.

  • Распространенные хуки:
    • useState: Управление состоянием компонента
    • useEffect: Обработка побочных эффектов (загрузка данных, подписки)
    • useContext: Доступ к значениям контекста
    • useCallback: Мемоизация функций
    • useMemo: Мемоизация дорогостоящих вычислений
    • useRef: Ссылка на элементы DOM или сохранение значений
import React, { useState, useEffect } from 'react';
import { View, Text, Button } from 'react-native';

function Counter() {
  const [count, setCount] = useState(0);
  
  useEffect(() => {
    console.log(`Count changed to: ${count}`);
    
    // Функция очистки
    return () => {
      console.log('Cleanup');
    };
  }, [count]); // Запускается при изменении count
  
  return (
    <View>
      <Text>Count: {count}</Text>
      <Button title="Increment" onPress={() => setCount(count + 1)} />
    </View>
  );
}

Распространенность: Очень часто Сложность: Легко


5. Объясните хук useEffect и его массив зависимостей.

Ответ: useEffect запускает побочные эффекты после рендеринга. Массив зависимостей контролирует, когда он запускается:

  • Нет массива: Запускается после каждого рендеринга
  • Пустой массив []: Запускается один раз после первоначального рендеринга
  • С зависимостями [dep1, dep2]: Запускается при изменении зависимостей
import { useEffect, useState } from 'react';

function UserProfile({ userId }) {
  const [user, setUser] = useState(null);
  
  // Запускается один раз при монтировании
  useEffect(() => {
    console.log('Component mounted');
  }, []);
  
  // Запускается при изменении userId
  useEffect(() => {
    fetchUser(userId).then(data => setUser(data));
  }, [userId]);
  
  // Запускается после каждого рендеринга (избегайте этого)
  useEffect(() => {
    console.log('Rendered');
  });
  
  // Функция очистки
  useEffect(() => {
    const subscription = subscribeToUpdates();
    
    return () => {
      subscription.unsubscribe(); // Очистка при размонтировании
    };
  }, []);
  
  return <Text>{user?.name}</Text>;
}

Распространенность: Очень часто Сложность: Средне


6. Что такое Virtual DOM и как React его использует?

Ответ: Virtual DOM — это концепция React для веб-разработки: React хранит легковесное дерево интерфейса, сравнивает его после изменений состояния и обновляет только то, что изменилось. В React Native применяется та же идея reconciliation, но итоговый результат — нативные views, а не узлы DOM браузера.

  • Что сказать на собеседовании:
    1. Изменения состояния запускают повторный рендер затронутых компонентов
    2. React сравнивает новое дерево компонентов с предыдущим
    3. React Native применяет нужные обновления к нативным UI-компонентам
    4. Оптимизация всё еще включает стабильные key, правильное размещение state и мемоизацию только там, где она решает реальную проблему лишних ререндеров
  • Важное уточнение: React Native не обновляет HTML или DOM браузера.

Распространенность: Часто Сложность: Легко


Компоненты и Props (4 вопроса)

7. В чем разница между Props и State?

Ответ:

  • Props:
    • Передаются от родителя к ребенку
    • Только для чтения (неизменяемые)
    • Используются для конфигурации компонента
  • State:
    • Управляется внутри компонента
    • Изменяемый (можно изменить)
    • Используется для динамических данных
// Родительский компонент
function ParentComponent() {
  const [count, setCount] = useState(0);
  
  return (
    <ChildComponent 
      title="Counter"  // Props
      count={count}    // Props
      onIncrement={() => setCount(count + 1)}  // Props
    />
  );
}

// Дочерний компонент
function ChildComponent({ title, count, onIncrement }) {
  // Нельзя изменять props
  // title = "New Title"; // Ошибка!
  
  return (
    <View>
      <Text>{title}</Text>
      <Text>Count: {count}</Text>
      <Button title="Increment" onPress={onIncrement} />
    </View>
  );
}

Распространенность: Очень часто Сложность: Легко


8. Что такое функциональные компоненты и классовые компоненты?

Ответ:

  • Функциональные компоненты:
    • Более простой синтаксис
    • Используют хуки для состояния и жизненного цикла
    • Предпочтительны в современном React
  • Классовые компоненты:
    • Более старый подход
    • Используют this.state и методы жизненного цикла
    • Все еще поддерживаются, но менее распространены
// Функциональный компонент (современный)
function Welcome({ name }) {
  const [count, setCount] = useState(0);
  
  useEffect(() => {
    console.log('Mounted');
  }, []);
  
  return <Text>Hello, {name}</Text>;
}

// Классовый компонент (устаревший)
class Welcome extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }
  
  componentDidMount() {
    console.log('Mounted');
  }
  
  render() {
    return <Text>Hello, {this.props.name}</Text>;
  }
}

Распространенность: Часто Сложность: Легко


9. Как передать данные из дочернего компонента в родительский?

Ответ: Используйте функции обратного вызова, переданные в качестве props.

// Родительский компонент
function ParentComponent() {
  const [message, setMessage] = useState('');
  
  const handleMessageFromChild = (msg) => {
    setMessage(msg);
  };
  
  return (
    <View>
      <Text>Message from child: {message}</Text>
      <ChildComponent onSendMessage={handleMessageFromChild} />
    </View>
  );
}

// Дочерний компонент
function ChildComponent({ onSendMessage }) {
  const [input, setInput] = useState('');
  
  const sendMessage = () => {
    onSendMessage(input); // Вызов функции родителя
  };
  
  return (
    <View>
      <TextInput value={input} onChangeText={setInput} />
      <Button title="Send to Parent" onPress={sendMessage} />
    </View>
  );
}

Распространенность: Очень часто Сложность: Легко


10. Что такое prop key и почему он важен?

Ответ: Prop key помогает React определить, какие элементы изменились, были добавлены или удалены в списках.

  • Цель: Оптимизация производительности рендеринга
  • Требования: Должен быть уникальным среди соседей, стабильным (не используйте индекс, если список может измениться)
// Хорошо - использование уникального ID
function UserList({ users }) {
  return (
    <FlatList
      data={users}
      keyExtractor={item => item.id} // Уникальный ключ
      renderItem={({ item }) => <Text>{item.name}</Text>}
    />
  );
}

// Плохо - использование индекса (избегайте, если список может измениться)
function BadList({ items }) {
  return (
    <View>
      {items.map((item, index) => (
        <Text key={index}>{item}</Text> // Не используйте индекс
      ))}
    </View>
  );
}

// Хорошо - использование уникального свойства
function GoodList({ items }) {
  return (
    <View>
      {items.map(item => (
        <Text key={item.id}>{item.name}</Text>
      ))}
    </View>
  );
}

Распространенность: Очень часто Сложность: Легко


Стилизация и Layout (3 вопроса)

11. Как стилизовать компоненты в React Native?

Ответ: React Native использует объекты JavaScript для стилизации, а не CSS.

  • StyleSheet API: Создание оптимизированных стилей
  • Inline Styles: Прямые объекты стилей (менее производительно)
  • Flexbox: Система компоновки по умолчанию
import { View, Text, StyleSheet } from 'react-native';

function StyledComponent() {
  return (
    <View style={styles.container}>
      <Text style={styles.title}>Title</Text>
      <Text style={[styles.text, styles.bold]}>Multiple styles</Text>
      <Text style={{ color: 'red' }}>Inline style</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: 20,
    backgroundColor: '#fff',
  },
  title: {
    fontSize: 24,
    fontWeight: 'bold',
    color: '#333',
  },
  text: {
    fontSize: 16,
    color: '#666',
  },
  bold: {
    fontWeight: 'bold',
  },
});

Распространенность: Очень часто Сложность: Легко


12. Объясните Flexbox в React Native.

Ответ: Flexbox - это основная система компоновки в React Native.

  • Основные свойства:
    • flexDirection: row или column (по умолчанию: column)
    • justifyContent: Выравнивание по главной оси
    • alignItems: Выравнивание по поперечной оси
    • flex: Пропорциональное определение размеров
const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'row', // Горизонтальный макет
    justifyContent: 'space-between', // Равномерное распределение элементов
    alignItems: 'center', // Выравнивание по вертикали
  },
  box1: {
    flex: 1, // Занимает 1/3 пространства
    backgroundColor: 'red',
  },
  box2: {
    flex: 2, // Занимает 2/3 пространства
    backgroundColor: 'blue',
  },
});

function FlexExample() {
  return (
    <View style={styles.container}>
      <View style={styles.box1} />
      <View style={styles.box2} />
    </View>
  );
}

Распространенность: Очень часто Сложность: Средне


13. В чем разница между margin и padding?

Ответ:

  • Padding: Пространство внутри компонента (между контентом и границей)
  • Margin: Пространство снаружи компонента (между компонентом и соседями)
const styles = StyleSheet.create({
  box: {
    margin: 20,        // Пространство снаружи
    padding: 10,       // Пространство внутри
    backgroundColor: 'lightblue',
  },
  // Конкретные стороны
  specificBox: {
    marginTop: 10,
    marginBottom: 20,
    paddingLeft: 15,
    paddingRight: 15,
  },
  // Горизонтальное и вертикальное
  shorthand: {
    marginHorizontal: 20,  // слева и справа
    marginVertical: 10,    // сверху и снизу
    paddingHorizontal: 15,
    paddingVertical: 5,
  },
});

Распространенность: Часто Сложность: Легко


Навигация (3 вопроса)

14. Что такое React Navigation и как его использовать?

Ответ: React Navigation - самая популярная библиотека навигации для React Native.

  • Типы:
    • Stack Navigator: Стек экранов (push/pop)
    • Tab Navigator: Нижние вкладки
    • Drawer Navigator: Боковое меню
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';

const Stack = createNativeStackNavigator();

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home">
        <Stack.Screen name="Home" component={HomeScreen} />
        <Stack.Screen name="Details" component={DetailsScreen} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

function HomeScreen({ navigation }) {
  return (
    <View>
      <Text>Home Screen</Text>
      <Button
        title="Go to Details"
        onPress={() => navigation.navigate('Details', { itemId: 42 })}
      />
    </View>
  );
}

function DetailsScreen({ route, navigation }) {
  const { itemId } = route.params;
  
  return (
    <View>
      <Text>Details Screen</Text>
      <Text>Item ID: {itemId}</Text>
      <Button title="Go Back" onPress={() => navigation.goBack()} />
    </View>
  );
}

Распространенность: Очень часто Сложность: Средне


15. Как передать параметры между экранами?

Ответ: Используйте функцию navigate со вторым параметром для данных.

// Навигация с параметрами
function HomeScreen({ navigation }) {
  const user = { id: 1, name: 'John', email: '[email protected]' };
  
  return (
    <Button
      title="View Profile"
      onPress={() => navigation.navigate('Profile', { user })}
    />
  );
}

// Получение параметров
function ProfileScreen({ route }) {
  const { user } = route.params;
  
  return (
    <View>
      <Text>Name: {user.name}</Text>
      <Text>Email: {user.email}</Text>
    </View>
  );
}

// Обновление параметров
function EditScreen({ navigation }) {
  const updateUser = () => {
    navigation.setParams({ user: updatedUser });
  };
  
  return <Button title="Update" onPress={updateUser} />;
}

Распространенность: Очень часто Сложность: Легко


16. Что такое параметры навигации и как настроить заголовки?

Ответ: Параметры навигации контролируют внешний вид и поведение экрана.

function HomeScreen({ navigation }) {
  useEffect(() => {
    navigation.setOptions({
      title: 'My Home',
      headerStyle: {
        backgroundColor: '#f4511e',
      },
      headerTintColor: '#fff',
      headerTitleStyle: {
        fontWeight: 'bold',
      },
      headerRight: () => (
        <Button title="Info" onPress={() => alert('Info')} />
      ),
    });
  }, [navigation]);
  
  return <View><Text>Home</Text></View>;
}

// Или установить в навигаторе
<Stack.Screen
  name="Home"
  component={HomeScreen}
  options={{
    title: 'My Home',
    headerStyle: { backgroundColor: '#f4511e' },
    headerTintColor: '#fff',
  }}
/>

Распространенность: Часто Сложность: Легко


Данные и хранилище (4 вопроса)

17. Как получить данные из API в React Native?

Ответ: Используйте fetch API или библиотеки, такие как Axios.

import { useState, useEffect } from 'react';
import { View, Text, ActivityIndicator } from 'react-native';

function UserList() {
  const [users, setUsers] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  
  useEffect(() => {
    fetchUsers();
  }, []);
  
  const fetchUsers = async () => {
    try {
      const response = await fetch('https://api.example.com/users');
      
      if (!response.ok) {
        throw new Error('Network response was not ok');
      }
      
      const data = await response.json();
      setUsers(data);
    } catch (err) {
      setError(err.message);
    } finally {
      setLoading(false);
    }
  };
  
  if (loading) return <ActivityIndicator />;
  if (error) return <Text>Error: {error}</Text>;
  
  return (
    <FlatList
      data={users}
      renderItem={({ item }) => <Text>{item.name}</Text>}
      keyExtractor={item => item.id.toString()}
    />
  );
}

Распространенность: Очень часто Сложность: Средне


18. Что такое AsyncStorage и как его использовать?

Ответ: AsyncStorage — это асинхронное key-value хранилище для небольших не чувствительных данных.

  • Хорошие сценарии: Выбор темы, флаги онбординга, кэшированный JSON, простые настройки
  • Не используйте для: Auth-токенов, API-ключей, паролей, больших наборов данных и данных со сложными запросами
  • Для чувствительных данных: Используйте защищенное хранилище платформы, например iOS Keychain или зашифрованное хранилище Android через поддерживаемую библиотеку
import AsyncStorage from '@react-native-async-storage/async-storage';

const savePreference = async (theme) => {
  await AsyncStorage.setItem('theme', theme);
};

const loadPreference = async () => {
  return await AsyncStorage.getItem('theme');
};

Распространенность: Очень часто Сложность: Легко


19. В чем разница между FlatList и ScrollView?

Ответ:

  • ScrollView:
    • Рендерит все дочерние элементы сразу
    • Хорошо подходит для небольших списков
    • Ресурсоемкий для больших списков
  • FlatList:
    • Рендерит только видимые элементы (ленивая загрузка)
    • Эффективен для больших списков
    • Встроенные оптимизации
// ScrollView - рендерит все
<ScrollView>
  {items.map(item => (
    <View key={item.id}>
      <Text>{item.name}</Text>
    </View>
  ))}
</ScrollView>

// FlatList - рендерит только видимые элементы
<FlatList
  data={items}
  renderItem={({ item }) => (
    <View>
      <Text>{item.name}</Text>
    </View>
  )}
  keyExtractor={item => item.id}
  // Оптимизация производительности
  initialNumToRender={10}
  maxToRenderPerBatch={10}
  windowSize={5}
/>

Распространенность: Очень часто Сложность: Легко


20. Как обрабатывать формы и ввод пользователя?

Ответ: Используйте контролируемые компоненты с состоянием.

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

function LoginForm() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [errors, setErrors] = useState({});
  
  const validate = () => {
    const newErrors = {};
    
    if (!email) {
      newErrors.email = 'Email is required';
    } else if (!/\S+@\S+\.\S+/.test(email)) {
      newErrors.email = 'Email is invalid';
    }
    
    if (!password) {
      newErrors.password = 'Password is required';
    } else if (password.length < 6) {
      newErrors.password = 'Password must be at least 6 characters';
    }
    
    setErrors(newErrors);
    return Object.keys(newErrors).length === 0;
  };
  
  const handleSubmit = () => {
    if (validate()) {
      console.log('Form submitted:', { email, password });
      // Отправить в API
    }
  };
  
  return (
    <View>
      <TextInput
        placeholder="Email"
        value={email}
        onChangeText={setEmail}
        keyboardType="email-address"
        autoCapitalize="none"
      />
      {errors.email && <Text style={{ color: 'red' }}>{errors.email}</Text>}
      
      <TextInput
        placeholder="Password"
        value={password}
        onChangeText={setPassword}
        secureTextEntry
      />
      {errors.password && <Text style={{ color: 'red' }}>{errors.password}</Text>}
      
      <Button title="Login" onPress={handleSubmit} />
    </View>
  );
}

Распространенность: Очень часто Сложность: Средне

Newsletter subscription

Еженедельные советы по карьере, которые действительно работают

Получайте последние идеи прямо на вашу почту

Выделитесь перед рекрутерами и получите работу мечты

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

Начать создание

Поделиться этим постом

Сократите Время Написания Резюме на 90%

Средний соискатель тратит более 3 часов на форматирование резюме. Наш ИИ делает это менее чем за 15 минут, ускоряя переход к этапу подачи заявки в 12 раз.