React-Interviewfragen im Jahr 2026 behandeln Hooks, Statusverwaltung, Leistungsoptimierung, die neuen Funktionen von React 19 und TypeScript-Muster. Dieser Leitfaden behandelt die am häufigsten gestellten React-Fragen sowohl auf Junior- als auch auf Senior-Ebene.
📋 Table of Contents
Kernreaktionsfragen
1. Was ist das virtuelle DOM und wie funktioniert der Abgleich?
Das virtuelle DOM ist eine leichte JavaScript-Darstellung des realen DOM. Wenn sich der Status ändert:
- React erstellt einen neuen virtuellen DOM-Baum
- Der Differenzalgorithmus vergleicht neues und vorheriges virtuelles DOM
- Im realen DOM werden nur geänderte Knoten aktualisiert
- Diese Stapelung von Updates macht React leistungsfähig
React 18+ verwendet gleichzeitiges Rendern – kann das Rendern anhalten, unterbrechen und fortsetzen und dabei dringende Aktualisierungen priorisieren.
2. Erklären Sie useEffect und seine häufigsten Fallstricke
import { useEffect, useState } from 'react';
function UserProfile({ userId }: { userId: number }) {
const [user, setUser] = useState<User | null>(null);
// Correct: cleanup function + proper dependencies
useEffect(() => {
let cancelled = false; // prevent stale closure
async function fetchUser() {
const data = await api.getUser(userId);
if (!cancelled) setUser(data); // only update if still mounted
}
fetchUser();
return () => { cancelled = true; }; // cleanup
}, [userId]); // dependency array
// PITFALL 1: missing dependency
// useEffect(() => { fetchUser(userId); }, []);
// This won't re-run when userId changes!
// PITFALL 2: object/array in deps (new reference every render)
// useEffect(() => { ... }, [options]); // infinite loop if options = {}
// Fix: useMemo(() => options, [dep1, dep2])
// PITFALL 3: no cleanup for subscriptions
useEffect(() => {
const sub = websocket.subscribe(userId, setUser);
return () => sub.unsubscribe(); // ALWAYS cleanup subscriptions!
}, [userId]);
return user ? <Profile user={user} /> : <Loading />;
}
3. Wann sollten Sie useMemo und useCallback verwenden?
// useMemo — memoize expensive computed value
const filteredUsers = useMemo(
() => users.filter(u => u.active && u.role === selectedRole),
[users, selectedRole] // recompute only when these change
);
// useCallback — memoize function reference
const handleDelete = useCallback(
(userId: number) => {
setUsers(prev => prev.filter(u => u.id !== userId));
},
[] // no deps — stable reference
);
// Use useMemo when:
// - Expensive computation (sorting, filtering large arrays)
// - Object/array passed to children with React.memo
// - Dependency for other hooks
// Use useCallback when:
// - Passing to child component wrapped in React.memo
// - As dependency in useEffect to prevent re-runs
// DON'T overuse — memoization has overhead!
// Bad: const value = useMemo(() => a + b, [a, b]); // trivial, skip it
4. Was ist React.memo und wann wird es verwendet?
// React.memo — prevent re-render if props haven't changed
const ExpensiveList = React.memo(function ExpensiveList({ items, onItemClick }: Props) {
console.log('ExpensiveList rendered');
return (
<ul>
{items.map(item => (
<li key={item.id} onClick={() => onItemClick(item.id)}>
{item.name}
</li>
))}
</ul>
);
});
// Parent using it correctly
function Parent() {
const [count, setCount] = useState(0);
const [items] = useState(bigItemList);
// useCallback ensures stable reference (required for memo to work)
const handleClick = useCallback((id: number) => {
console.log('clicked', id);
}, []);
return (
<div>
<button onClick={() => setCount(c => c + 1)}>Count: {count}</button>
{/* ExpensiveList won't re-render when count changes */}
<ExpensiveList items={items} onItemClick={handleClick} />
</div>
);
}
Staatsmanagement
5. Wann sollten Sie Redux vs. Zustand vs. Kontext-API verwenden?
| Werkzeug | Verwenden Sie Wann | Vermeiden Sie wann |
|---|---|---|
| Kontext-API | Design, Gebietsschema, Authentifizierungsstatus (seltene Aktualisierungen) | Häufige Updates (verursacht erneutes Rendern) |
| Zustand | Die meisten Apps benötigen einen globalen Status | Sehr komplexe Event-Sourcing-Anforderungen |
| Redux-Toolkit | Große Teams, komplexer Zustand, Zeitreise-Debugging | Einfache Apps (Overkill) |
| TanStack-Abfrage | Serverstatus (immer) | Nicht für den UI-Status |
Reagieren Sie auf 19 Fragen
6. Was sind Serverkomponenten und wie unterscheiden sie sich von Clientkomponenten?
// Server Component (default in Next.js App Router)
// - Runs only on server, never on client
// - Can access databases, file system directly
// - Zero JS sent to client (except HTML)
// - Cannot use state, effects, event handlers
async function ProductList() { // no 'use client'
const products = await db.products.findMany(); // direct DB access!
return (
<ul>
{products.map(p => <ProductCard key={p.id} product={p} />)}
</ul>
);
}
// Client Component (must add 'use client')
// - Runs on both server (initial HTML) and client (hydration)
// - Can use useState, useEffect, event handlers
// - Receives props from Server Components
'use client';
function AddToCart({ productId }: { productId: number }) {
const [added, setAdded] = useState(false);
return (
<button onClick={() => {
addToCart(productId);
setAdded(true);
}}>
{added ? 'Added!' : 'Add to Cart'}
</button>
);
}
7. Was sind die neuen Funktionen von React 19?
- Serveraktionen– asynchrone Funktionen, die auf dem Server ausgeführt werden und vom Client aus aufgerufen werden können
- use()-Hook– Versprechen und Kontext beim Rendern lesen (ersetzt einige useEffect-Muster)
- Aktionen bilden— Native Formularverarbeitung mit Serverfunktionen
- Optimistische Updates– useOptimistic() für sofortiges UI-Feedback
- Dokumentmetadaten– Titel, Meta-Tags direkt in Komponenten
- Laden von Assets— Suspense-Integration für Bilder und CSS
8. Wie gehen Sie mit Fehlern in React um?
// Error Boundary (class component, required for now)
class ErrorBoundary extends React.Component<
{ fallback: React.ReactNode; children: React.ReactNode },
{ hasError: boolean }
> {
state = { hasError: false };
static getDerivedStateFromError() {
return { hasError: true };
}
componentDidCatch(error: Error, info: React.ErrorInfo) {
logErrorToService(error, info);
}
render() {
if (this.state.hasError) return this.props.fallback;
return this.props.children;
}
}
// Usage
<ErrorBoundary fallback={<ErrorPage />}>
<UserProfile />
</ErrorBoundary>
// React 19: useErrorBoundary hook coming (use 'react-error-boundary' lib now)
React-Interview-Vorbereitung: Verstehen Sie die Hooks gründlich (insbesondere useEffect-Abhängigkeiten), wissen Sie, wann optimiert werden muss (React.memo + useCallback/useMemo), erläutern Sie die Aufteilung der Server-/Client-Komponenten und kennen Sie die aktuellen Statusverwaltungsoptionen. Erstellen Sie einige Produktions-Apps, um diese Konzepte erfahrungsmäßig und nicht nur theoretisch zu verstehen.
🔗 Share this article
✍️ Leave a Comment