# 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
}
}
```
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 (
)
}
```
## İleri düzey desenler
### 11. Higher-Order Component (HOC) nedir?
HOC, bir bileşen alıp zenginleştirilmiş yeni bir bileşen döndüren bir fonksiyondur. Hookların gelmesinden bu yana daha az kullanılsa da bazı kütüphanelerde hâlâ yer alır.
```jsx
// HOC that adds logging
function withLogging(WrappedComponent) {
return function WithLogging(props) {
useEffect(() => {
console.log(`${WrappedComponent.name} mounted with props:`, props)
return () => {
console.log(`${WrappedComponent.name} unmounted`)
}
}, [])
return
}
}
// HOC that handles authentication
function withAuth(WrappedComponent) {
return function WithAuth(props) {
const { user, isLoading } = useAuth()
if (isLoading) return
if (!user) return
return
}
}
// Usage
const ProtectedDashboard = withAuth(Dashboard)
const LoggedButton = withLogging(Button)
```
### 12. Render Props deseni nedir?
Render Props deseni, bir fonksiyon olan bir prop aracılığıyla bileşenler arasında mantık paylaşır.
```jsx
// Component with render prop
function MouseTracker({ render }) {
const [position, setPosition] = useState({ x: 0, y: 0 })
useEffect(() => {
const handleMove = (e) => {
setPosition({ x: e.clientX, y: e.clientY })
}
window.addEventListener('mousemove', handleMove)
return () => window.removeEventListener('mousemove', handleMove)
}, [])
// Call the render function with data
return render(position)
}
// Usage
function App() {
return (
(
Position: {x}, {y}
)}
/>
)
}
// Modern version with custom hook (preferred)
function useMousePosition() {
const [position, setPosition] = useState({ x: 0, y: 0 })
useEffect(() => {
const handleMove = (e) => {
setPosition({ x: e.clientX, y: e.clientY })
}
window.addEventListener('mousemove', handleMove)
return () => window.removeEventListener('mousemove', handleMove)
}, [])
return position
}
function App() {
const { x, y } = useMousePosition()
return
Position: {x}, {y}
}
```
### 13. Özel (custom) hook nasıl oluşturulur?
Özel hooklar, durum içeren mantığı çıkartarak bileşenler arasında yeniden kullanılmasını sağlar.
```jsx
// useLocalStorage.js
function useLocalStorage(key, initialValue) {
// Initialize with localStorage value or default
const [storedValue, setStoredValue] = useState(() => {
try {
const item = window.localStorage.getItem(key)
return item ? JSON.parse(item) : initialValue
} catch (error) {
console.error(error)
return initialValue
}
})
// Setter wrapper that syncs with localStorage
const setValue = useCallback((value) => {
try {
// Support update functions
const valueToStore = value instanceof Function ? value(storedValue) : value
setStoredValue(valueToStore)
window.localStorage.setItem(key, JSON.stringify(valueToStore))
} catch (error) {
console.error(error)
}
}, [key, storedValue])
return [storedValue, setValue]
}
// Usage
function Settings() {
const [theme, setTheme] = useLocalStorage('theme', 'light')
const [fontSize, setFontSize] = useLocalStorage('fontSize', 16)
return (