# 30 Pertanyaan Wawancara React Native Teratas: Panduan Lengkap 2026 > 30 pertanyaan wawancara React Native yang paling sering diajukan. Jawaban terperinci dengan contoh kode untuk meraih posisi sebagai pengembang mobile. - 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 --- Wawancara teknis React Native menilai keterampilan pengembangan mobile lintas platform, kekhususan iOS/Android, serta pola performa. Panduan ini membahas 30 pertanyaan yang paling sering diajukan, lengkap dengan jawaban terperinci dan contoh kode untuk persiapan yang efektif. > **Saran Persiapan** > > Pertanyaan-pertanyaan ini mencakup hal mendasar hingga konsep lanjutan. Penguasaan arsitektur React Native dan pemahaman perbedaannya dengan React web menjadi kunci utama keberhasilan dalam wawancara. ## Dasar-Dasar React Native ### 1. Apa perbedaan antara React dan React Native? React merupakan pustaka untuk membangun antarmuka web, sedangkan React Native memungkinkan pengembangan aplikasi mobile native untuk iOS maupun Android. Perbedaan mendasarnya terletak pada proses rendering: React menggunakan Virtual DOM yang diterjemahkan menjadi elemen HTML, sementara React Native memanfaatkan jembatan (bridge) yang berkomunikasi dengan komponen native pada masing-masing platform. ```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 } }) ``` Komponen React Native diterjemahkan menjadi UIView pada iOS dan android.view pada Android, sehingga menghasilkan performa setara aplikasi native. ### 2. Bagaimana cara kerja arsitektur React Native? React Native menggunakan arsitektur tiga lapis: JavaScript, Bridge (atau JSI pada arsitektur baru), dan Native. Kode JavaScript dijalankan pada mesin JS (Hermes atau JavaScriptCore). Komunikasi dengan kode native melalui serialisasi JSON pada arsitektur lama, atau melalui JSI (JavaScript Interface) pada arsitektur baru. ```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 ``` Arsitektur baru meningkatkan performa secara signifikan dengan menghilangkan serialisasi JSON dan memungkinkan pemanggilan sinkron. ### 3. Apa itu Metro bundler? Metro adalah bundler JavaScript yang digunakan oleh React Native. Bundler ini mengubah kode sumber menjadi bundle yang dioptimalkan untuk eksekusi di perangkat mobile. Metro menangani resolusi modul, transformasi kode (melalui Babel), serta hot reloading selama pengembangan. ```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 mendukung Fast Refresh, sehingga perubahan dapat diterapkan secara langsung tanpa kehilangan state aplikasi. ### 4. Jelaskan StyleSheet.create dan keuntungannya `StyleSheet.create` mengoptimalkan style dengan memvalidasinya dan mengonversinya menjadi referensi numerik, sehingga mengurangi beban pada bridge. ```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. Apa perbedaan antara Flexbox web dan React Native? React Native menggunakan Flexbox tetapi dengan nilai default yang berbeda dari versi web, disesuaikan untuk antarmuka mobile vertikal. ```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' } }) ``` ## Navigasi dan Komponen ### 6. Bagaimana cara mengimplementasikan navigasi dengan React Navigation? React Navigation merupakan solusi standar untuk navigasi pada React Native. Pustaka ini menyediakan berbagai jenis navigator yang sesuai dengan pola mobile. ```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. Bagaimana cara menangani daftar performa tinggi dengan FlatList? `FlatList` dioptimalkan untuk daftar panjang melalui virtualisasi otomatis, hanya merender elemen yang terlihat di layar. ```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={} /> ) } ``` > **Optimasi FlatList** > > Selalu memoisasi `renderItem` menggunakan `useCallback` dan ekstrak komponen yang berat. Hindari fungsi inline pada `renderItem` yang dapat memicu re-render yang tidak perlu. ### 8. Apa perbedaan antara TouchableOpacity, Pressable, dan TouchableHighlight? Komponen-komponen ini menangani interaksi sentuh dengan umpan balik visual yang berbeda. ```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' } }) ``` `Pressable` direkomendasikan untuk proyek baru karena menawarkan kontrol lebih luas dan API yang lebih konsisten. ### 9. Bagaimana cara membuat animasi yang halus? React Native menyediakan beberapa API animasi: Animated (bawaan) dan Reanimated (lebih performan). ```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 (