# En Çok Sorulan 30 React Mülakat Sorusu (2026) > React mülakatlarında en sık karşılaşılan 30 soru, ayrıntılı cevaplar, kod örnekleri ve etkili hazırlık için modern desenler. - Published: 2026-01-31 - Updated: 2026-04-21 - Author: SharpSkill - Tags: react interview, frontend interview, react questions, javascript, technical interview - Reading time: 18 min --- React teknik mülakatları; temel kavramların, ileri düzey desenlerin ve iyi uygulamaların kavranmasını değerlendirir. Bu rehber, en sık karşılaşılan 30 soruyu, ayrıntılı cevaplarla ve kod örnekleriyle birlikte etkili bir hazırlık için sunar. > **Hazırlık önerisi** > > Sorular zorluk düzeyine göre sıralanmıştır. İleri düzey konulara geçmeden önce temel bilgilere hâkim olmak, daha düzenli bir hazırlığa olanak tanır. ## React temelleri ### 1. Virtual DOM nedir ve React neden kullanır? Virtual DOM, gerçek DOM'un JavaScript üzerinde tutulan hafif bir temsilidir. React bu soyutlamayı arayüz güncellemelerini optimize etmek için kullanır. Süreç üç adımdan oluşur: React önce DOM'un sanal bir kopyasını oluşturur, değişiklikler meydana geldiğinde bu kopyayı önceki sürümle karşılaştırır (diffing algoritması) ve son olarak yalnızca gerekli değişiklikleri gerçek DOM'a uygular (reconciliation). ```jsx // Simplified example of the concept // When state changes, React doesn't recreate the entire DOM function Counter() { const [count, setCount] = useState(0) // Only the span containing count will be updated in the real DOM // The rest of the component is untouched return (

Counter

{count}
) } ``` Bu yaklaşım pahalı DOM işlemlerinden kaçınmayı sağlar ve karmaşık arayüzlerde bile performanslı güncellemelere olanak verir. ### 2. Fonksiyonel ve sınıf bileşenleri arasındaki fark nedir? Fonksiyonel bileşenler, props alan ve JSX döndüren JavaScript fonksiyonlarıdır. React 16.8 ile gelen hooklar sayesinde state ve lifecycle özellikleri artık fonksiyonel bileşenlerde de kullanılabilir. ```jsx // Functional component (recommended) // More concise, easier to test, supports hooks function Welcome({ name }) { const [visits, setVisits] = useState(0) useEffect(() => { setVisits(v => v + 1) }, []) return

Hello {name}, visit #{visits}

} // Class component (legacy) // More verbose, requires this binding class WelcomeClass extends React.Component { state = { visits: 0 } componentDidMount() { this.setState(prev => ({ visits: prev.visits + 1 })) } render() { return

Hello {this.props.name}, visit #{this.state.visits}

} } ``` Fonksiyonel bileşenler artık standart haline gelmiştir. Sınıf bileşenleri desteklenmeye devam etse de yeni projeler için önerilmemektedir. ### 3. JSX nasıl çalışır? JSX, JavaScript'e getirilen bir sözdizimi uzantısıdır ve kod içinde işaretleme yazılmasına izin verir. HTML değil, kılık değiştirmiş JavaScript'tir. ```jsx // What we write (JSX) const element = (

Title

Paragraph

) // What Babel compiles (pure JavaScript) const element = React.createElement( 'div', { className: 'container' }, React.createElement('h1', null, 'Title'), React.createElement('p', null, 'Paragraph') ) ``` HTML'den bazı farkları şunlardır: `class` yerine `className`, `for` yerine `htmlFor`, nitelikler için camelCase (`onClick`, `tabIndex`) ve kendi kendini kapatan etiketlerin zorunlu olarak kapatılması. ### 4. State ile props arasındaki fark nedir? Props, bir ana bileşenden alt bileşene iletilen verilerdir ve yalnızca okunabilir. State ise bileşenin setter fonksiyonlarıyla değiştirilebilen iç durumudur. ```jsx // UserCard.jsx // name and role are props (immutable) function UserCard({ name, role }) { // isExpanded is state (mutable) const [isExpanded, setIsExpanded] = useState(false) return (

{name}

{role}

{/* Modifying state triggers a re-render */} {isExpanded && }
) } // Usage ``` Temel kural şudur: props aşağıya doğru akar (ana → alt), state ise her bileşene özeldir. ### 5. Listelerde key neden önemlidir? Key'ler, bir listedeki hangi öğelerin değiştiğini, eklendiğini veya silindiğini React'in belirlemesine yardımcı olur. Benzersiz ve kararlı key'ler olmadan React beklenmeyen davranışlar sergileyebilir. ```jsx // ❌ Bad practice: index as key // Problem: if order changes, React loses tracking {items.map((item, index) => ( ))} // ✅ Good practice: unique and stable identifier {items.map(item => ( ))} // Concrete example of the problem with indices function TodoList() { const [todos, setTodos] = useState([ { id: 1, text: 'Learn React' }, { id: 2, text: 'Create a project' } ]) // When deleting the first element with key={index} // React will think element 0's content changed // instead of understanding an element was removed return (
    {todos.map(todo => (
  • {todo.text}
  • ))}
) } ``` ## React Hooks ### 6. useState nasıl çalışır ve yaygın tuzakları nelerdir? `useState`, bir fonksiyonel bileşendeki yerel durumu yönetir. Setter, bir değer veya bir güncelleme fonksiyonu alabilir. ```jsx // Declaration with initial value const [count, setCount] = useState(0) // ❌ Pitfall: multiple updates in the same cycle function increment() { setCount(count + 1) // count = 0, sets 1 setCount(count + 1) // count = 0 still, sets 1 setCount(count + 1) // count = 0 still, sets 1 // Final result: 1 (not 3) } // ✅ Solution: use the update function function incrementCorrect() { setCount(prev => prev + 1) // 0 → 1 setCount(prev => prev + 1) // 1 → 2 setCount(prev => prev + 1) // 2 → 3 // Final result: 3 } // ❌ Pitfall: object mutation const [user, setUser] = useState({ name: 'Alice', age: 25 }) user.age = 26 // Direct mutation, no re-render // ✅ Solution: create a new object setUser({ ...user, age: 26 }) // or setUser(prev => ({ ...prev, age: 26 })) ``` ### 7. useEffect bağımlılık dizisiyle nasıl çalışır? `useEffect`, render sonrasında yan etkileri çalıştırır. Bağımlılık dizisi, efektin ne zaman tetikleneceğini belirler. ```jsx // Executed on every render (rare, usually avoid) useEffect(() => { console.log('Render completed') }) // Executed only on mount (equivalent to componentDidMount) useEffect(() => { console.log('Component mounted') // Cleanup on unmount (equivalent to componentWillUnmount) return () => { console.log('Component unmounted') } }, []) // Executed when userId changes useEffect(() => { async function fetchUser() { const response = await fetch(`/api/users/${userId}`) const data = await response.json() setUser(data) } fetchUser() }, [userId]) // ❌ Missing dependency - subtle bug useEffect(() => { const timer = setInterval(() => { setCount(count + 1) // count is "captured" at its initial value }, 1000) return () => clearInterval(timer) }, []) // count is missing from dependencies // ✅ Fix with update function useEffect(() => { const timer = setInterval(() => { setCount(prev => prev + 1) // No need for count in deps }, 1000) return () => clearInterval(timer) }, []) ``` > **ESLint kuralı** > > Eksik bağımlılıkları tespit etmek için `eslint-plugin-react-hooks` her zaman etkinleştirilmelidir. Bu kural, teşhis edilmesi zor birçok hatayı önler. ### 8. useMemo ve useCallback ne zaman kullanılmalıdır? Bu hooklar, gereksiz yeniden hesaplamaları veya yeniden oluşturmaları önlemek için memoization sağlar. Ancak aşırı kullanımdan kaçınılmalıdır. ```jsx // useMemo: memoizes a computed value function ProductList({ products, filter }) { // Recalculated only if products or filter change const filteredProducts = useMemo(() => { console.log('Filtering...') return products.filter(p => p.category === filter) }, [products, filter]) return
    {filteredProducts.map(p =>
  • {p.name}
  • )}
} // useCallback: memoizes a function function ParentComponent() { const [count, setCount] = useState(0) // Without useCallback, handleClick is recreated on every render // Causing unnecessary re-renders of ExpensiveChild const handleClick = useCallback((id) => { console.log('Clicked:', id) }, []) // Empty deps = stable function return ( <> {count} {/* React.memo on ExpensiveChild for this to be effective */} ) } // ❌ Over-optimization: not needed here const SimpleComponent = () => { // This calculation is trivial, useMemo adds overhead const doubled = useMemo(() => 2 * 2, []) return {doubled} } ``` Bu hooklar yalnızca gerçek bir performans sorunu tespit edildiğinde veya memoize edilmiş bileşenlere aktarılan referansları sabit tutmak gerektiğinde kullanılmalıdır. ### 9. useRef nasıl çalışır ve hangi durumlarda kullanılır? `useRef`, renderlar arasında kalıcı olan ve değiştiğinde yeniden render tetiklemeyen değiştirilebilir bir referans oluşturur. ```jsx // Case 1: Access a DOM element function TextInput() { const inputRef = useRef(null) const focusInput = () => { inputRef.current.focus() } return ( <> ) } // Case 2: Store a mutable value without re-render function Timer() { const [seconds, setSeconds] = useState(0) const intervalRef = useRef(null) const start = () => { // Store the interval ID to be able to stop it intervalRef.current = setInterval(() => { setSeconds(s => s + 1) }, 1000) } const stop = () => { clearInterval(intervalRef.current) } return (
{seconds}s
) } // Case 3: Keep the previous value function usePrevious(value) { const ref = useRef() useEffect(() => { ref.current = value }, [value]) return ref.current } ``` ### 10. useContext nedir ve ne zaman kullanılır? `useContext`, prop drilling olmadan bir React kontekstine erişim sağlar. Tema veya oturum açmış kullanıcı gibi global veriler için idealdir. ```jsx // 1. Create the context const ThemeContext = createContext({ theme: 'light', toggleTheme: () => {} }) // 2. Create the provider function ThemeProvider({ children }) { const [theme, setTheme] = useState('light') const toggleTheme = useCallback(() => { setTheme(prev => prev === 'light' ? 'dark' : 'light') }, []) // Memoize the value to avoid unnecessary re-renders const value = useMemo(() => ({ theme, toggleTheme }), [theme, toggleTheme]) return ( {children} ) } // 3. Use the context function ThemedButton() { const { theme, toggleTheme } = useContext(ThemeContext) return ( ) } // 4. Wrap the application function App() { return (