# En Çok Sorulan 30 React Native Mülakat Sorusu: Eksiksiz Rehber 2026 > En çok sorulan 30 React Native mülakat sorusu. Mobil geliştirici pozisyonunu kazanmak için kod örnekleriyle ayrıntılı yanıtlar. - 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 --- React Native teknik mülakatları, çapraz platform mobil geliştirme becerilerini, iOS ve Android özelliklerini ve performans desenlerini değerlendirir. Bu rehber, etkili bir hazırlık sağlamak amacıyla en sık sorulan 30 soruyu ayrıntılı yanıtlar ve kod örnekleriyle birlikte ele almaktadır. > **Hazırlık Önerisi** > > Bu sorular temellerden ileri kavramlara kadar geniş bir yelpazeyi kapsar. React Native mimarisini iyi kavramak ve React web ile aralarındaki farkları anlamak, mülakatta başarılı olmanın anahtarıdır. ## React Native Temelleri ### 1. React ile React Native arasındaki fark nedir? React, web arayüzleri oluşturmak için kullanılan bir kütüphanedir; React Native ise iOS ve Android için yerel mobil uygulama geliştirilmesini mümkün kılar. Temel fark, render etme biçiminde yatar: React, HTML öğelerine dönüşen bir Sanal DOM kullanırken, React Native her platformun yerel bileşenleriyle iletişim kuran bir köprü kullanır. ```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 } }) ``` React Native bileşenleri, iOS'ta UIView'a, Android'de android.view'a dönüşerek yerel performans sunar. ### 2. React Native mimarisi nasıl çalışır? React Native üç katmanlı bir mimari kullanır: JavaScript, Bridge (yeni mimaride JSI) ve Native katman. JavaScript kodu bir JS motorunda (Hermes veya JavaScriptCore) çalışır. Yerel kod ile iletişim eski mimaride JSON serileştirme yoluyla, yeni mimaride ise JSI (JavaScript Interface) aracılığıyla gerçekleşir. ```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 ``` Yeni mimari, JSON serileştirmesini ortadan kaldırarak ve senkron çağrılara izin vererek performansı önemli ölçüde artırır. ### 3. Metro bundler nedir? Metro, React Native tarafından kullanılan JavaScript bundler'ıdır. Kaynak kodu, mobil cihazlarda çalıştırılmak üzere optimize edilmiş bir paket haline dönüştürür. Metro, modül çözümlemesini, kod dönüştürmesini (Babel aracılığıyla) ve geliştirme sırasında hot reloading işlemini yönetir. ```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, uygulamanın durumunu kaybetmeden anlık değişikliklere izin veren Fast Refresh özelliğini destekler. ### 4. StyleSheet.create nedir ve hangi avantajları sağlar? `StyleSheet.create`, stilleri doğrulayarak ve sayısal referanslara dönüştürerek köprü yükünü azaltıp optimize eder. ```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. Web Flexbox ile React Native Flexbox arasındaki fark nedir? React Native Flexbox kullanır; ancak dikey mobil arayüzlere uyarlanmış olarak web sürümünden farklı varsayılan değerlere sahiptir. ```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' } }) ``` ## Navigasyon ve Bileşenler ### 6. React Navigation ile navigasyon nasıl uygulanır? React Navigation, React Native için standart navigasyon çözümüdür. Mobil desenlere uygun farklı navigatör türleri sunar. ```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. FlatList ile performanslı listeler nasıl yönetilir? `FlatList`, otomatik sanallaştırma sayesinde uzun listeler için optimize edilmiştir ve yalnızca görünür öğeleri render eder. ```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={} /> ) } ``` > **FlatList Optimizasyonu** > > `renderItem` fonksiyonunu daima `useCallback` ile memoize etmek ve ağır bileşenleri ayrı tutmak gerekir. `renderItem` içinde inline fonksiyon kullanmaktan kaçınılmalıdır; aksi halde gereksiz yeniden render'lara yol açar. ### 8. TouchableOpacity, Pressable ve TouchableHighlight arasındaki fark nedir? Bu bileşenler dokunma etkileşimlerini farklı görsel geri bildirimlerle yönetir. ```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' } }) ``` Daha fazla kontrol ve daha tutarlı bir API sunduğu için yeni projelerde `Pressable` kullanılması tavsiye edilir. ### 9. Akıcı animasyonlar nasıl oluşturulur? React Native birkaç animasyon API'si sunar: yerleşik Animated ve daha performanslı olan 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 (