· career · 8 min read
Common React Mistakes in FAANG Interviews and How to Avoid Them
A practical guide to the most frequent React mistakes candidates make in FAANG interviews - with concrete examples, fixes, and what interviewers are really evaluating.

Outcome first: read this and you’ll stop making the same React mistakes that sink otherwise strong candidates. You’ll learn what interviewers are actually testing, how to answer clearly, and how to propose pragmatic solutions during live coding or system-design moments. Expect concrete examples, short code snippets, and a checklist you can use before your next FAANG interview.
Why this matters
FAANG interviewers don’t just verify that you can write working React code. They look for reasoning: tradeoffs, maintainability, performance, and debugging skills. One small mistake can reveal gaps in fundamentals. But most mistakes are fixable-and fixable in interview time if you know what to look for.
Common technical mistakes and how to avoid them
1) Weak fundamentals: virtual DOM, reconciliation, rendering model
Mistake: Treating React as “just JSX” and not understanding when and why renders happen. Candidates often propose naive optimizations (e.g., memo everywhere) without explaining why renders occur.
How to avoid it:
- Explain what triggers renders: props, state, context changes.
- Mention reconciliation: React compares element trees to decide updates (React docs on reconciliation).
- Use that explanation to justify optimizations-only optimize when there’s measurable cost.
Short example explanation to give in an interview: “This component re-renders when its props change or when its parent re-renders; we should measure the render cost before memoizing because memoization has its own overhead.”
2) Misusing hooks: rules, dependencies, and stale closures
Mistake: Incorrect dependency arrays in useEffect/useCallback/useMemo; accessing stale state inside closures.
How to avoid it:
- Follow the Rules of Hooks. Always declare hooks at the top level.
- Include all necessary dependencies in dependency arrays. If you intentionally omit one, document and justify it.
- Prefer using functional updates when state depends on previous state to avoid stale closures.
Bad example:
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
const id = setInterval(() => setCount(count + 1), 1000); // uses stale `count`
return () => clearInterval(id);
}, []);
}Fix:
useEffect(() => {
const id = setInterval(() => setCount(c => c + 1), 1000); // functional update
return () => clearInterval(id);
}, []);Also show you know about ESLint plugin for hooks (explain that you use it to catch dependency mistakes).
3) Overusing memoization and premature optimization
Mistake: Wrapping every component in React.memo or memoizing everything with useCallback. This creates noise and can degrade performance.
How to avoid it:
- Measure first. Use React Profiler or simple console timing to identify expensive renders.
- Memoize only if:
- the component is heavy to render, or
- it prevents passing new function or object references downstream that cause large re-renders.
Interview answer framing: “I prefer to ship the simplest clear implementation, and only apply memoization when profiling shows it’s necessary. If I do memoize, I’ll document why and add tests to ensure behavior doesn’t regress.”
4) Bad key usage in lists
Mistake: Using array indexes as keys indiscriminately, leading to subtle UI bugs when items reorder.
How to avoid it:
- Use stable, unique IDs as keys.
- If items have no stable ID, accept the cost of re-creating DOM or provide one via a library or UUID when necessary.
Example to say in interview: “Using index as key causes element identity to change when items insert or reorder. That leads to lost input state - we should use item.id or a stable identifier.”
5) State design: too deep, derived, or scattered
Mistake: Keeping derived state in React state; over-lifting or under-lifting state causing prop drilling or unnecessary context.
How to avoid it:
- Keep minimal state: derive values during render when possible.
- Lift state up only as needed; prefer local state and callbacks otherwise.
- For global concerns, consider context or a state-management library, but explain tradeoffs.
Quick example: Bad:
const [filtered, setFiltered] = useState(items.filter(i => cond(i)));Better:
const filtered = useMemo(() => items.filter(i => cond(i)), [items, cond]);6) Putting side effects in render
Mistake: Running side effects during render (e.g., localStorage writes), or doing async work inside the render path.
How to avoid it:
- Use useEffect for side effects. Keep render pure and synchronous.
- If you must read from localStorage for initial state, do it lazily: useState(() => readFromLocalStorage()).
Interview phrasing: “Render should be pure. Side effects belong in useEffect so React can reason about render and side-effect lifecycles.”
7) Controlled vs uncontrolled inputs confusion
Mistake: Mixing controlled and uncontrolled inputs or not handling focus and selection when value changes.
How to avoid it:
- Decide whether an input is controlled (value driven by state) or uncontrolled (ref-based). Stick to one pattern for the component.
- If you change from uncontrolled to controlled, initialize correctly to avoid warnings.
8) Poor testing strategy
Mistake: Writing brittle implementation-dependent tests (shallow snapshots) or no tests for edge cases.
How to avoid it:
- Prefer testing behavior with React Testing Library over implementation details.
- Write unit tests for logic, and integration tests for components that coordinate behavior.
- Mock network and time deterministically when needed.
9) Accessibility (a11y) blind spots
Mistake: Ignoring keyboard navigation, ARIA roles, and semantic HTML.
How to avoid it:
- Use semantic HTML elements first (button, input, nav).
- Add ARIA only when semantics can’t express the role.
- Mention accessibility checks and linters you use (e.g., axe).
10) Not considering SSR, hydration and client/server mismatch
Mistake: Assuming client-only behaviors or running browser-only code during SSR causing hydration errors.
How to avoid it:
- Guard browser APIs (window, document) with checks or run effects only on client side.
- Use hydration-friendly patterns and prefer server-safe initial renders.
- Reference React SSR docs if asked (React DOM Server).
11) Concurrency, Suspense, and misunderstanding of async rendering
Mistake: Claiming Suspense solves all async problems or assuming setState is synchronous.
How to avoid it:
- Be honest about which features are stable and which are experimental (Suspense docs).
- Explain how concurrent rendering affects assumptions: renders can be paused or restarted, so avoid side effects during render.
Interview-behavior mistakes specific to FAANG
12) Not asking clarifying questions
Mistake: Diving into code without clarifying constraints (data sizes, expected performance, browser support).
How to avoid it:
- Ask about limits, expected traffic, latency constraints, and whether accessibility or SEO matters.
- Re-state the problem before coding.
13) Poor communication of tradeoffs
Mistake: Implementing one approach without discussing alternatives.
How to avoid it:
- Outline 2–3 possible solutions, list pros/cons, and pick one with justification.
- For example: local state vs context vs Redux - mention bundle size, onboarding cost, and testability.
14) Over-engineering during whiteboard or pair coding
Mistake: Building a fully-factored architecture when the interview asks for a simple component.
How to avoid it:
- Follow the YAGNI principle. Implement the MVP. Then discuss how you’d evolve it if requirements scale.
15) Not handling edge cases, error states, and loading states
Mistake: Showing only the happy path.
How to avoid it:
- Mention and implement loading, empty, and error states. Show awareness of how your component behaves in each.
Concrete mini-examples (what to say + what to code)
Example interview prompt: “Build a reusable search input that debounces user input and calls an API.”
What to say first:
- Clarify debounce latency, whether to cancel in-flight requests, and how to surface loading/errors.
- State tradeoffs: where to debounce (input component vs parent) and why.
Minimal, safe implementation sketch:
function useDebounced(value, delay) {
const [v, setV] = useState(value);
useEffect(() => {
const id = setTimeout(() => setV(value), delay);
return () => clearTimeout(id);
}, [value, delay]);
return v;
}
// In component
const term = useDebounced(inputValue, 300);
useEffect(() => {
if (!term) return;
let cancelled = false;
setLoading(true);
fetch(`/search?q=${encodeURIComponent(term)}`)
.then(r => r.json())
.then(data => {
if (!cancelled) setResults(data);
})
.catch(e => {
if (!cancelled) setError(e);
})
.finally(() => {
if (!cancelled) setLoading(false);
});
return () => {
cancelled = true;
};
}, [term]);Explain cancellation and why abort controllers or a cancelled flag is necessary.
What interviewers are really looking for
- Strong fundamentals: Understand rendering, reconciliation, and lifecycle. Link solutions to those fundamentals.
- Pragmatic tradeoffs: Prefer simple implementations; justify optimizations. Discuss cost vs benefit.
- Correctness and maintainability: Consider edge cases, accessibility, and tests.
- Debugging and observability: Describe how you’d profile and measure problems.
- Communication: Ask questions, explain choices, and show you can teach your approach.
The most important signal isn’t whether you know every React API. It’s whether you can reason clearly and justify pragmatic tradeoffs under uncertainty.
Quick checklist to run through before/during a React FAANG interview
- Ask clarifying questions about constraints and expectations.
- Re-state the problem and outline choices.
- Keep render pure; side effects in useEffect.
- Use hooks correctly; name dependencies and explain omissions.
- Don’t premature-optimize; profile first.
- Mention testing strategy and accessibility.
- Handle loading, error, and empty states.
- Consider SSR/hydration if relevant.
- Communicate tradeoffs and next steps.
Resources to cite during interviews or to prepare
- React official docs (getting started, hooks, reconciliation): https://reactjs.org/docs/getting-started.html
- Rules of Hooks and useEffect: https://reactjs.org/docs/hooks-rules.html, https://reactjs.org/docs/hooks-effect.html
- React Testing Library: https://testing-library.com/docs/react-testing-library/intro/
- React reconciliation: https://reactjs.org/docs/reconciliation.html
Final tip - how to close your answer in an interview
After implementing or describing your approach, close with a one-sentence summary and a next step: “This works for the current constraints; if we expect N users or frequent updates I’ll add X (profiling and memoization / pagination / server-side rendering). Which constraint should I prioritize?” Short. Focused. Shows you can iterate.
Say this and you move from coder to engineer. That is what interviewers at FAANG want to see.



