Введение
React Native остаётся одной из самых популярных платформ для кросс-платформенной мобильной разработки. По данным Statista (2025), более 38% разработчиков используют React Native для создания приложений под iOS и Android. Однако даже опытные разработчики тратят до 30% времени на рутинные задачи: написание UI-компонентов, настройку навигации и интеграцию API. С появлением больших языковых моделей (LLM) эту работу можно ускорить в 2–3 раза с помощью правильно составленных промтов.
В этой статье я собрал 10 готовых к использованию промтов для React Native, которые покрывают три ключевые области: создание компонентов, настройку навигации и работу с API. Каждый промт сопровождается пояснением и примером использования. Вы можете копировать их напрямую в ChatGPT, Claude или Gemini — все промты протестированы на июль 2026 года.
1. Промт для создания базового UI-компонента с TypeScript
Для чего: Быстрая генерация переиспользуемого компонента с пропсами, типизацией и стилями.
Промт:
Создай React Native компонент на TypeScript для карточки товара (ProductCard). Компонент должен принимать пропсы: id (string), title (string), price (number), imageUrl (string), onPress (функция). Используй StyleSheet для стилей. Добавь обработку ошибки загрузки изображения (placeholder).
Пример использования:
import React, { useState } from 'react';
import { View, Text, Image, TouchableOpacity, StyleSheet } from 'react-native';
interface ProductCardProps {
id: string;
title: string;
price: number;
imageUrl: string;
onPress: (id: string) => void;
}
const ProductCard: React.FC<ProductCardProps> = ({ id, title, price, imageUrl, onPress }) => {
const [imageError, setImageError] = useState(false);
return (
<TouchableOpacity style={styles.card} onPress={() => onPress(id)}>
{imageError ? (
<View style={styles.placeholder}>
<Text style={styles.placeholderText}>Нет изображения</Text>
</View>
) : (
<Image
source={{ uri: imageUrl }}
style={styles.image}
onError={() => setImageError(true)}
/>
)}
<View style={styles.info}>
<Text style={styles.title}>{title}</Text>
<Text style={styles.price}>{price.toLocaleString()} ₽</Text>
</View>
</TouchableOpacity>
);
};
const styles = StyleSheet.create({
card: {
backgroundColor: '#fff',
borderRadius: 12,
padding: 12,
marginVertical: 8,
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 4,
elevation: 3,
},
image: {
width: '100%',
height: 150,
borderRadius: 8,
},
placeholder: {
width: '100%',
height: 150,
borderRadius: 8,
backgroundColor: '#e0e0e0',
justifyContent: 'center',
alignItems: 'center',
},
placeholderText: {
color: '#888',
},
info: {
marginTop: 8,
},
title: {
fontSize: 16,
fontWeight: '600',
},
price: {
fontSize: 14,
color: '#2e7d32',
marginTop: 4,
},
});
export default ProductCard;
2. Промт для создания кастомного хука для работы с API
Для чего: Генерация хука с обработкой состояний загрузки, ошибки и данных.
Промт:
Напиши кастомный хук useApi на React Native (TypeScript), который принимает URL и возвращает { data, loading, error }. Добавь возможность передавать опции запроса (method, headers, body). Используй fetch. Хук должен автоматически отменять запрос при размонтировании компонента.
Пример использования:
import { useState, useEffect, useRef } from 'react';
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';
interface UseApiOptions {
method?: HttpMethod;
headers?: Record<string, string>;
body?: unknown;
}
interface UseApiResult<T> {
data: T | null;
loading: boolean;
error: string | null;
}
export function useApi<T = unknown>(url: string, options?: UseApiOptions): UseApiResult<T> {
const [data, setData] = useState<T | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const abortControllerRef = useRef<AbortController | null>(null);
useEffect(() => {
const controller = new AbortController();
abortControllerRef.current = controller;
const fetchData = async () => {
setLoading(true);
setError(null);
try {
const response = await fetch(url, {
method: options?.method || 'GET',
headers: {
'Content-Type': 'application/json',
...options?.headers,
},
body: options?.body ? JSON.stringify(options.body) : undefined,
signal: controller.signal,
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
setData(result as T);
} catch (err) {
if (err instanceof Error && err.name !== 'AbortError') {
setError(err.message);
}
} finally {
setLoading(false);
}
};
fetchData();
return () => {
controller.abort();
};
}, [url]);
return { data, loading, error };
}
3. Промт для настройки навигации (React Navigation)
Для чего: Быстрая настройка Stack Navigator с экранами.
Промт:
Создай конфигурацию навигации для React Native приложения с использованием @react-navigation/native и @react-navigation/stack. Добавь три экрана: Home, Profile, Settings. HomeScreen должен принимать параметр userId. Используй TypeScript для типизации параметров.
Пример использования:
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import { HomeScreen } from './screens/HomeScreen';
import { ProfileScreen } from './screens/ProfileScreen';
import { SettingsScreen } from './screens/SettingsScreen';
export type RootStackParamList = {
Home: { userId: string };
Profile: undefined;
Settings: undefined;
};
const Stack = createStackNavigator<RootStackParamList>();
const AppNavigator: React.FC = () => {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen
name="Home"
component={HomeScreen}
initialParams={{ userId: 'default' }}
options={{ title: 'Главная' }}
/>
<Stack.Screen name="Profile" component={ProfileScreen} options={{ title: 'Профиль' }} />
<Stack.Screen name="Settings" component={SettingsScreen} options={{ title: 'Настройки' }} />
</Stack.Navigator>
</NavigationContainer>
);
};
export default AppNavigator;
4. Промт для создания формы с валидацией
Для чего: Генерация формы с полями, валидацией и обработкой отправки.
Промт:
Создай React Native компонент формы регистрации с полями: email, password, confirmPassword. Добавь валидацию: email — корректный формат, password — минимум 8 символов, confirmPassword должен совпадать с password. Используй useState для управления состоянием. Покажи ошибки под каждым полем.
Пример использования:
import React, { useState } from 'react';
import { View, Text, TextInput, TouchableOpacity, StyleSheet } from 'react-native';
const RegistrationForm: React.FC = () => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [confirmPassword, setConfirmPassword] = useState('');
const [errors, setErrors] = useState<Record<string, string>>({});
const validate = (): boolean => {
const newErrors: Record<string, string> = {};
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) newErrors.email = 'Некорректный email';
if (password.length < 8) newErrors.password = 'Пароль должен быть минимум 8 символов';
if (password !== confirmPassword) newErrors.confirmPassword = 'Пароли не совпадают';
setErrors(newErrors);
return Object.keys(newErrors).length === 0;
};
const handleSubmit = () => {
if (validate()) {
// Отправка данных
console.log({ email, password });
}
};
return (
<View style={styles.container}>
<Text style={styles.label}>Email</Text>
<TextInput
style={styles.input}
value={email}
onChangeText={setEmail}
keyboardType="email-address"
autoCapitalize="none"
/>
{errors.email && <Text style={styles.error}>{errors.email}</Text>}
<Text style={styles.label}>Пароль</Text>
<TextInput
style={styles.input}
value={password}
onChangeText={setPassword}
secureTextEntry
/>
{errors.password && <Text style={styles.error}>{errors.password}</Text>}
<Text style={styles.label}>Подтвердите пароль</Text>
<TextInput
style={styles.input}
value={confirmPassword}
onChangeText={setConfirmPassword}
secureTextEntry
/>
{errors.confirmPassword && <Text style={styles.error}>{errors.confirmPassword}</Text>}
<TouchableOpacity style={styles.button} onPress={handleSubmit}>
<Text style={styles.buttonText}>Зарегистрироваться</Text>
</TouchableOpacity>
</View>
);
};
const styles = StyleSheet.create({
container: { padding: 20 },
label: { fontSize: 16, marginBottom: 4, color: '#333' },
input: {
borderWidth: 1,
borderColor: '#ccc',
borderRadius: 8,
padding: 12,
marginBottom: 8,
fontSize: 16,
},
error: { color: 'red', fontSize: 12, marginBottom: 12 },
button: {
backgroundColor: '#007AFF',
padding: 14,
borderRadius: 8,
alignItems: 'center',
marginTop: 16,
},
buttonText: { color: '#fff', fontSize: 16, fontWeight: '600' },
});
export default RegistrationForm;
5. Промт для FlatList с бесконечной прокруткой
Для чего: Генерация списка с подгрузкой данных при скролле.
Промт:
Создай React Native компонент с FlatList, который загружает данные из API с пагинацией (page и limit). Реализуй onEndReached для подгрузки следующей страницы. Добавь индикатор загрузки внизу списка. Используй TypeScript.
Пример использования:
import React, { useState, useEffect, useCallback } from 'react';
import { FlatList, View, Text, ActivityIndicator, StyleSheet } from 'react-native';
interface Item {
id: number;
title: string;
}
const PAGE_SIZE = 20;
const InfiniteList: React.FC = () => {
const [items, setItems] = useState<Item[]>([]);
const [page, setPage] = useState(1);
const [loading, setLoading] = useState(false);
const [hasMore, setHasMore] = useState(true);
const fetchItems = useCallback(async (pageNum: number) => {
setLoading(true);
try {
const response = await fetch(`https://api.example.com/items?page=${pageNum}&limit=${PAGE_SIZE}`);
const data: Item[] = await response.json();
setItems(prev => [...prev, ...data]);
if (data.length < PAGE_SIZE) setHasMore(false);
} catch (error) {
console.error(error);
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
fetchItems(1);
}, [fetchItems]);
const loadMore = () => {
if (!loading && hasMore) {
const nextPage = page + 1;
setPage(nextPage);
fetchItems(nextPage);
}
};
const renderItem = ({ item }: { item: Item }) => (
<View style={styles.item}>
<Text>{item.title}</Text>
</View>
);
const renderFooter = () => {
if (!loading) return null;
return <ActivityIndicator style={styles.loader} size="large" />;
};
return (
<FlatList
data={items}
renderItem={renderItem}
keyExtractor={item => item.id.toString()}
onEndReached={loadMore}
onEndReachedThreshold={0.5}
ListFooterComponent={renderFooter}
/>
);
};
const styles = StyleSheet.create({
item: { padding: 16, borderBottomWidth: 1, borderBottomColor: '#eee' },
loader: { paddingVertical: 20 },
});
export default InfiniteList;
6. Промт для работы с AsyncStorage
Для чего: Сохранение и чтение данных локально.
Промт:
Напиши утилиту для работы с AsyncStorage в React Native: функции setItem, getItem, removeItem с типизацией. Добавь обработку ошибок и JSON-сериализацию.
Пример использования:
import AsyncStorage from '@react-native-async-storage/async-storage';
export const storage = {
async set<T>(key: string, value: T): Promise<void> {
try {
const jsonValue = JSON.stringify(value);
await AsyncStorage.setItem(key, jsonValue);
} catch (e) {
console.error('Error saving data', e);
}
},
async get<T>(key: string): Promise<T | null> {
try {
const jsonValue = await AsyncStorage.getItem(key);
return jsonValue != null ? (JSON.parse(jsonValue) as T) : null;
} catch (e) {
console.error('Error reading data', e);
return null;
}
},
async remove(key: string): Promise<void> {
try {
await AsyncStorage.removeItem(key);
} catch (e) {
console.error('Error removing data', e);
}
},
};
7. Промт для кастомного модального окна
Для чего: Создание переиспользуемого модального компонента.
Промт:
Создай React Native компонент Modal с пропсами: visible (boolean), onClose (функция), title (string), children. Используй React Native Modal. Добавь анимацию появления и кнопку закрытия.
Пример использования:
import React from 'react';
import { Modal, View, Text, TouchableOpacity, StyleSheet, Animated } from 'react-native';
interface CustomModalProps {
visible: boolean;
onClose: () => void;
title: string;
children: React.ReactNode;
}
const CustomModal: React.FC<CustomModalProps> = ({ visible, onClose, title, children }) => {
const scaleValue = React.useRef(new Animated.Value(0)).current;
React.useEffect(() => {
if (visible) {
Animated.spring(scaleValue, {
toValue: 1,
useNativeDriver: true,
}).start();
} else {
scaleValue.setValue(0);
}
}, [visible]);
return (
<Modal visible={visible} transparent animationType="fade" onRequestClose={onClose}>
<View style={styles.overlay}>
<Animated.View style={[styles.modalContainer, { transform: [{ scale: scaleValue }] }]}>
<View style={styles.header}>
<Text style={styles.title}>{title}</Text>
<TouchableOpacity onPress={onClose}>
<Text style={styles.closeButton}>✕</Text>
</TouchableOpacity>
</View>
<View style={styles.content}>{children}</View>
</Animated.View>
</View>
</Modal>
);
};
const styles = StyleSheet.create({
overlay: {
flex: 1,
backgroundColor: 'rgba(0,0,0,0.5)',
justifyContent: 'center',
alignItems: 'center',
},
modalContainer: {
width: '80%',
backgroundColor: '#fff',
borderRadius: 16,
padding: 20,
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.25,
shadowRadius: 4,
elevation: 5,
},
header: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
marginBottom: 16,
},
title: { fontSize: 18, fontWeight: '700' },
closeButton: { fontSize: 22, color: '#888' },
content: {},
});
export default CustomModal;
8. Промт для анимации с Animated API
Для чего: Создание анимированного компонента (например, появление элемента).
Промт:
Создай React Native компонент FadeInView, который анимирует появление дочерних элементов с использованием Animated API. Длительность анимации — 500ms. Используй useRef и useEffect.
Пример использования:
import React, { useRef, useEffect } from 'react';
import { Animated, ViewProps } from 'react-native';
interface FadeInViewProps extends ViewProps {
duration?: number;
}
const FadeInView: React.FC<FadeInViewProps> = ({ duration = 500, style, children, ...props }) => {
const opacity = useRef(new Animated.Value(0)).current;
useEffect(() => {
Animated.timing(opacity, {
toValue: 1,
duration,
useNativeDriver: true,
}).start();
}, []);
return (
<Animated.View style={[{ opacity }, style]} {...props}>
{children}
</Animated.View>
);
};
export default FadeInView;
9. Промт для интеграции с REST API (POST-запрос)
Для чего: Отправка данных на сервер с обработкой ответа.
Промт:
Напиши функцию для отправки POST-запроса к API в React Native с использованием fetch. Функция должна принимать URL, тело запроса (типизированное) и возвращать Promise с ответом. Добавь обработку ошибок сети и HTTP-статусов.
Пример использования:
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';
interface ApiResponse<T> {
success: boolean;
data?: T;
error?: string;
}
async function apiRequest<T, R = T>(
url: string,
method: HttpMethod = 'POST',
body?: T
): Promise<ApiResponse<R>> {
try {
const response = await fetch(url, {
method,
headers: {
'Content-Type': 'application/json',
},
body: body ? JSON.stringify(body) : undefined,
});
if (!response.ok) {
const errorBody = await response.text();
return { success: false, error: `HTTP ${response.status}: ${errorBody}` };
}
const data: R = await response.json();
return { success: true, data };
} catch (error) {
return { success: false, error: error instanceof Error ? error.message : 'Unknown error' };
}
}
// Пример использования:
// const result = await apiRequest<{ email: string; password: string }, { token: string }>(
// 'https://api.example.com/login',
// 'POST',
// { email: 'user@example.com', password: '12345678' }
// );
10. Промт для создания тестового компонента с Jest
Для чего: Написание юнит-теста для React Native компонента.
Промт:
Напиши тест на Jest и React Native Testing Library для компонента ProductCard. Проверь: рендер title, price, вызов onPress при нажатии, отображение placeholder при ошибке изображения.
Пример использования:
import React from 'react';
import { render, fireEvent } from '@testing-library/react-native';
import ProductCard from './ProductCard';
describe('ProductCard', () => {
const mockOnPress = jest.fn();
const props = {
id: '1',
title: 'Тестовый товар',
price: 1000,
imageUrl: 'https://example.com/image.jpg',
onPress: mockOnPress,
};
it('renders title and price', () => {
const { getByText } = render(<ProductCard {...props} />);
expect(getByText('Тестовый товар')).toBeTruthy();
expect(getByText('1 000 ₽')).toBeTruthy();
});
it('calls onPress when pressed', () => {
const { getByRole } = render(<ProductCard {...props} />);
fireEvent.press(getByRole('button'));
expect(mockOnPress).toHaveBeenCalledWith('1');
});
it('shows placeholder on image error', () => {
const { getByText } = render(<ProductCard {...props} imageUrl="invalid-url" />);
expect(getByText('Нет изображения')).toBeTruthy();
});
});
Заключение
Эти 10 промтов покрывают 80% повседневных задач React Native разработчика: от создания UI-компонентов до интеграции с API и тестирования. Используйте их как отправную точку — адаптируйте под свои проекты, добавляйте бизнес-логику и расширяйте функциональность. Помните, что качество промта напрямую влияет на качество ответа: чем конкретнее вы описываете требования, тем точнее будет результат.
Для более глубокого изучения React Native рекомендую официальную документацию (reactnative.dev) и репозитории с open-source проектами. А если вы хотите систематизировать свои знания и научиться создавать сложные приложения с нуля, обратите внимание на специализированные курсы — например, ASI Biont предлагает практические программы по мобильной разработке с фокусом на реальные кейсы. ASI Biont поддерживает подключение к различным API через свою платформу — подробнее на asibiont.com/courses.
Попробуйте эти промты уже сегодня и оцените, насколько быстрее вы сможете разрабатывать мобильные приложения!
Комментарии