# 30 najczęstszych pytań rekrutacyjnych z React Native: pełny przewodnik 2026 > Trzydzieści najczęściej zadawanych pytań rekrutacyjnych z React Native. Szczegółowe odpowiedzi z przykładami kodu, które pomogą zdobyć posadę programisty mobilnego. - Published: 2026-02-01 - Updated: 2026-04-27 - Author: SharpSkill - Tags: react native interview, mobile interview, react native questions, javascript, technical interview - Reading time: 20 min --- Rozmowy techniczne z React Native sprawdzają umiejętności w zakresie wieloplatformowego programowania mobilnego, znajomość specyfiki iOS i Androida oraz wzorców wydajnościowych. Niniejszy przewodnik omawia trzydzieści najczęściej zadawanych pytań wraz ze szczegółowymi odpowiedziami i przykładami kodu, dzięki czemu przygotowanie staje się skuteczne i kompletne. > **Wskazówka dotycząca przygotowań** > > Pytania obejmują zarówno podstawy, jak i zaawansowane zagadnienia. Opanowanie architektury React Native oraz zrozumienie różnic względem React dla web jest kluczowe, aby pomyślnie przejść rozmowę. ## Podstawy React Native ### 1. Jaka jest różnica pomiędzy React a React Native? React stanowi bibliotekę służącą do budowania interfejsów webowych, natomiast React Native umożliwia tworzenie natywnych aplikacji mobilnych dla systemów iOS oraz Android. Fundamentalna różnica leży w sposobie renderowania: React korzysta z Virtual DOM, który jest tłumaczony na elementy HTML, podczas gdy React Native używa mostu komunikującego się z natywnymi komponentami każdej platformy. ```jsx // React (Web) - uses HTML elements function WebComponent() { return (
Web text
) } // React Native - uses native components import { View, Text, TouchableOpacity, StyleSheet } from 'react-native' function NativeComponent() { return ( Native text Press ) } const styles = StyleSheet.create({ container: { flex: 1, padding: 16 } }) ``` Komponenty React Native są tłumaczone na UIView w iOS oraz android.view w Androidzie, co zapewnia natywną wydajność. ### 2. Jak działa architektura React Native? React Native wykorzystuje architekturę trójwarstwową: warstwę JavaScript, warstwę mostu (lub JSI w nowej architekturze) oraz warstwę natywną. Kod JavaScript wykonuje się w silniku JS (Hermes lub JavaScriptCore). W starej architekturze komunikacja z kodem natywnym odbywa się poprzez serializację JSON, podczas gdy nowa architektura oferuje bezpośrednie wywołania dzięki interfejsowi JSI (JavaScript Interface). ```jsx // Old architecture: asynchronous communication via Bridge // The Bridge serializes messages as JSON between JS and Native // New architecture (Fabric + TurboModules) // JSI enables synchronous direct calls to native modules // Example TurboModule usage import { TurboModuleRegistry } from 'react-native' // Synchronous access to native module const DeviceInfo = TurboModuleRegistry.get('DeviceInfo') const deviceName = DeviceInfo.getDeviceName() // Synchronous call // With Fabric, rendering is smoother // Components can be created synchronously // Reducing jank during animations ``` Nowa architektura znacząco poprawia wydajność, eliminując serializację JSON i umożliwiając synchroniczne wywołania. ### 3. Czym jest Metro bundler? Metro to bundler JavaScript stosowany w React Native. Przekształca on kod źródłowy w zoptymalizowany pakiet wykonawczy, gotowy do uruchomienia na urządzeniu mobilnym. Metro odpowiada za rozwiązywanie modułów, transformację kodu (poprzez Babel) oraz hot reloading podczas pracy deweloperskiej. ```javascript // metro.config.js const { getDefaultConfig } = require('expo/metro-config') const config = getDefaultConfig(__dirname) // Custom configuration config.resolver.assetExts.push('db') // Add extensions config.resolver.sourceExts.push('cjs') // CommonJS support // Transformer configuration config.transformer.babelTransformerPath = require.resolve( 'react-native-svg-transformer' ) // Production optimizations config.transformer.minifierConfig = { keep_classnames: true, keep_fnames: true, mangle: { keep_classnames: true, keep_fnames: true } } module.exports = config ``` Metro obsługuje także Fast Refresh, dzięki któremu zmiany w kodzie są widoczne natychmiast bez utraty stanu aplikacji. ### 4. Jak działa StyleSheet.create i jakie daje korzyści? Funkcja `StyleSheet.create` optymalizuje style poprzez ich walidację oraz konwersję na referencje numeryczne, co zmniejsza obciążenie mostu. ```jsx // ❌ Inline styles - recreated on every render function BadExample() { return ( Title ) } // ✅ StyleSheet.create - optimized and validated const styles = StyleSheet.create({ container: { flex: 1, padding: 16, backgroundColor: '#fff' }, title: { fontSize: 18, fontWeight: 'bold' }, // Style composition row: { flexDirection: 'row', alignItems: 'center', gap: 8 } }) function GoodExample() { return ( Title {/* Style combination */} Content ) } // StyleSheet.absoluteFillObject for absolute positioning const overlayStyles = StyleSheet.create({ overlay: { ...StyleSheet.absoluteFillObject, backgroundColor: 'rgba(0,0,0,0.5)' } }) ``` ### 5. Jaka jest różnica pomiędzy Flexbox webowym a Flexbox w React Native? React Native korzysta z Flexbox, jednak z innymi domyślnymi wartościami niż wersja webowa, dostosowanymi do pionowych interfejsów mobilnych. ```jsx // Key differences from web const styles = StyleSheet.create({ container: { // flexDirection: 'column' by default (vs 'row' on web) // alignItems: 'stretch' by default flex: 1 }, // React Native Flexbox row: { flexDirection: 'row', // Horizontal justifyContent: 'space-between', // Main axis alignItems: 'center', // Cross axis flexWrap: 'wrap', // Line wrapping gap: 8 // Supported since RN 0.71 }, // Flex grow/shrink flexItem: { flex: 1, // Equivalent to flex: 1 1 0 flexGrow: 1, // Grow to fill flexShrink: 0, // Don't shrink flexBasis: 100 // Base size }, // Absolute positioning absolute: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 } }) // Practical example: card with image and content function Card() { return ( Title Description ) } const cardStyles = StyleSheet.create({ container: { flexDirection: 'row', backgroundColor: '#fff', borderRadius: 8, overflow: 'hidden' }, image: { width: 100, height: 100 }, content: { flex: 1, // Takes remaining space padding: 12, justifyContent: 'center' }, title: { fontSize: 16, fontWeight: '600' }, description: { fontSize: 14, color: '#666' } }) ``` ## Nawigacja i komponenty ### 6. Jak zaimplementować nawigację z React Navigation? React Navigation jest standardowym rozwiązaniem nawigacyjnym w React Native. Oferuje różne typy nawigatorów dopasowanych do mobilnych wzorców interakcji. ```jsx // Installing dependencies // npm install @react-navigation/native @react-navigation/native-stack // npm install react-native-screens react-native-safe-area-context import { NavigationContainer } from '@react-navigation/native' import { createNativeStackNavigator } from '@react-navigation/native-stack' import { createBottomTabNavigator } from '@react-navigation/bottom-tabs' // TypeScript typing for navigation params type RootStackParamList = { Home: undefined Profile: { userId: string } Settings: { section?: string } } const Stack = createNativeStackNavigator() const Tab = createBottomTabNavigator() // Tab navigation function TabNavigator() { return ( ({ tabBarIcon: ({ focused, color, size }) => { // Dynamic icon based on tab const iconName = route.name === 'Home' ? 'home' : 'settings' return }, tabBarActiveTintColor: '#007AFF', tabBarInactiveTintColor: 'gray' })} > ) } // Stack navigation function App() { return ( ({ title: `Profile ${route.params.userId}` })} /> ) } ``` ### 7. Jak obsłużyć wydajne listy z FlatList? Komponent `FlatList` jest zoptymalizowany pod kątem długich list dzięki automatycznej wirtualizacji, renderując wyłącznie widoczne elementy. ```jsx import { FlatList, RefreshControl } from 'react-native' function ProductList() { const [products, setProducts] = useState([]) const [refreshing, setRefreshing] = useState(false) const [loading, setLoading] = useState(false) // Initial loading const fetchProducts = async (page = 1) => { const response = await api.getProducts(page) return response.data } // Pull-to-refresh const onRefresh = useCallback(async () => { setRefreshing(true) const data = await fetchProducts(1) setProducts(data) setRefreshing(false) }, []) // Infinite pagination const loadMore = useCallback(async () => { if (loading) return setLoading(true) const nextPage = Math.ceil(products.length / 20) + 1 const data = await fetchProducts(nextPage) setProducts(prev => [...prev, ...data]) setLoading(false) }, [products.length, loading]) // Item rendering const renderItem = useCallback(({ item }) => ( ), []) // Key extraction const keyExtractor = useCallback((item) => item.id.toString(), []) // Item separator const ItemSeparator = useCallback(() => ( ), []) return ( } // Infinite pagination onEndReached={loadMore} onEndReachedThreshold={0.5} ListFooterComponent={loading ? : null} // Empty list ListEmptyComponent={} /> ) } ``` > **Optymalizacja FlatList** > > Warto zawsze memoizować `renderItem` przy użyciu `useCallback` oraz wydzielać ciężkie komponenty. Należy unikać funkcji inline w `renderItem`, ponieważ powodują niepotrzebne ponowne renderowania. ### 8. Jaka jest różnica pomiędzy TouchableOpacity, Pressable i TouchableHighlight? Te komponenty obsługują interakcje dotykowe, jednak różnią się sposobem prezentacji wizualnego sprzężenia zwrotnego. ```jsx import { TouchableOpacity, TouchableHighlight, Pressable, StyleSheet } from 'react-native' function InteractionExamples() { return ( {/* TouchableOpacity: reduces opacity on touch */} console.log('Pressed')} style={styles.button} > TouchableOpacity {/* TouchableHighlight: adds background color */} console.log('Pressed')} style={styles.button} > TouchableHighlight {/* Pressable: modern API with more control */} console.log('Pressed')} onLongPress={() => console.log('Long press')} delayLongPress={500} style={({ pressed }) => [ styles.button, pressed && styles.buttonPressed ]} > {({ pressed }) => ( {pressed ? 'Pressed!' : 'Pressable'} )} {/* Pressable with hitSlop to enlarge touch area */} console.log('Pressed')} style={styles.smallButton} > Small button ) } const styles = StyleSheet.create({ container: { gap: 16, padding: 20 }, button: { backgroundColor: '#007AFF', padding: 16, borderRadius: 8, alignItems: 'center' }, buttonPressed: { backgroundColor: '#0056b3', transform: [{ scale: 0.98 }] }, textPressed: { color: '#fff' }, smallButton: { padding: 8, backgroundColor: '#eee' } }) ``` W nowych projektach zaleca się stosowanie `Pressable`, ponieważ oferuje większą kontrolę i bardziej spójne API. ### 9. Jak tworzyć płynne animacje? React Native udostępnia kilka API do animacji: wbudowane Animated oraz wydajniejsze Reanimated. ```jsx import { Animated, Easing } from 'react-native' import Reanimated, { useSharedValue, useAnimatedStyle, withSpring, withTiming } from 'react-native-reanimated' // Animation with Animated (native API) function FadeInView({ children }) { const fadeAnim = useRef(new Animated.Value(0)).current useEffect(() => { Animated.timing(fadeAnim, { toValue: 1, duration: 500, easing: Easing.ease, useNativeDriver: true // Performant on UI thread }).start() }, []) return ( {children} ) } // Animation with Reanimated (recommended for complex animations) function BouncyButton() { const scale = useSharedValue(1) const animatedStyle = useAnimatedStyle(() => ({ transform: [{ scale: scale.value }] })) const handlePressIn = () => { scale.value = withSpring(0.95, { damping: 10, stiffness: 400 }) } const handlePressOut = () => { scale.value = withSpring(1, { damping: 10, stiffness: 400 }) } return ( Press ) } // List animation with LayoutAnimation import { LayoutAnimation, UIManager, Platform } from 'react-native' // Enable on Android if (Platform.OS === 'android') { UIManager.setLayoutAnimationEnabledExperimental?.(true) } function AnimatedList() { const [items, setItems] = useState([]) const addItem = () => { // Configure animation before state change LayoutAnimation.configureNext(LayoutAnimation.Presets.spring) setItems(prev => [...prev, { id: Date.now() }]) } const removeItem = (id) => { LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) setItems(prev => prev.filter(item => item.id !== id)) } return (