# 30 คำถามสัมภาษณ์ React Native ยอดนิยม: คู่มือฉบับสมบูรณ์ปี 2026 > 30 คำถามสัมภาษณ์ React Native ที่พบบ่อยที่สุด พร้อมคำตอบโดยละเอียดและตัวอย่างโค้ดเพื่อคว้าตำแหน่งนักพัฒนามือถือ - 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 จะวัดทักษะการพัฒนาแอปพลิเคชันมือถือแบบข้ามแพลตฟอร์ม ความเฉพาะของ iOS/Android และรูปแบบด้านประสิทธิภาพ คู่มือนี้ครอบคลุม 30 คำถามที่ถูกถามบ่อยที่สุด พร้อมคำตอบโดยละเอียดและตัวอย่างโค้ดเพื่อการเตรียมตัวที่ได้ผล > **คำแนะนำในการเตรียมตัว** > > คำถามเหล่านี้ครอบคลุมตั้งแต่พื้นฐานไปจนถึงแนวคิดขั้นสูง การเข้าใจสถาปัตยกรรมของ React Native และความแตกต่างจาก React บนเว็บคือกุญแจสำคัญสู่ความสำเร็จในการสัมภาษณ์ ## พื้นฐานของ React Native ### 1. ความแตกต่างระหว่าง React และ React Native คืออะไร React เป็นไลบรารีสำหรับสร้างอินเทอร์เฟซบนเว็บ ในขณะที่ React Native ใช้สำหรับพัฒนาแอปพลิเคชันมือถือแบบเนทีฟทั้งบน iOS และ Android ความแตกต่างพื้นฐานอยู่ที่กระบวนการเรนเดอร์ React ใช้ Virtual DOM ซึ่งแปลงเป็นองค์ประกอบ HTML ส่วน React Native ใช้บริดจ์ที่สื่อสารกับคอมโพเนนต์เนทีฟของแต่ละแพลตฟอร์ม ```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 จะถูกแปลงเป็น UIView บน iOS และ android.view บน Android ซึ่งให้ประสิทธิภาพเทียบเท่ากับแอปเนทีฟ ### 2. สถาปัตยกรรมของ React Native ทำงานอย่างไร React Native ใช้สถาปัตยกรรมสามชั้น ได้แก่ JavaScript, Bridge (หรือ JSI ในสถาปัตยกรรมใหม่) และ Native โค้ด JavaScript ทำงานบนเอนจิน JS (Hermes หรือ JavaScriptCore) การสื่อสารกับโค้ดเนทีฟใช้การแปลงเป็น JSON ในสถาปัตยกรรมเดิม หรือผ่าน 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 ``` สถาปัตยกรรมใหม่ปรับปรุงประสิทธิภาพอย่างมีนัยสำคัญด้วยการกำจัดการแปลงเป็น JSON และเปิดให้เรียกแบบซิงโครนัสได้ ### 3. Metro bundler คืออะไร Metro คือบันเดิล JavaScript ที่ React Native ใช้ ทำหน้าที่แปลงโค้ดต้นฉบับให้กลายเป็นบันเดิลที่ปรับให้เหมาะสมสำหรับการรันบนอุปกรณ์มือถือ Metro รับผิดชอบการแก้ไขโมดูล การแปลงโค้ด (ผ่าน Babel) และการรองรับ hot reloading ในระหว่างการพัฒนา ```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 รองรับ Fast Refresh ซึ่งช่วยให้สามารถนำการเปลี่ยนแปลงไปใช้ทันทีโดยไม่สูญเสียสถานะของแอปพลิเคชัน ### 4. กรุณาอธิบาย StyleSheet.create และข้อดีของมัน `StyleSheet.create` ช่วยปรับสไตล์ให้เหมาะสมโดยการตรวจสอบและแปลงเป็นการอ้างอิงเชิงตัวเลข ซึ่งช่วยลดภาระงานบนบริดจ์ ```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. Flexbox ของเว็บและ React Native ต่างกันอย่างไร React Native ใช้ Flexbox แต่กำหนดค่าเริ่มต้นที่ต่างจากเวอร์ชันเว็บ โดยปรับให้เหมาะกับอินเทอร์เฟซมือถือในแนวตั้ง ```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' } }) ``` ## การนำทางและคอมโพเนนต์ ### 6. จะนำการนำทางมาใช้กับ React Navigation อย่างไร React Navigation เป็นโซลูชันมาตรฐานสำหรับการนำทางใน React Native โดยมีตัวนำทางหลายประเภทที่เหมาะกับรูปแบบของอุปกรณ์มือถือ ```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 อย่างไร `FlatList` ได้รับการปรับให้เหมาะกับลิสต์ขนาดยาวด้วยการทำเวอร์ชวลไลซ์อัตโนมัติ โดยจะเรนเดอร์เฉพาะองค์ประกอบที่มองเห็นได้บนหน้าจอเท่านั้น ```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 ให้เหมาะสม** > > ควรใช้ `useCallback` เพื่อทำเมโมไรเซชัน `renderItem` เสมอ และแยกคอมโพเนนต์ที่ทำงานหนักออกไปต่างหาก หลีกเลี่ยงการใช้ฟังก์ชันแบบอินไลน์ใน `renderItem` เพราะอาจทำให้เกิดการเรนเดอร์ซ้ำที่ไม่จำเป็น ### 8. ความแตกต่างระหว่าง TouchableOpacity, Pressable และ TouchableHighlight คืออะไร คอมโพเนนต์เหล่านี้จัดการกับการสัมผัสและให้ผลตอบสนองทางสายตาที่ต่างกัน ```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` คือทางเลือกที่แนะนำสำหรับโครงการใหม่ เนื่องจากมีการควบคุมที่กว้างกว่าและ API ที่สม่ำเสมอกว่า ### 9. จะสร้างแอนิเมชันที่ลื่นไหลได้อย่างไร React Native มี API สำหรับแอนิเมชันหลายตัว ได้แก่ Animated (มาพร้อมในตัว) และ 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 (