← Back to React

React Glossary

Key terms from the React course, linked to the lesson that introduces each one.

2,717 terms.

#

`exhaustive-deps`
Warns when dependency arrays in `useEffect`, `useCallback`, or `useMemo` might be missing dependencies
Lesson 1017What eslint-plugin-react-hooks DoesLesson 1018Installing and Configuring the Plugin
`isPending`
A boolean flag that's `true` while the action is in flight and `false` otherwise.
Lesson 1484The useActionState SignatureLesson 1792useMutation BasicsLesson 2303The isPending Flag for Loading States
`queryKey`
An array that uniquely identifies this query (like `['todos']` or `['user', userId]`)
Lesson 1770useQuery: The Basic Data Fetching HookLesson 1780Query Function Context and Signals
`ReactElement`
– Stricter, only accepts actual JSX elements (the result of `<Component />`).
Lesson 1145Type Safety with JSX PropsLesson 2342When to Use ReactNode vs ReactElement
`ReactNode`
– The broadest type, accepts anything React can render: JSX elements, strings, numbers, arrays, fragments, `null`, `undefined`, and booleans.
Lesson 1145Type Safety with JSX PropsLesson 2342When to Use ReactNode vs ReactElement
`rules-of-hooks`
Ensures hooks are only called at the top level, never conditionally or in loops, and only from React functions or custom hooks
Lesson 1017What eslint-plugin-react-hooks DoesLesson 1018Installing and Configuring the Plugin

A

Above-the-fold vs below-the-fold
content not immediately visible
Lesson 1358Lazy vs Eager: When Each is Right
Accordions
The accordion container manages which sections are open.
Lesson 1087When to Use This Pattern
Action creators
are simple functions that return action objects.
Lesson 765Action Creators: Functions That Return Actions
Action filtering and search
find specific mutations in large applications
Lesson 1703Developer Experience: DevTools and Time Travel
Action history
every state change logged with timestamps and payloads
Lesson 1703Developer Experience: DevTools and Time Travel
Action parity
If your loading state had a "Cancel" option, your error state should offer "Retry" or "Go Back.
Lesson 1320Loading-to-Error Transition Design
Action Permalinks
solve this by serializing the action's state into the URL, making the results shareable and bookmarkable.
Lesson 1490Action Permalinks
Actions are low-stakes
Liking a post, marking as read, simple toggles
Lesson 1802Pessimistic vs Optimistic: When to Choose
Add `memo`
Wrap the suspected component.
Lesson 930Profiling Before and After memo
Add a dev server
Configure `webpack-dev-server` for local development (no HMR by default!
Lesson 54Webpack from Scratch
Add items
Append a new object to the array
Lesson 1206Arrays in Form State
Add keys to fragments
When using `<Fragment>` in arrays, don't forget `<Fragment key={item.
Lesson 161Debugging Key-Related Issues
Adding items
Insert the new item into the cached array immediately (usually at the start or end).
Lesson 1798Optimistic Updates for Lists
Adds development-mode checks
for common mistakes (like mutating state)
Lesson 1731Creating a Store with configureStore
Adjusts
scroll calculations as it learns real sizes
Lesson 1281Dynamic Item Heights
Advanced easing
Hundreds of easing functions built-in
Lesson 2000Why GSAP for React: Imperative Animation Power
Advanced initialization
You might need to perform setup logic immediately when the element appears, without waiting for an effect.
Lesson 720The Ref Callback Pattern
Advantage
Deep nesting doesn't confuse intent — `header={.
Lesson 1150Composability Comparison: Nesting and Flexibility
After (Hooks)
Call a function, get values, use them directly in your component.
Lesson 284Render Props vs Hooks: The Modern Tradeoff
After fetch completes
Set `loading` to `false`, display the data
Lesson 569Managing Loading States
After form submission
refocus the input for another entry
Lesson 734Imperative Focus in Event Handlers
After hydration
`useEffect` runs, updates state to real width, triggers re-render with actual value
Lesson 1658The useEffect Solution Pattern
After lifting state down
to the form component, the parent no longer re-renders.
Lesson 2319Combining with React.memo for Maximum Effect
After optimization
Wrap your component with `React.
Lesson 932Profiling Before and After: Measuring memo's Impact
After recording
Add your `useMemo` or `useCallback`, then profile the same interaction again.
Lesson 2282Profiling Before and After Memoization
After refetch
`data` updates with fresh value, `isFetching` becomes `false`
Lesson 1781Stale-While-Revalidate Explained
Aliases
Shortcuts for import paths.
Lesson 42vite.config.js: Build Configuration
All components exported
from that file are Client Components
Lesson 1537The Module Boundary, Not Component Boundary
All of them simultaneously
when the Provider's value changes
Lesson 828The Scope of Consumer Re-renders
Allow it
by returning the proposed changes
Lesson 1181Common Use Cases: Preventing Transitions
Almost
Here's the trap: the number `0` is *falsy* in JavaScript, but React *renders numbers as text*.
Lesson 112The Zero Trap: 0 Renders Visibly
Almost never
But rare legitimate cases include:
Lesson 1035ESLint Override Comments: When and How
Already-optimized code
If you've memoized effectively and your renders are quick, transitions won't help.
Lesson 1469When Concurrent Features Don't Help
Alternative Patterns
For critical accessibility contexts, consider "Load More" buttons or pagination instead of virtualization—they're more accessible by default.
Lesson 1285Accessibility Considerations
Always in sync
No delay, no stale values
Lesson 653The Fix: Compute During Render
Analytics
Record when users perform actions
Lesson 769Meta Fields: Adding Timestamps, IDs, or Metadata
Analyze
Did the total render time meaningfully improve?
Lesson 930Profiling Before and After memo
Animation frame IDs
from `requestAnimationFrame`
Lesson 707Common Use Case: Counters and Flags
Animations
"is animating" flags, current frame numbers
Lesson 1685Temporary State: Counters, Timers, Animations
Another alternative—explicit props
Lesson 257When Children Becomes Too Magic
Another example
Form state with `firstName`, `lastName`, and `fullName` (derived from both).
Lesson 845When Not to Split: Tightly Coupled State
API endpoint issues
Environment variables that differ between dev and production
Lesson 47Previewing the Production Build
API routes
remain the right choice for **external integrations**—webhooks from third-party services (Stripe, GitHub), public APIs consumed by non-React clients (mobile apps, CLIs), or scheduled background jobs.
Lesson 1609When to Use Server Actions vs API Routes
App developers
typically always use Providers, so the default becomes just a TypeScript placeholder or `null`
Lesson 793Default Values vs Provider Values
App-level boundaries
caught a catastrophic failure.
Lesson 1316Contextual Error Messages by Location
App-level boundary
Wraps your whole app → shows full-page error with contact info
Lesson 1321Nested Boundary Fallback Strategies
App-specific state
that isn't shared across multiple applications.
Lesson 785When This Pattern Beats External State Libraries
Append-only lists
where you only add to the end
Lesson 162The Index-as-Key Pattern and Why It's Common
Applies correct ARIA attributes
Each trigger gets `role="tab"`, `aria-selected`, and `aria-controls` pointing to its matching content panel.
Lesson 1104Accessibility Built Into Compound Components
ARIA attributes
(`aria-*`) provide accessibility information to screen readers.
Lesson 99data-* and aria-* Attributes: The kebab-case Exceptions
array
of selected option values instead of a single string.
Lesson 460Multi-Select DropdownsLesson 486Multi-Select: value as Array
Array children with conventions
`<Dialog>{[title, content, actions]}</Dialog>` — fragile and requires documentation
Lesson 1120The Problem Slots Solve: Multiple Content Areas
Array with values
Effect runs when any listed value changes
Lesson 536What is the Dependency Array?
Arrays of specific types
Beyond simple primitives
Lesson 2381Typing useState: Explicit Type Arguments
Ask yourself
"Can I wrap the state update in `startTransition()`?
Lesson 1447useDeferredValue vs useTransition
Assemble everything
(executing and hydrating the app)
Lesson 1556The Traditional SPA Performance Problem
Asserting
that the original component tree renders again successfully
Lesson 2141Testing Reset Functionality
Astro
and **Fresh** implement this pattern.
Lesson 1650Islands Architecture: Partial Hydration
Async debugging
Record a slow interaction, export it, and analyze it later without time pressure
Lesson 2219Exporting and Sharing Profiler Data
Async-first patterns
With built-in Suspense integration, Jotai handles async atoms elegantly—no middleware required.
Lesson 1729When Jotai Fits: Bottom-Up State
Atom dependencies
Visualize which atoms depend on others (e.
Lesson 1728Jotai DevTools and Debugging
Atom labels
See atom names if you've added debug labels
Lesson 1728Jotai DevTools and Debugging
Attach
event listeners to make things interactive
Lesson 1647The Cost of Hydration: CPU and Time to Interactive
Attributes
Do props like `className`, `id`, and `data-*` match?
Lesson 1654How React Detects MismatchesLesson 2167Assertions with expect()
Auth + Settings
Checking authentication status while reading app preferences
Lesson 804Multiple Contexts in One Component
Auth Context
User data (medium stability)
Lesson 1692Multiple Contexts for Performance
Authenticated Dashboards
If users must log in first, there's no SEO benefit to server-rendering.
Lesson 1673CSR Trade-offs: Interactivity vs Initial Load
Authenticated, personalized flows
After a user logs in, you might need to fetch their preferences, shopping cart, or dashboard metrics—data that changes frequently based on their actions.
Lesson 1573Client-Side Data Fetching Still Exists
Authentication flow
Login, logout, session persistence
Lesson 2191Balance: Enough E2E Coverage Without Fragility
Authentication status
Nearly every component might need to know if a user is logged in
Lesson 810Context for Truly Global StateLesson 1690Context for Simple App-Wide State
Authentication walls everything
Users must log in before seeing anything meaningful (no SEO benefit)
Lesson 1652When to Skip SSR: SPAs and Hydration-Heavy Apps
Authentication wrappers
that check login status across multiple routes
Lesson 1838Pathless Routes for Shared Layouts
Auto-formatting
while typing (phone numbers, credit cards, currency)
Lesson 515Recognizing When Controlled is Still Better
Automatic `children` prop
typed as `ReactNode | undefined`, even if you don't need it
Lesson 2390What React.FC Is and Does
Automatic deduplication
If two components request the same data simultaneously, only one network request fires
Lesson 596Why Libraries Handle This BetterLesson 606TanStack Query's Automatic Caching and Deduplication
Automatic refetching
on window focus, intervals, or network reconnect
Lesson 1482When use() Fits vs TanStack Query or Loaders
Automatic request cancellation
When your query key changes, the old request is canceled without you writing cleanup logic
Lesson 596Why Libraries Handle This Better
automatically
with the DOM node when the element mounts, and with `null` when it unmounts.
Lesson 720The Ref Callback PatternLesson 1887File-System Routing Conventions
Automatically adds common middleware
(like `redux-thunk` for async actions)
Lesson 1731Creating a Store with configureStore
Avoid CSS repetition
by centralizing layout patterns
Lesson 194Layout Components: Composing Structure
Avoid over-splitting small routes
If `ChildA` and `ChildB` are tiny (a few KB each) and users typically visit both, the overhead of multiple network requests outweighs the savings.
Lesson 1398Nested Route Splitting Strategies
Avoid prop drilling
through intermediate components
Lesson 779The Provider Component Pattern
Avoiding context complexity
You've outgrown Context but don't want Redux boilerplate.
Lesson 1729When Jotai Fits: Bottom-Up State
Avoiding typos
Because action types are plain strings, a typo like `"TOGGLE_COMPLET"` would silently fail (hitting your default case).
Lesson 767Naming Action Types: SCREAMING_SNAKE_CASE
Avoids brittle module mocks
MSW mocks at the network boundary, not the module level.
Lesson 2085Why MSW Over Manual Mocks

B

Babel
is a *transpiler*—it converts modern JavaScript (including JSX) into older JavaScript that all browsers understand.
Lesson 54Webpack from ScratchLesson 79The Role of Babel and Modern Transpilers
Backend sharing
Use the same schema on server and client
Lesson 1225Schema Validation with Zod Resolver
Background Refetching
Cached data can be shown immediately while a background fetch updates it, giving users instant feedback without stale data problems.
Lesson 606TanStack Query's Automatic Caching and DeduplicationLesson 1768TanStack Query: What Problem Does It Solve?
Balance
Is the size difference between your main bundle and lazy chunks meaningful, or are they all roughly equal?
Lesson 1418Analyzing Code-Split Chunk SizesLesson 1783The cacheTime Configuration
Bar width
Represents render duration (wider = slower)
Lesson 71Reading Profiler Flamegraphs
Base typography
(default fonts, sizes, line-height)
Lesson 1927Global Styles and CSS Reset
Baseline first
Record a profile of the slow interaction
Lesson 2247Profiling to Confirm the Problem
Basic Auth Check Pattern
uses a simple wrapper component that sits between your route and the actual content.
Lesson 1867Basic Auth Check Pattern
Battery constraints
where excessive JavaScript execution drains power
Lesson 33Performance-Critical Mobile Web Apps
Before (Render Props)
Nest components, pass functions, manage JSX structure.
Lesson 284Render Props vs Hooks: The Modern Tradeoff
Before and after values
so you can see if they're referentially different but structurally identical
Lesson 2234Reading the Console Output
Before optimization
Open React DevTools, switch to the Profiler tab, start recording, and trigger the interaction that causes your parent component to re-render.
Lesson 932Profiling Before and After: Measuring memo's ImpactLesson 2319Combining with React.memo for Maximum Effect
Before recording
Profile your component's render behavior without memoization.
Lesson 2282Profiling Before and After Memoization
Before Server Components
, you'd write an API route, then fetch from it in your component.
Lesson 1551Data Flow: Server Components Have Direct Backend Access
Before the animation starts
(not during)
Lesson 2019will-change CSS Property
Before the mutation runs
save the current cache state as a snapshot
Lesson 1795Optimistic Updates: The Pattern
Before/after comparisons
Export a baseline before optimization, then compare it with a post-fix profile
Lesson 2219Exporting and Sharing Profiler Data
Behavior flags
`preventScroll`, `closeOnSelect`
Lesson 1170Prop Getter Arguments: Customization Points
Behind interactions
Modals, tooltips, or charts that appear on-demand.
Lesson 1424Component-Level Splitting: When It Helps
Best for
Small projects (under 20 components), prototypes, or teams just learning React.
Lesson 59Flat vs Nested: When Each Structure Fits
Better alternatives
The standard Profiler workflow—recording interactions and filtering by commit duration—proved sufficient for most debugging
Lesson 2217Using the Interactions Tab (Legacy)
Better autocomplete
IDEs can provide better suggestions with a stable object
Lesson 2044The screen Object: Your Query Gateway
Better composition
One Suspense boundary can coordinate loading states for *multiple* child components automatically.
Lesson 1343Suspense vs Traditional Loading States
Better deletions
Delete the folder, and all related code goes with it
Lesson 209Colocating Tests and Styles with Components
Better DX
No repetitive null checks in child components
Lesson 1094Type-Safe Context for Compound Components
Better for performance
No unnecessary re-renders in unrelated components
Lesson 1680The Local-First Principle
Better mobile experience
Critical on slower connections
Lesson 1384What Code Splitting Is and Why It Matters
Better Names
`useAppState()` is more descriptive than `useContext(AppStateContext)`.
Lesson 780Custom Hooks for Consuming State and Dispatch
Better organization
Related logic stays together
Lesson 532Multiple Effects in One Component
Better security
Secrets stay server-side automatically
Lesson 1551Data Flow: Server Components Have Direct Backend Access
Better solutions
you already know: move objects outside the component, use `useMemo`, or destructure only the specific properties you need into the dependency array.
Lesson 639JSON.stringify as a Last Resort
Better way
You call ahead while driving.
Lesson 643The Waterfall Problem
Black box testing
treats your React component the same way—you only test what goes *in* (inputs) and what comes *out* (outputs), ignoring the internal mechanics.
Lesson 2036The Mental Model: Black Box Testing
Block specific tab switches
when validation fails
Lesson 1181Common Use Cases: Preventing Transitions
Blocked main thread
means the UI can't respond to user input during the flush
Lesson 447The Performance Cost of flushSync
Blog post archives
(year-by-year lists that don't change)
Lesson 1257Index Keys in Read-Only Lists
Blogs
Posts don't change after publishing (or change rarely enough that rebuilding is acceptable)
Lesson 1677SSG Trade-offs: Speed vs Freshness
Boilerplate that feels tedious
to rewrite each time
Lesson 997The Signal: When Logic is Repeated Across Components
Boolean logic
`const isValid = age >= 18 && hasPermission`
Lesson 906When Simple Values Don't Need useMemo
Border or background
Visual "busy" state
Lesson 1446Visual Feedback During Deferral
Borders
`rounded-lg border-2 border-blue-700`
Lesson 1915Composing Utilities for Complex Styles
Bottom (Wide)
Unit tests — many, fast, isolated tests of individual functions and components
Lesson 2182The Testing Pyramid: Unit, Integration, E2E
brand new reference
on every render—even if the contents are identical.
Lesson 636Moving Objects Outside the ComponentLesson 2235Detecting New Object/Function References
Brittle structure
Changing the component tree means updating multiple prop definitions
Lesson 266What is Prop Drilling?
Broken animations
(elements appear to "restart")
Lesson 1245Why Keys Must Be Stable Across Renders
Broken imports
Sometimes relative paths work in dev but fail in production
Lesson 47Previewing the Production Build
Browser API inconsistencies
(localStorage behaves differently in private mode)
Lesson 2187E2E for Cross-Browser and Device Testing
Browser Paint
You actually paint the walls
Lesson 348The Re-render Lifecycle Flow
Browser-only APIs
Checking `window.
Lesson 1653What is a Hydration Mismatch?
Browser-only Web APIs
`IntersectionObserver`, `ResizeObserver`, `MediaRecorder`
Lesson 1623When You MUST Use Client: Browser APIs
Budget devices
where JavaScript parse time is already high
Lesson 925Bundle Size Impact
Bug fixes
needing the same change in 4+ locations
Lesson 997The Signal: When Logic is Repeated Across Components
Bug Reproduction
A user reports a bug but can't explain the steps.
Lesson 1744Time-Travel Debugging and Audit Requirements
Bugs hide less easily
because dependencies are declared up front
Lesson 16Explicit Over Implicit
Bugsnag
all follow similar integration patterns—they plug into your error boundaries via `componentDidCatch` or provide library wrappers.
Lesson 1333Error Tracking with LogRocket and Other Services
Build failures
before deployment if hook rules are broken
Lesson 1017What eslint-plugin-react-hooks Does
Build Logs
The compiler can log which components it optimized and which it skipped.
Lesson 1510Debugging Compiler Output
Build optimization
Tools know to process only `src/` contents during development
Lesson 61The src Folder Convention
Build options
Control how your production bundle is created—output directory, minification settings, and chunk splitting strategies
Lesson 42vite.config.js: Build Configuration
Building React itself
React's internal code doesn't always follow its own public rules because it manages the hook registry directly
Lesson 1040Library Authors: When You Actually Need Overrides
Building URLs or paths
`{`/users/${userId}/profile`}`
Lesson 87Template Literals Inside JSX
Built-in accessibility
`disabled` attribute prevents keyboard submission too
Lesson 1494Building Disabled Submit Buttons
Built-in loading/error states
No manual `useState` for every fetch
Lesson 596Why Libraries Handle This Better
Built-in reporters
Beautiful HTML reports showing exactly what happened
Lesson 2161Why Playwright is the Modern E2E Choice
Built-in validation hooks
(sync and async)
Lesson 1228Why Formik Was Popular
Bundle size
The entire CSS-in-JS library ships to every user (~15-30 KB for styled-components, ~8-15 KB for Emotion).
Lesson 1931Performance Tradeoffs: Runtime Style InjectionLesson 1952The Shift to Zero-Runtime Solutions
Bundle size increase
(React Window is small, but still adds ~10-15KB)
Lesson 2301When Virtualization Isn't Worth It
Bundle splitting
Stores can be lazy-loaded with their features
Lesson 1717Multiple Stores and When to Split
Bundles
multiple files into fewer chunks
Lesson 46Building for Production
Button clicks
trigger synchronous, high-priority updates
Lesson 1456User Input Priority: Clicks, Typing, and Immediate Feedback

C

Cache lookups
TanStack Query matches keys to find cached data
Lesson 1771Query Keys: The Cache Identifier
Cache misses
When dependencies change, React does the calculation *and* the comparison
Lesson 872The Cost of Memoization Itself
Cache responses
by endpoint + arguments
Lesson 1738RTK Query: Declarative Data Fetching
Caching by Key
The first fetch runs, and the response gets cached under that key.
Lesson 606TanStack Query's Automatic Caching and Deduplication
Calculate visible range
Determine which items are in or near the viewport based on scroll position and item height
Lesson 1276What Virtualization Is: Render Only Visible Items
Calendars
Rows are weeks, columns are days—only visible weeks render.
Lesson 2299Virtualized Grids and Multi-Column Layouts
Call `mockReturnValue()`
before each render to set what the hook returns
Lesson 2080Mocking Custom Hooks
Call external APIs
(third-party widgets, data fetchers)
Lesson 1311Component-Level Boundaries for Risky Code
Call location
Are hooks inside conditionals, loops, or after early returns?
Lesson 1019The rules-of-hooks Rule
Call Order Invariant
the sequence of hook calls must never change between renders.
Lesson 1010The Call Order Invariant
Call that function
directly from the event handler
Lesson 662Refactoring: From Effect to Direct Call
Callback functions
in `useCallback` that have no specific identity requirements
Lesson 1509Migration Strategy: Removing Manual Memoization
Callbacks
that reference state but don't depend on it reactively
Lesson 1713Reading State Without Subscribing
Calling context
Are hooks called from regular JavaScript functions instead of components or custom hooks?
Lesson 1019The rules-of-hooks Rule
Calls that function
with any data it wants to share
Lesson 1043Basic Render Prop Syntax
Calls your component function
(like `function Counter() { .
Lesson 406What Happens During the Render Phase
Cancel outdated requests
when new ones start (no ignore flags needed)
Lesson 587Why Modern Libraries Solve This Automatically
Canceling in-flight requests
when users navigate away
Lesson 1746Middleware-Heavy Workflows: Sagas, Observables, Complex Async
Cascading patterns
A parent component with many wide children suggests a rendering cascade where updates flow through multiple layers unnecessarily.
Lesson 2223Reading the Profiler Flamegraph
Cascading renders
Did fewer child components render because their parent was memoized?
Lesson 2278Using React DevTools Profiler with Memoization
Catch duplicate dependencies
Sometimes the same library appears in multiple chunks at different versions—a sign of dependency misalignment.
Lesson 1402Route-Based Bundle Analysis
Cause
Check if dependencies are objects created inline or passed down without memoization themselves.
Lesson 879The Object Dependency Problem
Centralize configuration
Set defaults once instead of repeating them
Lesson 993Composing Third-Party Hooks
Centralized form state
without manual `useState` for each field
Lesson 1228Why Formik Was Popular
Change layout globally
by editing one component
Lesson 194Layout Components: Composing Structure
Character counters
or length restrictions displayed in real-time
Lesson 515Recognizing When Controlled is Still Better
Check the "why"
Use the "why did this render" setting to confirm object references changed
Lesson 2247Profiling to Confirm the Problem
Check the flame graph
Look for components that rendered but didn't need to
Lesson 2251Measuring Context-Induced Re-renders
Check the React DevTools
component tree to see which component rendered that node
Lesson 1661Debugging Hydration Errors
Check third-party imports
Libraries using hooks need `'use client'` wrappers
Lesson 1545Debugging Boundary Violations
Check uniqueness
Ensure every key is different from its siblings.
Lesson 161Debugging Key-Related IssuesLesson 1274Debugging Key-Related Issues
Children consume automatically
`<Dialog.
Lesson 1101Context-Based State Sharing in Radix
Chrome/Edge
Visit the Chrome Web Store and search for "React Developer Tools"
Lesson 2207Installing and Opening the React DevTools Profiler
Chromium, Firefox, and WebKit
(Safari's engine).
Lesson 2161Why Playwright is the Modern E2E Choice
Chunk size
Prefetching a 5KB component is cheap.
Lesson 1410The Prefetch/Import Timing Tradeoff
Chunk Sizes
At the top level, you'll see your main chunks — `main.
Lesson 1413Reading a Bundle Analysis ReportLesson 1418Analyzing Code-Split Chunk Sizes
CI integration
Some teams record profiles in automated performance tests and store them as artifacts
Lesson 2219Exporting and Sharing Profiler Data
Circular references break it
Nested objects cause runtime errors
Lesson 639JSON.stringify as a Last Resort
class components
mixed with modern hooks-based code—or entire codebases written before 2019 when hooks were introduced.
Lesson 324Legacy Codebases: Reading Old React CodeLesson 325Third-Party Libraries with Class APIs
Class lifecycle mental model
Lesson 315The Mental Model Shift
Clean up properly
when components unmount
Lesson 587Why Modern Libraries Solve This Automatically
Cleaner components
Less noise from optimization hooks means easier-to-read code
Lesson 1513Long-Term Impact on React Development
Cleaner diffs
Adding queries doesn't change the `render()` line
Lesson 2044The screen Object: Your Query Gateway
Cleaner URLs
`/dashboard` is simpler than `/dashboard/home`
Lesson 1836Index Routes: Default Child Content
cleanup function
is an optional function you can return from a `useEffect`.
Lesson 550What Cleanup Functions AreLesson 592The Complete Abort Pattern in One Example
Cleanup logic
(aborting requests, preventing state updates after unmount)
Lesson 605The Problem with Manual useEffect Data FetchingLesson 720The Ref Callback Pattern
Clear boundaries
Configuration stays separate from application logic
Lesson 61The src Folder Convention
Clear Error Messages
If someone tries using the hook outside the Provider, they get a helpful error immediately, not `undefined` mysteriously breaking later.
Lesson 780Custom Hooks for Consuming State and Dispatch
Clear intent
(developers reading your code understand the structure)
Lesson 1079Named Children vs Generic Children
Clear naming
`header` immediately tells you where content goes
Lesson 1130Props as Slots: The Basic Pattern
Clearer ownership
You instantly see what belongs to what
Lesson 209Colocating Tests and Styles with Components
Clears the error state
inside the boundary
Lesson 1324The resetErrorBoundary Function
Click a component
and examine "Why did this render?
Lesson 2251Measuring Context-Induced Re-renders
Click the circle again
to stop recording
Lesson 70Profiler Tab: Recording Performance Sessions
Clicking an element
triggers `mousedown`, `focus` (if focusable), `mouseup`, `click`—and `blur` on the previously focused element
Lesson 2072Testing Focus Behavior with user-event
Client Component (the button)
The ordering mechanism needs JavaScript because it responds to your clicks.
Lesson 1559Zero JavaScript for Static Content
Client Components
Full component code plus the React runtime to execute them.
Lesson 1534What 'No JS' Really Means: The Nuance
Client first render (hydration)
Also sees `width === null`, outputs "Loading width.
Lesson 1658The useEffect Solution Pattern
Client state
is fundamentally different:
Lesson 1704Server State vs Client State Separation
Client-only applications
If you're not doing SSR or using Server Components—think admin panels, electron apps, or SPAs —many downsides disappear.
Lesson 1955When Runtime CSS-in-JS Still Makes Sense
Client-side rendering
is ordering ingredients delivered to your home—you cook the meal yourself.
Lesson 1630What Server-Side Rendering Actually Means
Closure creation
Even when returning a cached value, JavaScript still creates the wrapper function on each render.
Lesson 905The Cost of Memoization Itself
CLS (Cumulative Layout Shift)
Visual stability
Lesson 2258Core Web Vitals: LCP, FID, CLS
Co-locating
means keeping multiple components in the same file.
Lesson 202Co-locating Helper Components
Co-location
means placing your context provider as close as possible to the subtree that actually needs it.
Lesson 841Co-locating Context with Its Consumers
Coarse boundaries
(route-level) mean fewer loading states but longer waits.
Lesson 1340Suspense Boundaries: Where to Place Them
Code clutter
Your test file now contains potentially hundreds of lines of HTML strings.
Lesson 2158Inline Snapshots vs External Files
Code generation tools
that produce valid hook code ESLint can't analyze
Lesson 1035ESLint Override Comments: When and How
Code organization
Easier to locate and maintain domain logic
Lesson 1717Multiple Stores and When to Split
Code reusability
Define once, use everywhere.
Lesson 1973Variants: Named Animation States
Code reuse
shared layouts without duplication
Lesson 1831What Nested Routes Are and Why They Matter
Code reviews easier
everyone knows what they're looking at
Lesson 204Avoiding Anonymous Function Exports
Code search is reliable
(searching for "Button" finds all uses)
Lesson 199Named Exports vs Default Exports
Code split
Move non-critical code behind `React.
Lesson 1421Bundle Budget Strategy: Setting Thresholds
Codegen
Record interactions and generate test code automatically
Lesson 2161Why Playwright is the Modern E2E Choice
Coexist during transition
Both systems can run simultaneously—keep your ThemeProvider wrapping the app while gradually removing styled components from the tree.
Lesson 1956Migration Strategies from Runtime to Zero-Runtime
Cognitive overhead
Readers must understand *why* something is memoized
Lesson 2283The Trap of Memoizing Everything
Cognitive overload
Developers spend more time reading docs than building
Lesson 1165The Problem: Too Many Individual Props
Collaboration improves
teammates can work on different components without file conflicts
Lesson 206One Component Per File Convention
Collaborative tools
where others might change data
Lesson 1807Automatic Revalidation Strategies
color intensity
(yellow to orange) also reflects render duration, with brighter colors indicating more time spent.
Lesson 2223Reading the Profiler FlamegraphLesson 2269Reading Profiler Flamegraphs
Color-coded flame graphs
gray means fast, yellow/red means slow
Lesson 70Profiler Tab: Recording Performance Sessions
Combinations
Show `banner` when both `isLoggedIn` and `hasBanner` are true
Lesson 1143Conditional Rendering of Prop Content
Combines reducers
for you if you pass multiple
Lesson 1731Creating a Store with configureStore
Combining multiple variables
`{`Hello ${firstName} ${lastName}!
Lesson 87Template Literals Inside JSX
Commit duration
Did the overall update become faster?
Lesson 2282Profiling Before and After Memoization
Committing
Only if something changed does the director actually use the new footage
Lesson 411Render Does Not Mean DOM Update
Common data flows down
Parent route fetches user data, children display different aspects
Lesson 1842When to Nest vs Flatten Routes
Common providers
(theme, data context) for specific sections
Lesson 1838Pathless Routes for Shared Layouts
Common transformations
on values before returning them
Lesson 992Extracting Shared Logic from Multiple Custom Hooks
Common vocabulary
across the team ("dispatch an action" means the same thing to everyone)
Lesson 1705Team Collaboration and Predictable Patterns
Community Resources
Stuck on a problem?
Lesson 30Ecosystem Size as a Decision Factor
Compare
every dependency in the array (using `Object.
Lesson 889The Cost-Benefit Analysis of useMemo
Compare the dependency array
On every render, React checks if dependencies changed
Lesson 872The Cost of Memoization Itself
Compare to limits
you've defined (e.
Lesson 1420Measuring Bundle Size in CI
Compares this new tree
to the previous one to figure out what changed
Lesson 406What Happens During the Render Phase
Comparing
The director checks if this take differs from the last one
Lesson 411Render Does Not Mean DOM Update
Comparison overhead
React compares every item in your dependency array using `Object.
Lesson 905The Cost of Memoization ItselfLesson 2283The Trap of Memoizing Everything
Comparison work
On every render, React compares the new dependencies to the old ones
Lesson 873Memoization is Not Free
Compile-time safety
TypeScript knows the exact shape of your context
Lesson 1094Type-Safe Context for Compound Components
complete control
over JSX layout while Formik handles state management behind the scenes.
Lesson 1231The <Formik> Component and Render PropsLesson 2393Typing Props Without React.FC
Complete state tree visualization
see your entire application state in a structured, explorable tree
Lesson 1703Developer Experience: DevTools and Time Travel
Complex
Heavy logic or third-party integrations that might fail
Lesson 1310Feature-Level Boundaries
Complex animations
expose progress, phase, or interpolated values
Lesson 1063Render Props for Complex InteractionsLesson 2019will-change CSS Property
Complex Boolean Expressions
When your condition itself requires multiple checks:
Lesson 125When Simple Conditionals Break Down
Complex child hierarchies
Deep nesting means more measurements
Lesson 1987Layout Animation Performance
Complex computations
`<Card average={scores.
Lesson 220Passing Variables and Expressions
Complex conditions
where nested ternaries become unreadable
Lesson 129Immediately Invoked Function Expressions (IIFEs) in JSX
Complex data visualization
Updating a chart with thousands of data points while the user adjusts slider controls.
Lesson 1461Priority in Practice: When You Feel the Difference
Complex data-fetching hooks
with intricate retry logic, authentication, or caching
Lesson 2133Mocking Custom Hooks: When It's Justified
Complex dependencies
that are slow or unpredictable
Lesson 2075Why Module Mocking is Necessary in Tests
Complex middleware needs
Logging, persistence, time-travel debugging
Lesson 816Context vs State Management Libraries
Complex object shapes
You want to enforce a specific structure
Lesson 2381Typing useState: Explicit Type Arguments
Complex relational data
that benefits from Apollo's normalized cache (updating one entity updates it everywhere)
Lesson 1830When Apollo Fits vs TanStack Query
Complex rules
Cross-field validation becomes trivial in Zod
Lesson 1225Schema Validation with Zod Resolver
Complex search params
Built-in validation and parsing beats manual `useSearchParams` parsing
Lesson 1885When TanStack Router Fits vs React Router
Complex selector logic
just to avoid re-renders
Lesson 2328When to Move to External State
Complex UI
where multiple similar elements exist but differ only by position or context
Lesson 2064getByTestId: The Escape Hatch
Complex UI updates
Each keystroke animates visualizations, filters large lists, or triggers layout recalculations.
Lesson 1197Performance Implications: Re-renders on Every Keystroke
Compliance Auditing
For financial, healthcare, or legal applications, you may need to prove *exactly* what happened and when.
Lesson 1744Time-Travel Debugging and Audit Requirements
Component begins rendering
and realizes it needs data that isn't available yet
Lesson 1339How Suspense Detects 'Not Ready'
Component Details
panel displays render count for each component
Lesson 2270Measuring Render Count vs Render Time
Component re-renders
React executes your component function again with the new state value
Lesson 467The setState → Re-render → DOM Update FlowLesson 1737Dispatching Actions with useDispatch
Component state
Show `errorMessage` prop only when `hasError` is true
Lesson 1143Conditional Rendering of Prop Content
Component testing
Test React components in isolation (bridging unit and E2E testing)
Lesson 2161Why Playwright is the Modern E2E Choice
Component tries again
if ready, renders normally; if not, throws again
Lesson 1339How Suspense Detects 'Not Ready'
Component-level
is for truly independent widgets that don't distract when loading separately.
Lesson 1383Suspense Boundary Placement Patterns
Component-level boundary
Wraps a comment widget → shows "Comments unavailable" inline
Lesson 1321Nested Boundary Fallback Strategies
Component-specific props
(className, style) if the library accepts them
Lesson 1909Common Pitfalls
Component-specific state orchestration
that doesn't repeat elsewhere should stay put.
Lesson 1000When Single-Component Logic Should Stay Inline
Components should be reusable
props make components portable and testable
Lesson 808Context vs Props: Choosing the Right Tool
Components using useContext re-render
when the Provider's value changes
Lesson 799useContext Hook Syntax
Compose complex layouts
from simple, reusable pieces
Lesson 194Layout Components: Composing Structure
composite key
combines the parent's identifier with the child's identifier to guarantee uniqueness across the entire nested structure.
Lesson 1249Composite Keys for Nested ListsLesson 1261Composite Keys for Nested Lists
Compositor activity
Green blocks show GPU work on `transform`/`opacity`—these are good!
Lesson 2021Measuring Frame Rate with DevTools
compound components
solve the same fundamental problem: allowing flexible composition of multiple content areas.
Lesson 1128Slots vs Compound Components: Design TradeoffsLesson 1153What is Inversion of Control in React?
Compute during render instead
React is designed to handle this:
Lesson 693When Computation Happens: Render vs Effect Timing
Computed totals
If you have prices in state, the sum is derived
Lesson 663What is Derived State?
Concurrent Features
React 18's architecture changes made the interaction-tracking model obsolete
Lesson 2217Using the Interactions Tab (Legacy)
Condition becomes false
(`show = false`)
Lesson 1980The exit Prop and Unmount Timing
Conditional context reading
You only need context in certain branches
Lesson 1476use() with Context: An Alternative to useContext
Conditional logic
Only render `<Navigate>` after you're certain auth has resolved
Lesson 1874Common Pitfalls: Redirect Loops and FlashLesson 2293Dynamic Imports Without Suspense
Conditional rendering
Don't render the element at all using `&&`, ternaries, or early returns
Lesson 139Style-Based Hiding vs Conditional RenderingLesson 363Unmounting Destroys State
Conditional rendering logic
If a `UserProfile` should only show an "Edit" button when `isOwner={true}`, verify that button appears in one case and is absent in the other.
Lesson 2184Unit Tests for Component Logic
Conditional routing
Based on user permissions or data, route to different destinations
Lesson 1856Programmatic Navigation with useNavigate
Conditional UI changes
based on input values (show/hide fields, enable/disable buttons)
Lesson 515Recognizing When Controlled is Still Better
Conditional UI feedback
Lesson 1486The Pending State
Conditionally rendered
A rich text editor loaded only when the user clicks "Edit.
Lesson 1424Component-Level Splitting: When It Helps
Conditionals might skip hooks
breaking the call order invariant
Lesson 1014Top-Level Only: Function Scope Requirements
Configure a `codegen.yml` file
Point it at your schema and operation files
Lesson 1829Apollo Client with TypeScript
Configure Babel
Set up `.
Lesson 54Webpack from Scratch
Confirm optimizations work
After using `React.
Lesson 414Console Logs and Render Counting
Confirmation codes
Highlight tokens for easy copying
Lesson 497Imperatively Selecting Text
Confusion about defaults
When users ask "what's the recommended way?
Lesson 1163When Inversion Becomes Over-Engineering
Consider native browser APIs
Modern browsers support many features (like date formatting with `Intl`) that previously required libraries
Lesson 1417Finding Unexpectedly Large Dependencies
Consistent checks
Use the same auth source everywhere (don't mix server state with stale client state)
Lesson 1874Common Pitfalls: Redirect Loops and Flash
Console warnings
The browser console shows `Warning: Each child in a list should have a unique "key" prop` or `Warning: Encountered two children with the same key`.
Lesson 161Debugging Key-Related IssuesLesson 1274Debugging Key-Related Issues
Consumer
is how components originally accessed that value (before hooks).
Lesson 789The Context Object Structure
Consumes the context
using your custom hook (the one that enforces context usage)
Lesson 1112Creating Named Child Components
Contain complex business logic
(calculations, data transformations, state machines)
Lesson 2102When to Test Hooks vs Components
container
is like the chef who handles all the recipe logic, ingredient prep, and cooking decisions.
Lesson 191Container and Presentational ComponentsLesson 1376What Suspense Boundaries ContainLesson 2043The render Function from RTL
Content existence
Display `footer` only if it was actually passed
Lesson 1143Conditional Rendering of Prop Content
Content flashing
occurs when protected content briefly appears before the auth check completes and redirects the user away.
Lesson 1874Common Pitfalls: Redirect Loops and Flash
Content needs parent callbacks
Injected UI needs to trigger parent actions
Lesson 1149When Render Props Win: Dynamic Behavior
Content-heavy blog
180kb → 90kb (50% reduction)
Lesson 1533The Bundle Size Win: Real Numbers
Context + useReducer
(which you've already learned) provides 80% of what Redux offers without external dependencies.
Lesson 816Context vs State Management Libraries
Context file
(`UserContext.
Lesson 796Organizing Context Files
Context helps
but struggles at scale—updating context re-renders all consumers, even if they only need part of the state.
Lesson 1700The Problem of Shared State Across Distant Components
Context provider
wrapping `children` to share state downward
Lesson 1109Creating the Parent Component Shell
Context-aware animations
Scopes animations to components properly
Lesson 2001Installing GSAP and Basic Setup in React
Context's limit
No built-in selectors means you can't subscribe to part of an object without re-rendering.
Lesson 1718Zustand vs Context vs Redux: The Tradeoffs
Contextual state
parent routes can provide context to all children
Lesson 1831What Nested Routes Are and Why They Matter
Continues rendering
other parts of the page
Lesson 1665Suspense Boundaries Enable Streaming
Control maximum values
in counters or sliders
Lesson 1181Common Use Cases: Preventing Transitions
Control the entire sequence
as one unit (pause, reverse, seek to 50%)
Lesson 2012GSAP for Complex Timeline Animations
Controlled approach
5 full form re-renders × 20 fields = 100+ component renders
Lesson 1227Performance Comparison: RHF vs Controlled
controlled components
, React state is the single source of truth—every keystroke updates state, which updates the input.
Lesson 490What Are Uncontrolled Components?Lesson 515Recognizing When Controlled is Still BetterLesson 1157The Controlled vs Uncontrolled Pattern Generalized
Controlled components everywhere
Write class components with tons of `this.
Lesson 1228Why Formik Was Popular
Controlled props
invert this control: instead of your component managing state internally, it accepts the current state (`value`) and a callback to request changes (`onChange`) from its parent.
Lesson 1156Exposing Internal State via Controlled Props
Convention as communication
It signals "this is an action type constant" to other developers.
Lesson 767Naming Action Types: SCREAMING_SNAKE_CASE
Convert theme tokens separately
Extract your theme object into CSS variables or vanilla-extract theme contracts before touching component styles.
Lesson 1956Migration Strategies from Runtime to Zero-Runtime
Core business transactions
Checkout, payment, order confirmation
Lesson 2191Balance: Enough E2E Coverage Without Fragility
Core functionality
The main feature your app is built around (e.
Lesson 2183E2E Tests Cover Critical User Journeys
Core Web Vitals
are three standardized metrics that capture the moments users care about most:
Lesson 2258Core Web Vitals: LCP, FID, CLS
Corporate projects
that haven't migrated yet
Lesson 49Create React App: The Legacy Standard
Counters
Click counts, step numbers in a wizard
Lesson 1685Temporary State: Counters, Timers, Animations
Coupling
Middle components become tightly coupled to the needs of distant children
Lesson 266What is Prop Drilling?
CPU usage
(no hydration work for static content)
Lesson 1650Islands Architecture: Partial Hydration
Create `webpack.config.js`
Tell Webpack where your entry file is, where to output bundles, and how to handle different file types
Lesson 54Webpack from Scratch
Create adapter components
Build intermediate wrapper components that accept the same props as your styled-components but render using your new approach.
Lesson 1956Migration Strategies from Runtime to Zero-Runtime
Create closures
Capture variables in a new function scope
Lesson 905The Cost of Memoization Itself
Create domain language
`useCurrentUser()` is clearer than raw query logic
Lesson 993Composing Third-Party Hooks
Create React App
was React's official starter toolkit.
Lesson 49Create React App: The Legacy Standard
Create separate contexts
One for fast-changing data, another for slow-changing data
Lesson 2253Splitting Context by Update Frequency
Creating base styles
for elements you don't control (like markdown content)
Lesson 1919The @apply Directive: When and Why
Creating dev tools
Testing utilities that inspect or mock hook behavior need to break rules in controlled environments
Lesson 1040Library Authors: When You Actually Need Overrides
Critical
Generate the ID when you *create* the data item, not every time you render.
Lesson 168Better Alternatives: Generating Stable IDs
Critical for first render
anything blocking initial content
Lesson 1358Lazy vs Eager: When Each is Right
Critical path boundaries
(like checkout flows) need urgent language: "Payment processing unavailable—please contact support" rather than a generic error.
Lesson 1316Contextual Error Messages by Location
critical user journeys
the complete workflows that represent your application's core value.
Lesson 2183E2E Tests Cover Critical User JourneysLesson 2191Balance: Enough E2E Coverage Without Fragility
Critical vs Non-Critical
Don't wrap critical UI (navigation, layout) in the same boundary as experimental features.
Lesson 1307Error Boundary Placement Strategy
Cross-Site Scripting (XSS)
attacks, where malicious scripts steal data or hijack user sessions.
Lesson 100dangerouslySetInnerHTML: XSS Protection by Design
CSR
You cook from scratch (slower start, but then you control every ingredient instantly)
Lesson 1673CSR Trade-offs: Interactivity vs Initial LoadLesson 1679Decision Matrix: Choosing the Right Rendering Strategy
CSS layouts
where extra wrappers break your grid or flexbox
Lesson 107When Fragments Need the key Prop
CSS resets
(normalize browser inconsistencies)
Lesson 1927Global Styles and CSS Reset
CSS variables
(custom properties) technically work for *reading* values, but you can't define them inline in a way that cascades to children effectively.
Lesson 1897What You Can't Do with Inline StylesLesson 1946CSS Variables vs CSS-in-JS for Theming
CSS-in-JS
adds ~15KB of runtime library code, but only generates the styles you actually render.
Lesson 1921Tailwind vs CSS-in-JS TradeoffsLesson 1946CSS Variables vs CSS-in-JS for Theming
CSS-sensitive designs
Layouts that break with empty elements
Lesson 1133Optional Slots with Conditional Rendering
Cumulative Layout Shift (CLS)
Content pops in after the skeleton, causing the page to jump around.
Lesson 647The SEO and Performance ImpactLesson 2258Core Web Vitals: LCP, FID, CLS
Current atom values
See the live value of each atom
Lesson 1728Jotai DevTools and Debugging
Current user profile
User data often appears in headers, sidebars, and main content simultaneously
Lesson 810Context for Truly Global State
Custom comparators
add more code than default memo
Lesson 925Bundle Size Impact
Custom fetching
requires you to build a Suspense-compatible wrapper yourself
Lesson 1346The Suspense-Ready Ecosystem
Custom function
`(content, element) => content.
Lesson 2062TextMatch: String, Regex, and Function
custom hook
is just a JavaScript function with two distinguishing characteristics:
Lesson 958What Makes a Custom HookLesson 960Your First Custom Hook: useToggle
Customization without permission
You don't need the library author to add a `customTrigger` prop—just put whatever you want inside `Menu.
Lesson 1086Advantages Over Monolithic Components

D

Dashboard updates
Refreshing analytics widgets while the user navigates tabs.
Lesson 1461Priority in Practice: When You Feel the Difference
Data attributes
(`data-*`) are a web standard for storing custom information on HTML elements.
Lesson 99data-* and aria-* Attributes: The kebab-case ExceptionsLesson 1187Data Attributes for Styling State
Data dependencies
Reset when critical data IDs change, like viewing a different product or document.
Lesson 1327resetKeys for Automatic Recovery
Data fetching hooks
`useFetch` vs `useData` vs `useQuery`—standardize
Lesson 987Consistency Across Your Codebase
Data fetching with Suspense
is the tricky part.
Lesson 1346The Suspense-Ready Ecosystem
Data loads
Finally, your `fetch()` request fires
Lesson 643The Waterfall Problem
Data tables
Each cell displays a specific field from row data indexed by `rowIndex` and `columnIndex`.
Lesson 2299Virtualized Grids and Multi-Column Layouts
Data visualization app
800kb → 240kb (70% reduction)
Lesson 1533The Bundle Size Win: Real Numbers
Date stamps matter
Posts from 2018 or earlier are almost certainly pre-hooks.
Lesson 326Documentation and Tutorials: Recognizing Outdated Content
Dead code elimination
Tools can't easily determine which lifecycle methods you actually need
Lesson 311Classes Confuse Both People and Machines
Debounced state
updates only after the user stops typing for X milliseconds
Lesson 477Mitigating Cost: Debouncing State Updates
Debouncing/throttling
user input before firing API calls
Lesson 1746Middleware-Heavy Workflows: Sagas, Observables, Complex Async
Debug info
Stack traces, component names, etc.
Lesson 769Meta Fields: Adding Timestamps, IDs, or Metadata
Debug unexpected re-renders
Too many logs?
Lesson 414Console Logs and Render Counting
Debugging becomes easier
If the UI looks wrong, check the state.
Lesson 17UI as a Function of State
Debugging confusion
With deeply nested boundaries, you might catch errors *too early*, hiding the real failure point from your logging service.
Lesson 1312Avoiding Boundary Overuse
Debugging faster
you can find components in DevTools
Lesson 204Avoiding Anonymous Function Exports
Decide
whether to return the cached value or recompute
Lesson 889The Cost-Benefit Analysis of useMemo
Declaration merging
is `interface`'s superpower.
Lesson 2330Props Interface vs Type Alias
Declarative (What)
You sit at a table and say: "I'd like an omelet.
Lesson 9Declarative UI: What vs How
Declarative orchestration
Parent component state triggers coordinated child animations through variants
Lesson 2010Framer Motion for Component-Driven UI Animations
Declarative UI
works so well in React — you describe what you want, and React figures out the most efficient way to get there.
Lesson 12The Virtual DOM ConceptLesson 13Reconciliation: React's Diffing AlgorithmLesson 14Learn Once, Write AnywhereLesson 18Progressive Adoption and Escape Hatches
Declare
a state variable that persists between renders
Lesson 329What useState Does: Adding State to Function Components
Deduplicate identical requests
across your entire app (if two components request the same data simultaneously, only one network call happens)
Lesson 587Why Modern Libraries Solve This Automatically
Deduplicate requests
(two components requesting the same user?
Lesson 1738RTK Query: Declarative Data Fetching
Deduplicates
scripts with matching `src` attributes across your entire component tree
Lesson 1519Async Scripts with Direct Support
Deep nesting (6+ levels)
Children or slots preferred; render props become unwieldy
Lesson 1150Composability Comparison: Nesting and Flexibility
Deep stacks
heavily nested components that might benefit from restructuring
Lesson 71Reading Profiler Flamegraphs
Deep vertical stacks
where many components render in sequence
Lesson 2216Identifying Cascading Renders in the Flame Graph
Deeply nested descendants
that call `useContext` (even 10+ levels down)
Lesson 828The Scope of Consumer Re-renders
Default behavior
`cacheTime` defaults to **5 minutes** (300,000 milliseconds).
Lesson 1783The cacheTime Configuration
Default exports
offer flexibility—you can rename on import.
Lesson 199Named Exports vs Default Exports
Default imports break tree-shaking
When you write:
Lesson 1419Tree-Shaking Failures and How to Fix Them
Default values
Destructuring lets you set defaults inline: `{ name = 'Guest' }`.
Lesson 244Destructuring vs Direct Access Tradeoffs
Defer validation
to submit time or use blur events
Lesson 1203Migration Strategy: Converting Between Approaches
Deferred script tags
JavaScript that will "wake up" the page on the client
Lesson 1639Server-Side HTML Structure and Scripts
Deferred update renders next
React schedules a lower-priority render with the updated deferred value
Lesson 1445When Deferred Values Update
Deferred value
The query used for filtering (updates when React has time)
Lesson 1448Deferring Expensive List Filters
Definition lists
(`<dt>` and `<dd>` pairs)
Lesson 160Fragment Keys
Degraded UI
Keep working parts visible, show minimal fallback for the broken piece
Lesson 1319Degraded UI vs Full Failure
Delegate
Call your default reducer and return its result
Lesson 1179Combining Consumer and Default Reducers
Delete the effect
and any state variables that were only triggering it
Lesson 662Refactoring: From Effect to Direct Call
Deliberately throwing errors
from a child component during render
Lesson 2136Why Error Boundaries Need Special Testing
Dependencies of dependencies
(transitive deps) you didn't even know you installed
Lesson 1417Finding Unexpectedly Large Dependencies
Dependency comparison
React runs a shallow equality check on your array every render
Lesson 872The Cost of Memoization ItselfLesson 2279The Cost of useMemo Itself
Dependency suggestions
when your effect references variables not in the array
Lesson 1017What eslint-plugin-react-hooks Does
Depth harms clarity
`/app/workspace/project/settings/billing/history` is exhausting
Lesson 1842When to Nest vs Flatten Routes
Deriving state
Compute during render, not in an effect
Lesson 683The Props-Change-Triggers-Effect Antipattern
Desktop/4G
Can stretch to 250-300KB gzipped
Lesson 1421Bundle Budget Strategy: Setting Thresholds
Destroy the old component
Run cleanup, discard internal state, remove DOM nodes
Lesson 172Performance Cost of Unstable Keys
Destroys
the component instances that were there
Lesson 166Performance Implications of Bad Keys
Destructure or extract
the specific properties outside the hook
Lesson 880Extracting Primitive Values from Objects
Destructuring
Multiple properties, cleaner JSX, less repetition.
Lesson 143Accessing Item Data in .map()
Destructuring defaults
apply when a prop is `undefined` (not passed at all).
Lesson 245Default Values vs Nullish Coalescing
Destructuring in the Parameter
Lesson 143Accessing Item Data in .map()
Developer errors
with duplicate names would be harder to detect than call order violations
Lesson 1012Why Hooks Can't Use Names or IDs
Developer Experience (DX)
How intuitive is it to write and modify?
Lesson 2015Decision Framework: Performance vs Complexity vs DX
Developer friction
every new piece of shared state requires architectural decisions
Lesson 2328When to Move to External State
Device-based scaling
On lower-end devices, reduce animation complexity—fewer particles, simpler easing, shorter durations.
Lesson 2023Trade-offs: Fidelity vs Performance
DevTools
Use React DevTools Profiler to see if components re-render unexpectedly when you thought they were optimized.
Lesson 879The Object Dependency Problem
DevTools for debugging
cache state and query lifecycles
Lesson 1482When use() Fits vs TanStack Query or Loaders
DevTools Visibility
With Redux DevTools, you can see *exactly* how an action in the inventory module affected state in five other features.
Lesson 1743Large-Scale Apps with Many Interconnected Features
Did render time decrease
Look at the "Render duration" for your component
Lesson 893Measuring the Impact of useMemo
Different mental model
You're no longer imperatively controlling flow.
Lesson 1343Suspense vs Traditional Loading States
Direct access
Use `count` instead of `this.
Lesson 316From constructor State to useState
Direct call
React runs it every render, wastes cycles.
Lesson 387What is Lazy Initialization?
Direct data access
fetch from databases, read files, call APIs without extra layers
Lesson 1621The Default: Start with Server Components
Direct update
"Set count to 5" *(what if count changed since you decided on 5?
Lesson 442Using Functional Updates to Avoid Staleness
Disable certain toggle states
based on business rules
Lesson 1181Common Use Cases: Preventing Transitions
Disable the trigger
temporarily (button becomes disabled, hover becomes non-interactive)
Lesson 1411Handling Loading States in Interaction-Based Splits
Disabled interactions
Prevent clicks while stale
Lesson 1446Visual Feedback During Deferral
Discoverability
When importing from your context module, you see `addTodo`, `toggleTodo`, `deleteTodo`—the available operations are immediately clear.
Lesson 782Action Creators for Better Developer ExperienceLesson 1142Multiple Named Content Props
discriminated union
is a TypeScript pattern where you define multiple specific types, each with a unique literal value in a common property (usually `type`).
Lesson 762TypeScript: Discriminated Unions for ActionsLesson 2335Union Types for Variant PropsLesson 2385Typing useReducer: State and Action Types
Disproportionately large rectangles
representing single libraries
Lesson 1417Finding Unexpectedly Large Dependencies
Do they update together
(If A *always* changes with B, they're one domain)
Lesson 839Identifying Independent State Domains
Document it
Whatever you choose, write it down in your style guide
Lesson 2396Team Conventions: Picking a Style
Document the approach
– Team wiki or README explaining "when to use what"
Lesson 327When Teams Haven't Migrated Yet
Documentation navigation
(static chapter lists)
Lesson 1257Index Keys in Read-Only Lists
Documentation overload
When your component needs extensive examples for simple use cases, the API is fighting against common usage.
Lesson 1163When Inversion Becomes Over-Engineering
Doesn't depend
on array position or index
Lesson 170What Makes a Key 'Stable'
DOM bloat
extra elements that serve no purpose except satisfying React's single-parent requirement.
Lesson 108Fragments vs Wrapper Divs: Performance and Semantics
DOM itself
holds the current value, not your React state.
Lesson 1196Uncontrolled Forms: Letting the DOM Manage State
DOM manipulation
Integrating with third-party libraries that need real DOM nodes
Lesson 297componentDidMount: Side Effects After First Render
DOM references
Input focus, scroll position, animations stay intact
Lesson 151Keys Preserve Component Identity
DOM Refs
When you attach a ref to a JSX element to access the DOM node
Lesson 2383Typing useRef: Mutable Values vs DOM Refs
DOM updates
React compares the virtual DOM and syncs the changed `value` prop back to the actual input element
Lesson 467The setState → Re-render → DOM Update Flow
Domain knowledge
You know a complex calculation is stable based on business logic the compiler can't understand
Lesson 1508Compiler vs Manual: Performance Comparison
Don't do that
it violates the rules of hooks.
Lesson 977Conditional Logic Around Hook Results, Not Calls
Don't export the context
keep it module-private
Lesson 1090Creating a Private Context for Compound Components
Doubled event listeners
firing twice per interaction
Lesson 601Why React Does This: Finding Missing Cleanup
Download time
Waiting for hundreds of kilobytes to megabytes of JavaScript
Lesson 1556The Traditional SPA Performance Problem
Draft state
Unsaved changes, toggles, intermediate selections
Lesson 1683Form State: Almost Always Local
Drilling
is like telling each person in a chain *exactly* what's inside so they can repack it.
Lesson 274Preview of Solutions: Composition
Dropdowns
A `<Dropdown>` manages open/closed state.
Lesson 1087When to Use This Pattern
Duplicate listeners
(accidentally attaching the same handler twice)
Lesson 6Event Listener Spaghetti CodeLesson 558What Happens Without Cleanup
Duplicate Modules
Look for the same library name appearing in multiple chunks — this means you're shipping the same code twice.
Lesson 1413Reading a Bundle Analysis Report
During fetch
Show a spinner, skeleton, or "Loading.
Lesson 569Managing Loading States
Dynamic content
makes `getByText` unreliable (e.
Lesson 2064getByTestId: The Escape Hatch
Dynamic field arrays
(add/remove items from a list)
Lesson 515Recognizing When Controlled is Still Better
Dynamic identifiers
(like `useState(props.
Lesson 1012Why Hooks Can't Use Names or IDs
Dynamic logic
You can perform different actions based on the node's properties or run side effects that depend on the element existing.
Lesson 720The Ref Callback Pattern
Dynamic state needs
Atom families let you create state on-the-fly for items in lists or tabs without pre-declaring them.
Lesson 1729When Jotai Fits: Bottom-Up State
Dynamic, not static
The content can't be predetermined at the call site
Lesson 1149When Render Props Win: Dynamic Behavior

E

E-commerce dashboard
400kb → 120kb (70% reduction)
Lesson 1533The Bundle Size Win: Real Numbers
Eager loading
(bundling everything together) and **lazy loading** (splitting with `React.
Lesson 1358Lazy vs Eager: When Each is Right
Eager prefetch
You load the chunk during idle time or on hover, making the component feel instant when needed.
Lesson 1410The Prefetch/Import Timing Tradeoff
easier debugging
(check variable values instead of dissecting nested operators), and **testable logic** you can verify independently.
Lesson 126Extract Logic to Variables Before JSXLesson 823When Prop Drilling is Actually Fine
Easier implementation
(no need to inspect or filter children)
Lesson 1079Named Children vs Generic Children
Easier refactoring
Change the action structure once, not everywhere
Lesson 765Action Creators: Functions That Return Actions
Easier state management
Toggle between animation states by just changing the string you pass to `animate`.
Lesson 1973Variants: Named Animation States
Easier to debug
The value is right there where you can see it
Lesson 653The Fix: Compute During Render
Easier to maintain
You can modify one effect without touching others
Lesson 532Multiple Effects in One Component
Easier to read
Each effect has a single, clear purpose
Lesson 532Multiple Effects in One Component
Easier to reason about
The data lives next to the logic that uses it
Lesson 1680The Local-First Principle
Easier to refactor
Moving or deleting a component takes its state with it
Lesson 1680The Local-First Principle
Easier to test
No need to mock global stores
Lesson 1680The Local-First Principle
Easier updates
Change the component, update its test, adjust its styles—all in one place
Lesson 209Colocating Tests and Styles with Components
Easy optionality
Missing props naturally render nothing
Lesson 1130Props as Slots: The Basic Pattern
Easy resets
Just update state, input follows automatically
Lesson 1195Controlled Forms: Single Source of Truth Principle
Edit mode
Auto-select existing text so users can quickly replace it
Lesson 497Imperatively Selecting Text
Editor integration issues
Your IDE might not be running ESLint; verify it's enabled in VS Code settings or your editor's ESLint extension
Lesson 1024Integration with Modern Tooling (Vite, Next.js)
Effect cleanup runs
(even though the component didn't actually unmount)
Lesson 598Why Your Effect Runs Twice on Mount
Effect dependencies
What's in your `useEffect` array
Lesson 2115What Are Implementation Details?
Effect re-runs
triggered by changing dependencies
Lesson 1197Performance Implications: Re-renders on Every Keystroke
Effect runs
Detects props changed, calculates new value, calls `setState`
Lesson 652Why It's Wrong: Double RenderingLesson 700Avoiding the useEffect Computation Trap
Effect timing
Make the bread, serve it, *then* go back to the kitchen to add toppings, serve again
Lesson 693When Computation Happens: Render vs Effect Timing
Effects and refs
only see the final, batched result
Lesson 439Batching Hides Individual Updates
Element types
Is this a `<div>` on both server and client?
Lesson 1654How React Detects Mismatches
Embedded widgets
When your React component lives inside someone else's page
Lesson 28Preact: React's Lightweight Alternative
Empty array `[]`
Effect runs only once, after the initial render
Lesson 536What is the Dependency Array?
Enable easy refactoring
Change the underlying library without touching every component
Lesson 993Composing Third-Party Hooks
Enable tree-shaking
Make sure you're using ES module imports (`import { specific } from 'library'`) rather than CommonJS, which allows dead code elimination
Lesson 1417Finding Unexpectedly Large Dependencies
Enables Redux DevTools Extension
by default
Lesson 1731Creating a Store with configureStore
Encapsulate
the reducer initialization logic in one place
Lesson 779The Provider Component Pattern
Enforcement
The custom hook throws an error if used outside the parent, ensuring proper nesting
Lesson 1101Context-Based State Sharing in Radix
Enhance
Call your default reducer, then modify the result before returning
Lesson 1179Combining Consumer and Default Reducers
Enter/exit transitions
Components animate in when they mount and out when they unmount (using `AnimatePresence`)
Lesson 2010Framer Motion for Component-Driven UI Animations
Environment configuration
(feature flags, API URLs)
Lesson 2135The Integration Test Sweet Spot
Enzyme
"Test that your code is structured correctly.
Lesson 2040RTL vs Enzyme: Philosophy Differences
Error Boundary
around your lazy route components (or the `<Suspense>` boundary wrapping them).
Lesson 1401Error Boundaries for Route ChunksLesson 1478Error Handling: use() with Error Boundaries
Error messages clearer
stack traces show meaningful names
Lesson 204Avoiding Anonymous Function Exports
Error-prone
Easy to forget required props, causing subtle bugs
Lesson 1165The Problem: Too Many Individual Props
ES module versions
of libraries (`lodash-es` vs `lodash`)
Lesson 1419Tree-Shaking Failures and How to Fix Them
ES6 Proxies
JavaScript objects that intercept operations like property reads and writes.
Lesson 1760Proxy-Based State: How Valtio Tracks Mutations
ESLint Plugin
The `eslint-plugin-react-compiler` shows inline warnings when code patterns prevent optimization—right in your editor as you type.
Lesson 1510Debugging Compiler Output
estimateSize
– A function that returns each item's approximate height
Lesson 1279useVirtualizer Hook BasicsLesson 1281Dynamic Item Heights
Event handler behavior
When a user clicks a button, does the `onClick` handler fire?
Lesson 2184Unit Tests for Component Logic
Event handler runs
Your `onClick` or other handler executes immediately
Lesson 438The Render Cycle Timeline
Event listener hooks
`useClickOutside` vs `useOutsideClick`—consistency matters
Lesson 987Consistency Across Your Codebase
Event-driven features
Export functions, PDF generators, advanced form validation
Lesson 2293Dynamic Imports Without Suspense
every component
that calls `useContext` for that context re-renders — not just one, not just nearby consumers, but *all of them* across your entire component tree.
Lesson 831Multiple Consumers, Multiple Re-rendersLesson 839Identifying Independent State Domains
Every component needs interactivity
Your entire page is buttons, charts, drag-and-drop interfaces, and real-time updates
Lesson 1652When to Skip SSR: SPAs and Hydration-Heavy Apps
everything
upfront, even code for routes they'll never visit or features they'll never use.
Lesson 1384What Code Splitting Is and Why It MattersLesson 1668The onShellReady and onAllReady Callbacks
Everything that file imports
also becomes client code
Lesson 1537The Module Boundary, Not Component Boundary
Exact string match
`'Submit'` finds only "Submit"
Lesson 2062TextMatch: String, Regex, and Function
Exact strings
are strict by default—whitespace and case must match perfectly.
Lesson 2062TextMatch: String, Regex, and Function
Execute
every component's code to rebuild the virtual DOM tree
Lesson 1647The Cost of Hydration: CPU and Time to Interactive
Executes all your JSX
and any hooks like `useState` or `useRef`
Lesson 406What Happens During the Render Phase
Execution order
`onSuccess` OR `onError` runs first, then `onSettled` always runs last—like a `finally` block.
Lesson 1793Mutation Callbacks: onSuccess, onError, onSettled
Execution time
React builds the component tree, runs effects, and renders everything
Lesson 1556The Traditional SPA Performance Problem
Exhaustiveness
TypeScript warns if you forget to handle an action type
Lesson 762TypeScript: Discriminated Unions for Actions
Existing Investment
You have hundreds of slices, dozens of async thunks, established patterns for middleware, and RTK Query endpoints feeding your entire app.
Lesson 1747Team Familiarity and Existing Codebase Investment
Existing patterns
Match what's already there unless you're doing a deliberate migration
Lesson 2396Team Conventions: Picking a Style
Exit animations run automatically
When the condition becomes `false`, the exit animation plays, *then* React unmounts
Lesson 1979AnimatePresence for Enter/Exit Animations
Expanding cards
Click to expand, and both size and sibling positions animate
Lesson 1984Layout Animations with layout Prop
Expensive API calls
you want to minimize
Lesson 1782The staleTime Configuration
Expensive child components
remounting unnecessarily
Lesson 176Profiling Key-Related Performance Issues
Expensive computations
You're running heavy calculations on every render without `useMemo`.
Lesson 1197Performance Implications: Re-renders on Every Keystroke
Explicit Props
shine when data travels 1-2 levels deep.
Lesson 826Comparing Solutions: Props vs Composition vs Context
Explicit render props
make the data flow visible:
Lesson 257When Children Becomes Too Magic
Explicitness
Props interfaces show exactly what's accepted, including children
Lesson 2396Team Conventions: Picking a Style
Export sessions
Save the entire action log as JSON for later analysis or bug reports
Lesson 1744Time-Travel Debugging and Audit Requirements
External services
(analytics, payment processors)
Lesson 2075Why Module Mocking is Necessary in Tests
External snapshots
(the default) get written to separate `__snapshots__/*.
Lesson 2158Inline Snapshots vs External Files
External sync
Then `useEffect` *is* appropriate (but rare)
Lesson 683The Props-Change-Triggers-Effect Antipattern
Extra boilerplate
for simple features
Lesson 1688Avoiding Premature Abstraction
Extra dependencies
waste memoization:
Lesson 697The Dependency Array for Computation
Extra render cycle
→ performance cost
Lesson 672Testing Render vs Effect Approaches
Extra render cycles
the component renders once with stale derived data, then the effect runs and triggers a second render
Lesson 684Derived State: Compute During Render Instead
Extra state
You're storing data that could be calculated on-the-fly
Lesson 651Example: Filtering Props in an Effect
Extract and memoize
the render function if the child component is expensive to render:
Lesson 1060Performance Considerations
Extract outside the component
when your computation is **pure and independent** — it doesn't need any props or state:
Lesson 699When to Extract vs Inline with useMemo
Extract ref reads
and replace with state references
Lesson 1203Migration Strategy: Converting Between Approaches
Extracted mapping
pulls the logic out:
Lesson 146Inline vs Extracted Mapping Functions
Extreme performance critical paths
Occasionally, manual control over exact memo boundaries matters
Lesson 1508Compiler vs Manual: Performance Comparison

F

Fail the build
if any file exceeds its budget
Lesson 1420Measuring Bundle Size in CI
Fallback
Only if there's NO Provider at all does React fall back to the default value from `createContext`.
Lesson 793Default Values vs Provider ValuesLesson 802No Provider: Default Context Value
False test results
from leftover elements interfering with queries
Lesson 2050Cleanup Between Tests
Falsy left side
(`false`, `0`, `null`, `undefined`, `""`, `NaN`): The gatekeeper stops you.
Lesson 111Why && Works: Truthy/Falsy Evaluation
Familiar API
Vitest intentionally mirrors Jest's API (`describe`, `it`, `expect`), so migration is straightforward.
Lesson 2024Why Vitest Over Jest for Modern React
Familiar utilities
(like date/time, validation, or formatting libraries) that seem huge
Lesson 1417Finding Unexpectedly Large Dependencies
Fast
Because React already calculated the minimal changes, it's not wastefully re-rendering everything
Lesson 412The Commit Phase: Applying Changes to the DOM
Fast and focused
Only the specific DOM nodes that changed get updated—not the entire tree
Lesson 429Commit Phase: Applying Changes to the DOM
Fast APIs
If your data fetches return in 100ms, transitions won't make them faster.
Lesson 1469When Concurrent Features Don't Help
Fast-changing data
(live scores): `staleTime: 0` (default)
Lesson 1774Cache Staleness: staleTime Explained
Faster Execution
Vitest leverages Vite's lightning-fast Hot Module Replacement (HMR).
Lesson 2024Why Vitest Over Jest for Modern React
Faster feedback
No need to render complex component trees just to verify hook behavior
Lesson 2095Why Testing Hooks in Isolation Matters
Faster iteration
Prototype without performance anxiety, refactor without re-optimizing
Lesson 1513Long-Term Impact on React Development
Faster navigation
Everything's right there
Lesson 209Colocating Tests and Styles with Components
Faster page loads
Less JavaScript to download
Lesson 1384What Code Splitting Is and Why It Matters
Faster parsing
The browser processes less code upfront
Lesson 1384What Code Splitting Is and Why It Matters
Feature-based scales better
as apps grow.
Lesson 208Folder Structure: Feature-Based vs Type-Based
Feature-Based Structure
groups files by *what feature they belong to*:
Lesson 208Folder Structure: Feature-Based vs Type-Based
Feature-level
balances progressive loading with user experience—it's often the sweet spot.
Lesson 1383Suspense Boundary Placement Patterns
Feature-Level Boundaries
Wrap independent features (sidebar, chat widget, notification panel) separately.
Lesson 1307Error Boundary Placement Strategy
Feature-level boundary
Wraps the entire feed section → shows "Feed temporarily unavailable"
Lesson 1321Nested Boundary Fallback Strategies
Feature-specific components
are like specialized tools (a sushi rolling mat, pasta maker) that only matter for certain recipes— those stay near where you use them.
Lesson 63The Components Folder: Shared vs Feature-Specific
Fetch twice
(wasteful, inconsistent)
Lesson 1778Sharing Data Across Components
Fetched defaults
Pre-filling from a server (but even this can be props!
Lesson 1683Form State: Almost Always Local
Fetcher Function
SWR accepts a global fetcher via `SWRConfig`; TanStack Query requires explicit `queryFn` per query (or global default in `QueryClient`).
Lesson 1811Migration Considerations: SWR to TanStack Query
Fetching data
Do it in the parent, or use Server Components
Lesson 683The Props-Change-Triggers-Effect Antipattern
Few props (1-4)
Destructuring makes code cleaner and more readable.
Lesson 244Destructuring vs Direct Access Tradeoffs
Fewer commits
containing your component
Lesson 2273Profiling After Adding memo
Fewer DOM updates
= smoother, more responsive UI
Lesson 425The Performance Win from Batching
Fewer props, clearer intent
Instead of memorizing 20 props, you compose familiar building blocks.
Lesson 1086Advantages Over Monolithic Components
Fewer reconciliation cycles
= less time comparing virtual DOM trees
Lesson 425The Performance Win from Batching
Fewer render passes
= less time spent calling component functions
Lesson 425The Performance Win from Batching
Fewer typos
Your editor autocompletes the function name
Lesson 765Action Creators: Functions That Return Actions
Fiber tree
an internal data structure representing your component hierarchy — and each Fiber node (component instance) has a **hook chain** stored as a linked list.
Lesson 1013The Fiber Tree and Hook Chains
FID (First Input Delay)
Interactivity responsiveness
Lesson 2258Core Web Vitals: LCP, FID, CLS
Field Data
(real-user monitoring) comes from actual users running your React app in the wild—captured via the `web-vitals` library or analytics platforms.
Lesson 2265Field Data vs Lab Data
Field-level
makes sense when errors are always shown inline next to their inputs.
Lesson 1209Field-Level vs Form-Level Validation State
Field-level subscriptions
to minimize re-renders
Lesson 1228Why Formik Was Popular
Filtered lists
You have an array in state and a search term—the filtered results are derived
Lesson 663What is Derived State?
Finally
JavaScript executes and fetches data from your API (network round-trip)
Lesson 1558The Waterfall Problem in Data Fetching
Find shared dependencies
The analyzer reveals that three route chunks all include `lodash`.
Lesson 1402Route-Based Bundle Analysis
Finding and clicking
the reset button in the fallback
Lesson 2141Testing Reset Functionality
Finding things is easier
need to fix the Button?
Lesson 206One Component Per File Convention
Fine boundaries
(component-level) show more of the UI faster but create visual noise with multiple spinners.
Lesson 1340Suspense Boundaries: Where to Place Them
Firefox
Visit Firefox Add-ons and search for "React Developer Tools"
Lesson 2207Installing and Opening the React DevTools Profiler
First `!` (negation)
Converts the value to boolean and flips it
Lesson 113Safe Boolean Coercion: !! Pattern
First choice
If a component consuming the context has a `<Provider>` ancestor (even far up the tree), React uses whatever value that Provider supplies — even if it's `null` or `undefined`.
Lesson 793Default Values vs Provider Values
First Contentful Paint
Did route splitting improve initial load?
Lesson 2291Measuring Split Effectiveness
First Contentful Paint (FCP)
When users see something
Lesson 1427Measuring Real-World Impact
First Input Delay (FID)
Measures the delay between a user's first interaction (click, tap) and when the browser can actually respond.
Lesson 2258Core Web Vitals: LCP, FID, CLS
First pass
Re-render immediately with the **old** deferred value (keeping the UI responsive)
Lesson 1443The Basic useDeferredValue Pattern
First-Come-First-Served
model: sequential, predictable, but inflexible.
Lesson 1460The Mental Model: Traffic Lights vs First-Come-First-Served
Flaky tests
where execution order affects outcomes
Lesson 2050Cleanup Between Tests
Flame graphs
Visual bars showing which components rendered and their parent-child relationships
Lesson 416Visualizing Renders with React DevTools ProfilerLesson 844Measuring Impact with React DevTools Profiler
Flamegraph
shows individual commit durations
Lesson 2270Measuring Render Count vs Render Time
Flamegraph width
Is the memoized component missing from commits where its parent rendered but props didn't change?
Lesson 2273Profiling After Adding memo
Flexible layouts
Components that adapt to available content
Lesson 1133Optional Slots with Conditional Rendering
FLIP technique
when you use the `layout` or `layoutId` props:
Lesson 1987Layout Animation Performance
Focus Management
When items mount/unmount during scrolling, preserve focus context so keyboard users don't lose their place.
Lesson 1285Accessibility Considerations
Focus on real bottlenecks
You immediately see which interactions caused slow renders.
Lesson 2213Filtering Commits by Duration Threshold
Follow the stack trace
in the console to navigate from child to parent until you find where the conditional logic lives
Lesson 1661Debugging Hydration Errors
Font imports
from Google Fonts or other CDNs
Lesson 1927Global Styles and CSS Reset
Font rendering differences
that break precise layouts
Lesson 2187E2E for Cross-Browser and Device Testing
For bundle analysis
Tools like webpack-bundle-analyzer show you clearly which features are heavy and need optimization.
Lesson 1394Webpack Magic Comments for Chunk Naming
For cache invalidation
Named chunks have predictable filenames, making it easier to reason about caching strategies.
Lesson 1394Webpack Magic Comments for Chunk Naming
For data fetching
Server routes let you fetch data *before* rendering, avoiding waterfalls.
Lesson 1892Server vs Client Routing Boundaries
For debugging
When you see a network request failing or taking too long, you immediately know which component is affected.
Lesson 1394Webpack Magic Comments for Chunk Naming
For interactive user-facing pages
Use `onShellReady` to start streaming immediately.
Lesson 1636The onShellReady and onAllReady Callbacks
For learning
Absolutely — experimenting now prepares you for the future and helps you write compiler- friendly code patterns today.
Lesson 1512Compiler Adoption Timeline and Stability
For reusability
You have the same logic in multiple components (the three-strike rule).
Lesson 1001Extracting for Testability vs Reusability
For testability
You have complex logic in a single component that's hard to test.
Lesson 1001Extracting for Testability vs Reusability
For user experience
Server routing shows loading states during transitions but keeps HTML fast.
Lesson 1892Server vs Client Routing Boundaries
Force remount
by changing the component's `key` (rare, usually overkill)
Lesson 503When Default Props Don't Update
Form components
Reset form fields when editing different items
Lesson 692Refactoring Effect-Based Syncing to Key Prop
Form data
– the `FormData` object from the form submission
Lesson 1485Action Functions and State Updates
Form fields
Create an atom per form field name
Lesson 1726Atom Families for Dynamic Collections
Form input state
updating on every keystroke
Lesson 813When NOT to Use Context: Frequent Updates
Form libraries
like React Hook Form or Formik provide hooks for form state, validation, and submission.
Lesson 1004When Framework Libraries Obviate Custom Hooks
Formatted strings
Like `fullName = firstName + " " + lastName`
Lesson 663What is Derived State?
FormData object
and passes it as the first argument to your server action function.
Lesson 1612FormData in Server Actions
FPS meter (green bars)
Taller = better.
Lesson 2021Measuring Frame Rate with DevTools
Fragments
`<Suspense fallback={<><Spinner /><p>Please wait</p></>}>`
Lesson 1369What the fallback Prop AcceptsLesson 2340ReactNode: The Broadest Children Type
Framer Motion
or **React Transition Group** that handle this delay logic for you.
Lesson 1965Limitations: No Mount/Unmount AnimationsLesson 2011React Spring for Natural, Physics-Based Motion
Frames timeline
Red corners mark dropped frames—your animation skipped a beat
Lesson 2021Measuring Frame Rate with DevTools
Framework flexibility
it works seamlessly with any backend pattern
Lesson 1830When Apollo Fits vs TanStack Query
Framework support
React Router and other routers make this trivial
Lesson 1423Route-Level Splitting: The Sweet Spot
Frequent prop usage
If you reference `name` ten times, writing `name` beats `props.
Lesson 244Destructuring vs Direct Access Tradeoffs
Frequent renders
Components rendering dozens of times during a single interaction suggest unnecessary re-renders —possible candidates for `React.
Lesson 2223Reading the Profiler Flamegraph
Frequent user paths
Common workflows that most users experience
Lesson 2183E2E Tests Cover Critical User Journeys
Frequently changing data
News sites, stock tickers, social feeds — when data freshness matters and you're hitting your database anyway.
Lesson 1675SSR Trade-offs: Server Cost vs Time-to-Content
Frequently-changing dependencies
Cache always invalidates, negating the cache's purpose
Lesson 2284Dependency Array Performance Impact
Friction
(default: 26): How much resistance slows the spring.
Lesson 1993Spring Configuration: Tension, Friction, Mass
Full components
`<Suspense fallback={<SkeletonLayout />}>`
Lesson 1369What the fallback Prop Accepts
Full Failure
Replace the entire section with an error screen
Lesson 1319Degraded UI vs Full Failure
Full navigation
Moving to a different route entirely
Lesson 1571Server Component Caching Behavior
Function calls
`<Card count={getTotal()} />`
Lesson 220Passing Variables and Expressions
Function Children
The consumer decides how to transform data into UI
Lesson 1153What is Inversion of Control in React?
Function wrapper
React runs it once, saves performance.
Lesson 387What is Lazy Initialization?
Functional
"Increase the current temperature by 5°"
Lesson 376Performance: Functional Updates Are Not Slower
functional update
pattern with the **spread operator** to preserve existing fields:
Lesson 374Functional Updates with ObjectsLesson 442Using Functional Updates to Avoid Staleness
Future-proof
React's own documentation moved away from `React.
Lesson 2396Team Conventions: Picking a Style

G

Garbage collected
After being inactive for `cacheTime` (default: 5 minutes), the data is removed
Lesson 1773Automatic Caching: How TanStack Query Stores Data
Generates
unique filenames with hashes for cache control
Lesson 46Building for Production
Generates a unique URL
with a hash (for cache busting)
Lesson 45Static Asset Handling
Gestural interfaces
Draggable cards, swipeable panels, anything users manipulate directly
Lesson 2011React Spring for Natural, Physics-Based Motion
Gestures
expose `velocity`, `direction`, `distance`
Lesson 1063Render Props for Complex Interactions
Global animations
or utility classes
Lesson 1927Global Styles and CSS Reset
Global selectors
with `:global(.
Lesson 1909Common Pitfalls
Global state pollution
Every dropdown might attach event listeners to the document, creating conflicts.
Lesson 8Component Reusability Before React
Good
Database IDs, unique product SKUs, usernames—values tied to the data itself
Lesson 153Keys Must Be Stable Across Renders
Good naming (purpose-focused)
Lesson 205Component Naming for Clarity
Good news
React 18's automatic batching covers these cases, so this workaround is rarely needed anymore.
Lesson 424When Batching Doesn't Apply
Granular subscriptions
When different components need different slices of state (Context re-renders all consumers on any change)
Lesson 816Context vs State Management LibrariesLesson 2328When to Move to External State
Granular, composable requirements
You want individual pieces of state that can be mixed and matched without ceremony.
Lesson 1729When Jotai Fits: Bottom-Up State
Granularity
The compiler can memoize at a finer level than you'd reasonably do by hand.
Lesson 1508Compiler vs Manual: Performance Comparison
GraphQL Code Generator
(commonly called `codegen`) reads your GraphQL schema and operations (queries/mutations), then automatically generates TypeScript types that match perfectly.
Lesson 1829Apollo Client with TypeScript
GraphQL subscriptions
, libraries like TanStack Query don't handle these out of the box.
Lesson 611When useEffect Data Fetching Still Makes Sense
Gray "did not render"
labels in the Flamegraph for commits where the parent re-rendered
Lesson 2273Profiling After Adding memo
Green/Blue bars
These rendered quickly
Lesson 71Reading Profiler Flamegraphs
Grid reordering
Items shuffle positions when filtered or sorted
Lesson 1984Layout Animations with layout Prop
Guesses
initial heights using `estimateSize` (doesn't need to be perfect)
Lesson 1281Dynamic Item Heights
Gzipped size
What actually transfers over the network
Lesson 1413Reading a Bundle Analysis Report

H

Handle race conditions
by ensuring the latest request always wins
Lesson 587Why Modern Libraries Solve This Automatically
Handles keyboard navigation
Left/Right arrows navigate tabs, Home/End jump to first/last, Enter/Space activate a tab.
Lesson 1104Accessibility Built Into Compound Components
Hard to test
Mocking timings, race conditions, and cleanup in tests is painful.
Lesson 605The Problem with Manual useEffect Data Fetching
Have intricate edge cases
that are hard to trigger through component UI (error recovery, race conditions)
Lesson 2102When to Test Hooks vs Components
Headings and titles
(when you're not testing ARIA hierarchy)
Lesson 2056getByText for Non-Interactive Content
Headless
is the philosophy that ties these patterns together—maximum logic reuse, zero style opinions.
Lesson 1183What 'Headless' Means: Logic Without Styling
Headless UI
leans toward implicit coordination with fewer exposed components, favoring simplicity over flexibility.
Lesson 1107Comparing API Styles: Radix vs Headless UI
Heavy components used conditionally
modals, admin panels, editor interfaces
Lesson 1358Lazy vs Eager: When Each is Right
Heavy computation hooks
that slow down your test suite
Lesson 2133Mocking Custom Hooks: When It's Justified
Heavy filtering or search
You're typing in a search box that filters 10,000 items.
Lesson 1461Priority in Practice: When You Feel the Difference
Heavy JavaScript is unavoidable
You're shipping large libraries for data visualization, 3D rendering, or complex state management
Lesson 1652When to Skip SSR: SPAs and Hydration-Heavy Apps
Heavy utilities
Date formatting libraries, validation schemas, chart renderers
Lesson 2293Dynamic Imports Without Suspense
Here's the catch
Nested destructuring can quickly become cryptic.
Lesson 243Nested Destructuring for Prop Objects
Hides the real problem
You're working around unstable references instead of fixing them
Lesson 639JSON.stringify as a Last Resort
High quantity
The more items, the bigger the savings
Lesson 934List Items with Stable Props: A Common Win
High skip potential
If parent re-renders frequently but this component's props stay the same, you skip potentially many renders
Lesson 936memo with Pure Presentational Components
High-frequency cascades
A parent component re-renders 10+ times per second, triggering expensive child tree updates
Lesson 2237Tracking vs Fixing: When to Act
High-probability routes
Dashboard users often visit settings
Lesson 2290Prefetching Split Chunks
High-risk areas
Authentication, data submission, critical integrations
Lesson 2183E2E Tests Cover Critical User Journeys
High-risk features
Admin actions, data deletion, permissions
Lesson 2191Balance: Enough E2E Coverage Without Fragility
Higher-Order Components (HOCs)
functions that take a component and return a wrapped, enhanced version:
Lesson 309Wrapper Hell and HOCsLesson 313Hooks Enable Logic ExtractionLesson 1070The Historical Context: Why Render Props Existed
Highlighting error fields
after form validation
Lesson 496Imperatively Focusing an Input
Highly dynamic, user-driven styling
When users control colors, sizes, spacing, or layout properties through interactive tools (theme builders, design editors, dashboards), runtime CSS-in-JS shines.
Lesson 1955When Runtime CSS-in-JS Still Makes Sense
Highly Interactive Apps
Think Figma, code editors, or complex dashboards.
Lesson 1673CSR Trade-offs: Interactivity vs Initial Load
Hiring and Collaboration
React developers are abundant.
Lesson 30Ecosystem Size as a Decision Factor
Historical records
(past event timelines)
Lesson 1257Index Keys in Read-Only Lists
HOCs (Higher-Order Components)
wrap your component in another component, adding props automatically.
Lesson 1049Render Props vs HOCs for Logic Sharing
Hoisting
Function declarations are hoisted, meaning you can call them before they're defined in the file.
Lesson 183Arrow Functions vs Function Declarations
Honestly? Often it doesn't
React is fast.
Lesson 281Performance Considerations with Render Props
Honestly? Usually not much
Modern React is fast, and creating small objects is cheap.
Lesson 1899Extracting Style Objects
Hook name
`useFormState` → `useActionState`
Lesson 1491Migration from useFormState
Hook Names
SWR's `useSWR` becomes `useQuery`.
Lesson 1811Migration Considerations: SWR to TanStack Query
Hook order or presence
Whether `useState` or `useReducer` is used
Lesson 2115What Are Implementation Details?
Hooks = logic extraction
Get values, use them however you want.
Lesson 1067Render Props vs Hooks for Stateful Logic
Hooks changes
Which hook values changed (context, reducers, etc.
Lesson 2225Comparing Renders: Why Did This Update Happen?
Hooks don't fit naturally
Some patterns (like providing rendering slots or plugin systems) don't map well to hooks' linear call structure.
Lesson 1052When Render Props Add Value
Hooks folder
If it uses `useState`, `useEffect`, or other hooks and is needed by 2+ features.
Lesson 64Common Top-Level Folders: hooks, utils, types
Hot Module Replacement
for instant updates
Lesson 56CDN Script Tags: React Without Build Tools
Hot Module Replacement (HMR)
solves this.
Lesson 43Hot Module Replacement (HMR)
Hot reloading
Class methods are harder to hot-swap during development without losing state
Lesson 311Classes Confuse Both People and Machines
Hover and focus effects
(button grows slightly, background changes)
Lesson 1957When CSS Transitions Are Enough
Hover indicators
Boolean flags for `onMouseEnter`/`onMouseLeave`
Lesson 1685Temporary State: Counters, Timers, Animations
Hover intent
User hovering = likely to click
Lesson 2290Prefetching Split Chunks
How it behaves
(what happens when users interact)
Lesson 10Component-Based Architecture
How many levels
(1-2 → props, 3+ → consider alternatives)
Lesson 826Comparing Solutions: Props vs Composition vs Context
HTML
`class` → **JSX:** `className`
Lesson 78JSX is Not HTML: Key Differences
HTML elements
and **custom components**:
Lesson 198PascalCase for Component Names
HTML loads
The browser receives an empty shell
Lesson 643The Waterfall Problem
HTML strings
(like traditional SSR), or
Lesson 1525The RSC Wire Format: Not HTML, Not JSON
HTMLCollection
(not an array).
Lesson 486Multi-Select: value as Array
HTTP requests
(MSW handles this beautifully)
Lesson 2126Mock External Dependencies, Not Internal Code
HTTP/1.0 connections
don't support chunked encoding
Lesson 1671Streaming SSR Browser Support and Fallbacks
Hydrate progressively
on the client
Lesson 1583Streaming and Incremental Rendering
hydration
it attaches event listeners, initializes state, and "wakes up" the interactive parts of your application.
Lesson 1640Bootstrapping the Client After SSRLesson 1651Resumability: Qwik's Alternative to Hydration

I

Identify culprits
Look at the flame graph for components rendering frequently or slowly
Lesson 2247Profiling to Confirm the Problem
Identify the logic
currently living in your effect
Lesson 662Refactoring: From Effect to Direct Call
Identify unexpected dependencies
You split `AdminDashboard` expecting a small chunk, but the analyzer shows it's 800KB.
Lesson 1402Route-Based Bundle Analysis
Identify update patterns
Which values change frequently?
Lesson 2253Splitting Context by Update Frequency
If data fetch fails
Error Boundary catches the error
Lesson 1381Suspense Boundaries and Error Boundaries Together
If it fails
restore the snapshot you saved—as if nothing happened
Lesson 1795Optimistic Updates: The Pattern
If successful
the server response confirms everything (or you can use it to refine the UI)
Lesson 1795Optimistic Updates: The Pattern
If they still pass
, they were testing behavior — exactly what the user experiences didn't change.
Lesson 2122Refactoring Should Not Break Tests
If your tests break
, they were testing implementation.
Lesson 2122Refactoring Should Not Break Tests
ignore flag pattern
solves this by marking responses as "stale" when the effect re-runs or the component unmounts.
Lesson 581The Ignore Flag PatternLesson 593When AbortController Isn't EnoughLesson 594The Ignore Flag Pattern as Fallback
IIFEs
immediately invoked function expressions—which let you run statement-based logic and return a value inline.
Lesson 130Switch Statements in IIFEs
Image galleries
Each cell renders a thumbnail from a two-dimensional array or a flattened list mapped to grid coordinates.
Lesson 2299Virtualized Grids and Multi-Column Layouts
Immediate local state
updates instantly on every keystroke (keeps the input responsive)
Lesson 477Mitigating Cost: Debouncing State Updates
Immediately flushes
all the HTML it's rendered so far
Lesson 1665Suspense Boundaries Enable Streaming
Immediately Invoked Function Expression
lets you wrap statements inside a function, then call it immediately.
Lesson 129Immediately Invoked Function Expressions (IIFEs) in JSX
Immediately sends
the HTML for everything *outside* that boundary
Lesson 1367The Streaming SSR Connection
Immediately update the cache
manually modify what users see
Lesson 1795Optimistic Updates: The Pattern
Immediately visible on load
navigation, headers, hero sections
Lesson 1358Lazy vs Eager: When Each is Right
Imperative (How)
You walk into the kitchen and tell the chef: "First, chop the onions.
Lesson 9Declarative UI: What vs How
Implementation details
are the internal mechanics of how your component works—things like state variable names, hook calls, private functions, effect dependencies, and component structure.
Lesson 2115What Are Implementation Details?Lesson 2120Wrapper Components as Implementation Details
Implicit return type
ensures you return valid JSX
Lesson 2390What React.FC Is and Does
Import and use
Your hooks become fully typed automatically
Lesson 1829Apollo Client with TypeScript
Import location
Moved from `'react-dom'` to `'react'`
Lesson 1491Migration from useFormState
Import React and ReactDOM
You're bringing in the React library itself
Lesson 41main.jsx: The React Bootstrap
Import resolution
Modern bundlers treat `src/` as the starting point for module imports
Lesson 61The src Folder Convention
Import statements become self-documenting
When you see `import UserProfile from '.
Lesson 201One Component Per File (Usually)
Import the hook
after the mock declaration
Lesson 2080Mocking Custom Hooks
Import your root component
Usually an `App` component that contains your entire application
Lesson 41main.jsx: The React Bootstrap
Import/export statements
for organizing code
Lesson 56CDN Script Tags: React Without Build Tools
Important quirk
This function is backwards from typical comparisons!
Lesson 920The Custom Comparison Function: arePropsEqual
Imports are cleaner
`import Button from '.
Lesson 206One Component Per File Convention
Improved Time to Interactive
Users can interact sooner
Lesson 1384What Code Splitting Is and Why It Matters
Improving accessibility
by managing keyboard navigation
Lesson 496Imperatively Focusing an Input
In a controlled form
Every keystroke updates state, causing the entire form component and all its input children to re- render.
Lesson 1227Performance Comparison: RHF vs Controlled
In Client Components
, you must use the `useParams` hook from `next/navigation`:
Lesson 1888Dynamic Routes and Route Parameters
In lifecycle methods
(like `componentDidMount`)
Lesson 1287What Error Boundaries Are: Catching Render Errors
in order
, passing the output of one as the input to the next.
Lesson 371Guaranteeing Sequential UpdatesLesson 1008What Happens on Re-render
In practice
Your product page server component can fetch data directly from the database, render the layout, and pass that data down to small client component islands for ratings, reviews, or interactive filters.
Lesson 1564The Composability Win
In production
Only if you're comfortable with experimental features and can handle potential breaking changes.
Lesson 1512Compiler Adoption Timeline and Stability
In Server Components
(the default), params are passed as props:
Lesson 1888Dynamic Routes and Route Parameters
In strict mode
(which most modern React apps use), attempting to mutate props triggers a runtime error:
Lesson 226The Error When You Try to Mutate Props
In the effect body
Add the event listener
Lesson 554Cleanup for Event Listeners
In this lesson
You'll understand why writing `{ key: value }` directly in a dependency array triggers infinite re- renders.
Lesson 634The Inline Object AntipatternLesson 697The Dependency Array for ComputationLesson 1577No Loading States in the Component
Including calculations
`{`Total: $${price * quantity}`}`
Lesson 87Template Literals Inside JSX
Inconsistent error handling
(did you remember `finally` everywhere?
Lesson 1336The Imperative Loading Problem
Incremental adoption
Easier to drop into existing projects without rewrites
Lesson 1885When TanStack Router Fits vs React Router
Incremental adoption matters
Add routing to existing React apps without restructuring your entire project
Lesson 1893When Next.js Routing Fits vs React Router
Incrementally inject
the finished HTML for each async component as it resolves
Lesson 1583Streaming and Incremental Rendering
Independence
Separate states don't force unrelated re-checks
Lesson 384Performance: Object vs Multiple Variables
index file
(commonly called a "barrel file") acts like a central export hub for a folder.
Lesson 210Index Files for Cleaner ImportsLesson 796Organizing Context Files
Index-based keys during reordering
When items reorder, DevTools reveals that the key "0" now points to a completely different component than before.
Lesson 1252Debugging Key Stability Issues
Index-based lookup is O(1)
constant time.
Lesson 1016The Performance Win of Order-Based Tracking
Indicate progress
with visual cues like opacity or spinners
Lesson 1471User Perception: Immediate Feedback Matters Most
Individual Item Semantics
Each virtual item needs proper ARIA attributes:
Lesson 1285Accessibility Considerations
Infinite loop prevention
Sometimes adding a dependency creates an unavoidable infinite loop due to object identity issues you can't resolve with `useCallback` or `useMemo`.
Lesson 549When to Disable the ESLint Rule
Infinite loops
Auto-fix adds an object/array that's recreated every render, causing the effect to run constantly
Lesson 1023Auto-Fix Behavior and Pitfalls
Infinite scroll or pagination
Loading the next page of results as users scroll is a client-side concern.
Lesson 1573Client-Side Data Fetching Still Exists
Initial bundle size
Has it decreased significantly after lazy loading routes or components?
Lesson 1418Analyzing Code-Split Chunk Sizes
Initial client render (hydration)
`width` is still `null`, renders "Loading width.
Lesson 1659The Two-Pass Render Pattern
Initial load delays
The page freezes while rendering
Lesson 1277When Virtualization is Worth It
Initial render time
Creating thousands of DOM nodes is computationally expensive.
Lesson 1275The Performance Problem with Long ListsLesson 2295The Problem Virtualization Solves
Initial state
`loading` starts `true` because fetching begins immediately
Lesson 569Managing Loading States
Initial value
The argument to `useState(initialValue)` replaces what you assigned in the constructor
Lesson 316From constructor State to useStateLesson 491Creating a Ref with useRefLesson 691Combining Prop and Local State Correctly
Injection overhead
Creating and inserting `<style>` tags blocks the main thread.
Lesson 1931Performance Tradeoffs: Runtime Style Injection
Inline arrow functions
are convenient when you need to pass arguments: `() => handleClick(id)`
Lesson 234Inline Arrow Functions vs Stable References
Inline data scripts
serialized props and state needed for hydration
Lesson 1639Server-Side HTML Structure and Scripts
Inline mapping
keeps everything in the return statement:
Lesson 146Inline vs Extracted Mapping Functions
Inline object types
define the shape directly in the component signature:
Lesson 2332Inline Props Types vs Named Interfaces
Inline selectors
are perfectly fine:
Lesson 861Selector Stability and Performance
Inline snapshots
embed the expected output directly in your test file as a string literal using `toMatchInlineSnapshot()`.
Lesson 2158Inline Snapshots vs External Files
Inline styles
Useful when duration/easing needs to be dynamic (passed as props)
Lesson 1958Adding transition Property to React Components
Inlines
a small `<script>` tag that tells the browser where to insert it
Lesson 1367The Streaming SSR Connection
Input values
`username`, `email`, `password` while typing
Lesson 1683Form State: Almost Always Local
Insert into the DOM
Browser reflows and repaints
Lesson 172Performance Cost of Unstable Keys
Inside `src/`
lives your actual application:
Lesson 61The src Folder Convention
Inside attributes
(like `src={}` or `className={}`)
Lesson 93Interpolation in Attributes vs Children
Inside the effect
Declare `let ignore = false` at the very top, then check `if (!
Lesson 582Implementing the Ignore Flag Pattern
Inspect the element
using DevTools to see its attributes and content
Lesson 1661Debugging Hydration Errors
Install dependencies
`react`, `react-dom`, `webpack`, `webpack-cli`, `babel-loader`, `@babel/preset-react`
Lesson 54Webpack from Scratch
Install the tools
`@graphql-codegen/cli` and relevant plugins
Lesson 1829Apollo Client with TypeScript
Installation
is straightforward via npm or yarn:
Lesson 1769Installation and QueryClient Setup
Instant Recognition
When someone reads `setCount(5)`, they immediately know this updates the `count` state variable.
Lesson 335Naming Convention: [thing, setThing]
Instant server starts
Instead of bundling everything upfront, Vite serves your source files directly using native ES modules.
Lesson 37Why Vite Replaced Create React App
Instead of
forcing state to update synchronously with `flushSync`, let React update naturally and measure in `useLayoutEffect`.
Lesson 449Alternatives to flushSync: Effect-Based Solutions
Intentional one-time effects
where you genuinely want to ignore updates to certain values
Lesson 1022When to Disable exhaustive-deps (Rarely)
Intentional stale closures
You specifically want to capture a value from mount time and never update it, even though technically you're using it.
Lesson 549When to Disable the ESLint Rule
interact
with methods like `click()`, and **assert** with `expect()`.
Lesson 2163Your First Playwright TestLesson 2208Recording a Profile: Start, Interact, Stop
Interact with your app
(click buttons, type in forms, navigate pages)
Lesson 70Profiler Tab: Recording Performance Sessions
Interaction-based splits
Does hovering/clicking trigger small, focused downloads?
Lesson 1427Measuring Real-World Impact
Interactions API
(and its corresponding DevTools tab) was an experimental feature that aimed to track which user actions triggered which component renders.
Lesson 2217Using the Interactions Tab (Legacy)
Intercepting routes
let you "hijack" navigation to show content in a modal while keeping the URL intact for sharing.
Lesson 1891Parallel Routes and Intercepting Routes
Intermediate components become cluttered
with pass-through props they don't care about
Lesson 808Context vs Props: Choosing the Right Tool
Internal helper functions
Private utilities not exposed to users
Lesson 2115What Are Implementation Details?
Internal knowledge required
Users shouldn't need to understand your state management or rendering logic to customize appearance.
Lesson 1163When Inversion Becomes Over-Engineering
Interruption handling
Imagine a modal sliding in with a 300ms duration animation.
Lesson 1990Why Physics-Based Animation vs Keyframe/Duration
Interruptions
User changes direction mid-animation (springs naturally reverse; duration-based animations often snap)
Lesson 2011React Spring for Natural, Physics-Based Motion
IntersectionObserver API
with a ref to the DOM node.
Lesson 740Detecting Visibility with IntersectionObserver
Invalidation
You can invalidate `['todos']` to clear all todo-related queries
Lesson 1771Query Keys: The Cache Identifier
inversion of control
instead of React Aria rendering its own components that you customize, *you* render your components and React Aria customizes their behavior through props.
Lesson 1188React Aria: Adobe's Hooks-Based ApproachLesson 1231The <Formik> Component and Render Props
Inversion of Control (IoC)
means the component author stops making decisions about *how* something should behave, and instead gives that power to the component's consumer.
Lesson 1153What is Inversion of Control in React?
Invisible elements
need testing (analytics trackers, hidden metadata)
Lesson 2064getByTestId: The Escape Hatch
Islands Architecture
treats interactive components as isolated "islands" of interactivity in a sea of static HTML.
Lesson 1650Islands Architecture: Partial Hydration
Isn't obscured
by another element (like a modal overlay)
Lesson 2165Auto-Waiting and Actionability Checks
Isolate boundaries
– New feature areas can use Hooks while old areas stay class-based
Lesson 327When Teams Haven't Migrated Yet
ISR
Meal-prep service—refresh batches periodically, serve from cache between updates
Lesson 1679Decision Matrix: Choosing the Right Rendering Strategy
It doesn't
Your expensive filtering, sorting, or rendering logic takes exactly the same amount of time to execute.
Lesson 1440Transitions Don't Make Code Faster
It suggests missing cleanup
you should cancel in-flight operations
Lesson 575Setting State After Unmount Warning
It usually doesn't matter
Creating functions is cheap.
Lesson 897The Callback Reference Problem
It won't work
Your `TextInput` component won't receive `ref` as a prop.
Lesson 724The Ref Forwarding Problem
It's infrequent
A component that re-renders once on route change doesn't need memoization
Lesson 2237Tracking vs Fixing: When to Act
It's not
Server Components handle *initial, static-ish* data beautifully, but the moment you need **user- driven, dynamic, or real-time updates**, you're back to client-side fetching.
Lesson 1573Client-Side Data Fetching Still Exists
It's wasteful
you're trying to update something that doesn't exist
Lesson 575Setting State After Unmount Warning
Item count
– How many total items exist
Lesson 1279useVirtualizer Hook Basics

J

JavaScript bundle size
(only island code ships)
Lesson 1650Islands Architecture: Partial Hydration
JavaScript class concepts
, not React concepts.
Lesson 311Classes Confuse Both People and Machines
JavaScript Execution
Zero until interaction
Lesson 1651Resumability: Qwik's Alternative to Hydration
JavaScript loads
React code downloads and executes
Lesson 643The Waterfall Problem
JavaScript objects
, you create a single source of truth that's easier to maintain, refactor, and type-check.
Lesson 1945Organizing Theme Tokens in JavaScript
JSON-serializable
convertible to plain text and back again.
Lesson 1552Prop Serialization Across the Boundary
JSX is just sugar
There's no magic, just function calls
Lesson 76JSX Without a Transpiler: The Raw API
JSX Props
Pass pre-rendered JSX elements as props (e.
Lesson 1144JSX Props vs Render Props
JSX syntax
(that friendly HTML-like code)
Lesson 56CDN Script Tags: React Without Build Tools
JSX.Element
Use when your component always returns exactly one JSX element.
Lesson 2338Typing Component Return Values

K

Keep on client
Data triggered by clicks, real-time updates, form submissions
Lesson 648Migration Strategy: Moving Fetches Server-Side
Keep other fields uncontrolled
until needed (partial migration is valid)
Lesson 1203Migration Strategy: Converting Between Approaches
Keep state lifted
where both can access it (accept some re-renders)
Lesson 2315When Lifting Down Breaks Communication
Key disappears
→ React destroys that component instance entirely.
Lesson 151Keys Preserve Component Identity
Key order matters
`{a:1, b:2}` and `{b:2, a:1}` produce different strings
Lesson 639JSON.stringify as a Last Resort
Key-based tracking
(like you provide to list items) would burden you with naming every Hook and add the same hash map overhead.
Lesson 1016The Performance Win of Order-Based Tracking
Keyboard Navigation
Ensure users can Tab through focusable elements and use Arrow keys to scroll.
Lesson 1285Accessibility Considerations
Keyframe animations
require `@keyframes` definitions that live outside any single element's styles.
Lesson 1897What You Can't Do with Inline Styles

L

Lab Data
(synthetic testing) comes from controlled tests you run yourself—using Lighthouse, DevTools profiling, or performance benchmarks in a staging environment.
Lesson 2265Field Data vs Lab Data
Labels
(`getByLabelText`) - form accessibility
Lesson 2033The Guiding Principle: Accessibility First
Language variant
– choose TypeScript or JavaScript
Lesson 38Creating a Vite + React Project
Language/locale
Internationalization touches text everywhere
Lesson 810Context for Truly Global State
Large and self-contained
A PDF viewer, video player, or complex form wizard.
Lesson 1424Component-Level Splitting: When It Helps
Large applications
with hundreds of memoized components
Lesson 925Bundle Size Impact
Large component trees
Your form component renders hundreds of child components that don't use `memo`.
Lesson 1197Performance Implications: Re-renders on Every Keystroke
Large consumer trees
When you have dozens of components consuming context, the re-render cost multiplies.
Lesson 2257Comparing Context Overhead to Alternatives
Large Dependencies
Drill into chunks to see individual libraries.
Lesson 1413Reading a Bundle Analysis Report
Large form validation
Running expensive validation logic across multiple fields.
Lesson 1461Priority in Practice: When You Feel the Difference
Large teams
Standardized patterns and predictable state flow
Lesson 816Context vs State Management Libraries
Large third-party libraries
charting, video players, rich text editors
Lesson 1358Lazy vs Eager: When Each is Right
Largest Contentful Paint (LCP)
Users see a blank page or spinner while waiting for JavaScript to load, parse, execute, and fetch.
Lesson 647The SEO and Performance ImpactLesson 1427Measuring Real-World ImpactLesson 2258Core Web Vitals: LCP, FID, CLS
Layout (Reflow)
Calculates where elements sit on the page—their size, position, and relationship to other elements.
Lesson 2016The Browser's Rendering Pipeline
layout components
that wrap their children (like a sidebar or navigation), while child routes render the specific content inside that layout.
Lesson 1832The Route Tree: Parent and Child RoutesLesson 1838Pathless Routes for Shared Layouts
Lazy import
You wait until the exact moment the component is needed (like when a modal opens).
Lesson 1410The Prefetch/Import Timing Tradeoff
Lazy init
is choosing expensive materials only once when you build the foundation (mount)
Lesson 393Lazy Init vs useMemo: Different Tools
Lazy initialization
runs your function **once, during component mount**, to calculate the *initial* state value.
Lesson 393Lazy Init vs useMemo: Different Tools
LCP (Largest Contentful Paint)
Loading performance
Lesson 2258Core Web Vitals: LCP, FID, CLS
Leaf components first
– Migrate simple presentational components before complex stateful ones
Lesson 327When Teams Haven't Migrated Yet
Learning curve
for new team members
Lesson 1688Avoiding Premature Abstraction
Learning React
without drowning in tooling complexity
Lesson 53Parcel: Zero-Config Bundler
Legacy migration
during a refactor (temporarily, with a TODO comment)
Lesson 1035ESLint Override Comments: When and How
LEGO blocks
precise, granular, infinitely arrangeable.
Lesson 1107Comparing API Styles: Radix vs Headless UI
Less browser reflow/repaint
= better frame rates
Lesson 425The Performance Win from Batching
Less JavaScript to parse
→ faster TTI, because the main thread isn't busy compiling unused code
Lesson 2287Performance Impact of Code Splitting
Less nesting
No wrapper components cluttering your JSX
Lesson 800Replacing Context.Consumer with useContext
Let components opt-in
Each component imports only the context it needs
Lesson 2253Splitting Context by Update Frequency
Libraries and Tools
Need a date picker?
Lesson 30Ecosystem Size as a Decision Factor
Libraries like Relay
have native Suspense integration
Lesson 1346The Suspense-Ready Ecosystem
Library authors
use default values to make their context work without a Provider in simple cases
Lesson 793Default Values vs Provider Values
Library defaults
where the Context works standalone but can be customized
Lesson 795Context Without a Provider
Lifecycle
Mounting/unmounting hooks only run when identity actually changes
Lesson 151Keys Preserve Component Identity
Lifting content up
keeps expensive UI trees stable by passing them as props (especially `children`), which don't change when the wrapper component's state updates.
Lesson 957Combining Techniques: State Down + Content Up
Lifting state up
means hoisting state to `<App>`, then threading props through multiple layers that don't care about them.
Lesson 1700The Problem of Shared State Across Distant Components
Likelihood of use
High-traffic features deserve prefetch.
Lesson 1410The Prefetch/Import Timing Tradeoff
Limitation
When you need multiple insertion points or want to rearrange structure without changing JSX order, children becomes awkward.
Lesson 1150Composability Comparison: Nesting and Flexibility
Limited memory
that struggles with large runtime overhead
Lesson 33Performance-Critical Mobile Web Apps
Linaria
, **vanilla-extract**, and **Panda CSS** shift style extraction to **build time**.
Lesson 1931Performance Tradeoffs: Runtime Style Injection
Lingering subscriptions
never getting canceled
Lesson 601Why React Does This: Finding Missing Cleanup
List animations
Items move naturally when others are added/removed
Lesson 1984Layout Animations with layout Prop
List only those primitives
in the dependency array
Lesson 880Extracting Primitive Values from Objects
Listener leaks
(forgetting to remove old listeners)
Lesson 6Event Listener Spaghetti Code
Lists with IDs
Todos, users, posts — anything with unique identifiers
Lesson 1726Atom Families for Dynamic Collections
Lists without user interaction
(no reordering, no deletions)
Lesson 162The Index-as-Key Pattern and Why It's Common
Live validation feedback
(showing errors as users type)
Lesson 515Recognizing When Controlled is Still Better
Loader-level checks first
Use loaders to check auth *before* rendering
Lesson 1874Common Pitfalls: Redirect Loops and Flash
Loading and error states
Every component reinvents the wheel with its own loading flags and error handling
Lesson 1768TanStack Query: What Problem Does It Solve?
Loading Phase
Component suspends → Suspense boundary shows loading fallback
Lesson 1320Loading-to-Error Transition Design
Loading spinners
Local `isLoading` during a single fetch
Lesson 1685Temporary State: Counters, Timers, Animations
Loading state bugs
(forgot to set loading back to false in one code path?
Lesson 1336The Imperative Loading Problem
Local context
means wrapping only a specific subtree of components with a provider, rather than your entire application.
Lesson 817Local Context for Component Subtrees
Locale/Language
The user's language preference.
Lesson 1690Context for Simple App-Wide State
Localization + Feature Flags
Translating UI while conditionally showing features
Lesson 804Multiple Contexts in One Component
Locators
for elements on that page
Lesson 2170Page Object Model Pattern
Logging priority
– Page errors are high-priority, widget errors are informational
Lesson 1316Contextual Error Messages by Location
Logic Appears Only Once
Lesson 969When NOT to Extract
Logical OR (`||`)
also catches falsy values like `0`, `""`, or `false`.
Lesson 245Default Values vs Nullish Coalescing
Login Flow
Test that users can successfully authenticate, that credentials are validated, and that the app redirects to the appropriate post-login page.
Lesson 2189E2E for Authentication and Authorization Flows
Logout Flow
Ensure logout clears session state and redirects to a public page.
Lesson 2189E2E for Authentication and Authorization Flows
LogRocket
, **Rollbar**, and **Bugsnag** all follow similar integration patterns—they plug into your error boundaries via `componentDidCatch` or provide library wrappers.
Lesson 1333Error Tracking with LogRocket and Other Services
Long render times
on simple list updates
Lesson 176Profiling Key-Related Performance Issues
Long tasks
(>50ms): JavaScript blocking the main thread
Lesson 2021Measuring Frame Rate with DevTools
Long-Term Stability
Companies invest heavily in React.
Lesson 30Ecosystem Size as a Decision Factor
Look for "Context changed"
as the reason
Lesson 2251Measuring Context-Induced Re-renders
Look for lighter alternatives
Search for "lightweight alternative to [library]" or check bundlephobia.
Lesson 1417Finding Unexpectedly Large Dependencies
Lost optimization opportunities
for sibling components that could've updated together
Lesson 447The Performance Cost of flushSync
Lost state
Form inputs lose their values when the list re-orders, or checkboxes toggle the wrong items.
Lesson 161Debugging Key-Related Issues
Low adoption
Few developers used it, and the API required manual instrumentation
Lesson 2217Using the Interactions Tab (Legacy)
Low comparison cost
Checking a few stable props is cheap
Lesson 936memo with Pure Presentational Components
Low-frequency reads
Configuration, feature flags, or authentication status
Lesson 816Context vs State Management Libraries
Low-priority
Features below the fold or in secondary tabs.
Lesson 1424Component-Level Splitting: When It Helps
Low-priority features
settings panels, help documentation
Lesson 1358Lazy vs Eager: When Each is Right
Lower onboarding friction
New developers learn React's core concepts first, not performance workarounds
Lesson 1513Long-Term Impact on React Development
Lower priority
They yield to user input and other urgent updates
Lesson 1457Transition Priority: Background Updates That Can Wait

M

main thread
during the **render phase** — exactly when React needs maximum performance.
Lesson 1950The Runtime CSS-in-JS ProblemLesson 2017Compositor-Only Properties: transform and opacity
Main thread activity
Long yellow blocks are JavaScript execution.
Lesson 2021Measuring Frame Rate with DevTools
Maintain scroll height
Create a container with the total height (as if all items were rendered) so scrollbars work correctly
Lesson 1276What Virtualization Is: Render Only Visible Items
Maintainable tests
Fewer false failures from harmless refactors
Lesson 2038Avoiding Direct State and Props Assertions
Maintaining semantic HTML
(like keeping list items direct children of `<ul>`)
Lesson 107When Fragments Need the key Prop
Maintenance
Refactoring is straightforward—just follow the chain
Lesson 269When Drilling Isn't a ProblemLesson 2199Page Objects in CI: Keeping Tests DRY
Maintenance burden
It's unclear which components actually *use* the data vs just pass it through
Lesson 266What is Prop Drilling?Lesson 820The Component Tree Depth ProblemLesson 1312Avoiding Boundary Overuse
Maintenance nightmare
Component updates require changing every usage site
Lesson 1165The Problem: Too Many Individual Props
Make targeted fixes
Only optimize components that show measurable render cost
Lesson 2247Profiling to Confirm the Problem
Makes the app interactive
without replacing the HTML
Lesson 1642What Hydration Is: Attaching Event Listeners to Server HTML
Manage loading/error states
without extra reducers
Lesson 1738RTK Query: Declarative Data Fetching
Manage the cache
React maintains internal bookkeeping for each memoized value
Lesson 872The Cost of Memoization Itself
Manageable granularity
Not too many chunks, not too few
Lesson 1423Route-Level Splitting: The Sweet Spot
Manages focus programmatically
When you press arrow keys, focus moves between tab triggers automatically.
Lesson 1104Accessibility Built Into Compound Components
Manual cache sync
– after success, you must manually refetch or update your local state to show the change
Lesson 609Optimistic Updates and Mutations Made Simple
Manual revalidation
Explicit cache-busting API calls
Lesson 1571Server Component Caching Behavior
Many layout elements
Animating 50+ elements simultaneously can still overwhelm the system
Lesson 1987Layout Animation Performance
Many props (5+)
Destructuring parameters with 10 props creates a cluttered function signature.
Lesson 244Destructuring vs Direct Access Tradeoffs
Many sibling components
need the same data
Lesson 809The Prop Drilling Threshold
Mapping arrays
where each item renders multiple sibling elements
Lesson 160Fragment Keys
Maps and Sets
have no standard JSON representation.
Lesson 1595Complex Objects: Maps, Sets, and Classes
Marketing sites
Your homepage, about page, pricing page—these rarely change, and when they do, a rebuild is fine
Lesson 1677SSG Trade-offs: Speed vs Freshness
Masking design flaws
Sometimes the warning signals that your logic needs restructuring, not just more dependencies
Lesson 1023Auto-Fix Behavior and Pitfalls
Mass
(default: 1): How heavy the object is.
Lesson 1993Spring Configuration: Tension, Friction, Mass
Math operations
`<Card width={baseWidth * 2} />`
Lesson 220Passing Variables and Expressions
Meaningful
for debugging (you can trace them back to your database)
Lesson 1255Stable IDs: The Gold Standard for Keys
Measurable performance impact
The Profiler shows a commit taking >16ms (causing dropped frames)
Lesson 2237Tracking vs Fixing: When to Act
Measure again
to confirm the improvement
Lesson 875Reading the React Docs on When to Memoize
Measure DOM nodes
(scroll position, element dimensions) and immediately update state based on those measurements
Lesson 432useLayoutEffect: Pre-Paint Synchronous Effects
Measure the impact
Use the Profiler to verify fewer components re-render
Lesson 2253Splitting Context by Update Frequency
Measure the output
using your chosen tool
Lesson 1420Measuring Bundle Size in CI
Measure the specific problem
, not theoretical concerns
Lesson 837Measuring Before Optimizing
Measurements prove
the optimization helps
Lesson 911Clean Code vs Optimized Code
Measures
actual rendered elements via `measureElement`
Lesson 1281Dynamic Item Heights
Media queries
can't be defined inline.
Lesson 1897What You Can't Do with Inline Styles
Medium nesting (3-5 levels)
Slots maintain clarity; children still readable; render props get nested
Lesson 1150Composability Comparison: Nesting and Flexibility
Memoization
is exactly this strategy applied to computation: instead of recalculating the same result every time, you cache (store) the result the first time and return the cached version when the inputs haven't changed.
Lesson 864What is Memoization?
Memoization becomes invisible
No more debates about when to wrap functions or whether a component "deserves" memo
Lesson 1513Long-Term Impact on React Development
Memoization bookkeeping
`useCallback` stores functions and checks dependencies
Lesson 948When the Pattern Adds More Cost Than Value
Memoization stops unnecessary work
If a component re-renders expensively because of new object references, `useMemo` or `React.
Lesson 1470Concurrent Features vs Other Optimizations
Memoize event handlers
passed to each item using `useCallback`
Lesson 946Memoizing Component Lists with Map Callbacks
Memoize the mapping callback
if you create items inline
Lesson 946Memoizing Component Lists with Map Callbacks
Memory allocation
Each cached value sits in memory until the component unmounts
Lesson 872The Cost of Memoization Itself
Memory bloat
Browser DevTools show high memory usage
Lesson 1277When Virtualization is Worth It
Memory consumption
Each DOM node has overhead; thousands add up to significant RAM usage
Lesson 2295The Problem Virtualization Solves
Memory cost
Memoized values stay in memory.
Lesson 905The Cost of Memoization Itself
Merge (default)
Most updates—changing individual properties while preserving others
Lesson 1712The set Function: Merging and Replacing
Merge conflicts decrease
Multiple developers can work on different components without editing the same file.
Lesson 201One Component Per File (Usually)
Message tone
– Apologetic for app crashes, matter-of-fact for widgets
Lesson 1316Contextual Error Messages by Location
Meta's internal tools
Production-ready and actively used
Lesson 1512Compiler Adoption Timeline and Stability
Middle
Integration tests — moderate number of tests checking how components work together
Lesson 2182The Testing Pyramid: Unit, Integration, E2E
Migrate gradually
remove manual `memo()` and `useCallback()` over weeks or months, not days
Lesson 1521Migration Strategy: Incremental Adoption
Minification
Class methods can't be reliably minified because their names might be reflected or dynamically accessed
Lesson 311Classes Confuse Both People and Machines
Minifies
your JavaScript (removes whitespace, shortens variable names)
Lesson 46Building for Production
Minimal abstraction layers
Direct DOM manipulation where React adds indirection
Lesson 28Preact: React's Lightweight Alternative
Minimal rendering
the parent usually just renders its children without adding extra markup
Lesson 1109Creating the Parent Component Shell
Mirrors production patterns
Your component still calls `fetch()` or `axios.
Lesson 2085Why MSW Over Manual Mocks
Missing assets
Images or files that didn't copy correctly to `dist`
Lesson 47Previewing the Production Build
Missing cleanup functions
(event listeners that pile up, timers that keep running)
Lesson 597What StrictMode Does: Intentional Double-Mounting
Missing server IDs
If your data has `id: 123` from the server but you're using array indices as keys, DevTools makes the mismatch obvious.
Lesson 1252Debugging Key Stability Issues
Missing the point
If props should trigger actions, that logic belongs in the parent or in direct render logic
Lesson 683The Props-Change-Triggers-Effect Antipattern
Mobile 3G
Aim for <170KB gzipped (parses in ~1 second)
Lesson 1421Bundle Budget Strategy: Setting Thresholds
Mobile networks
sometimes force buffering for optimization
Lesson 1671Streaming SSR Browser Support and Fallbacks
Mobile performance matters
Every kilobyte affects load time on slow networks
Lesson 28Preact: React's Lightweight Alternative
Mobile struggles
Works on desktop but crawls on phones
Lesson 1277When Virtualization is Worth It
Mobile users
on slow connections where every byte counts
Lesson 925Bundle Size Impact
Mock the module
containing your hook
Lesson 2080Mocking Custom Hooks
Mocking `useLocation`
to simulate current route state:
Lesson 2079Mocking React Router Hooks
Mocking `useNavigate`
to verify navigation calls:
Lesson 2079Mocking React Router Hooks
Mocking `useParams`
to provide route parameters:
Lesson 2079Mocking React Router Hooks
Modal content
Reset when showing different modal contexts
Lesson 692Refactoring Effect-Based Syncing to Key Prop
Modal dialogs
focus the first field when a modal opens via button click
Lesson 734Imperative Focus in Event Handlers
Modals and dialogs
Focus the first input when opened
Lesson 733Auto-focusing Inputs on Mount
Model-View-Controller
architecture to the browser, giving developers a way to organize their code.
Lesson 20Backbone.js: MVC in the Browser
Models
that fired change events when data updated
Lesson 20Backbone.js: MVC in the Browser
Moderate complexity
where you need structured updates and centralized logic, but you're not coordinating dozens of reducers or middleware chains.
Lesson 785When This Pattern Beats External State Libraries
Moderate updates
(user profile): `staleTime: 1-5 minutes`
Lesson 1774Cache Staleness: staleTime Explained
module boundary
the point where your code transitions from server execution to client execution.
Lesson 1535What 'use client' Actually DeclaresLesson 1537The Module Boundary, Not Component Boundary
Module mocking
lets you replace these dependencies with controlled, predictable substitutes:
Lesson 2075Why Module Mocking is Necessary in Tests
Monolithic components
Cram everything into one massive component with limited customization
Lesson 1077What Are Compound Components?
Most of the time
, if ESLint complains, you have a real violation:
Lesson 1035ESLint Override Comments: When and How
Mount
happens when a component first appears on the screen.
Lesson 296The Three Lifecycle Phases: Mount, Update, Unmount
Mounted flag
to avoid setting state after unmount:
Lesson 707Common Use Case: Counters and Flags
Mouse/touch coordinates
for drag-and-drop
Lesson 813When NOT to Use Context: Frequent Updates
Move to server
Initial page data, user profiles, product lists
Lesson 648Migration Strategy: Moving Fetches Server-Side
Moving state down
reduces the scope of re-renders by placing state in the smallest component that needs it.
Lesson 957Combining Techniques: State Down + Content UpLesson 2313Moving State to the Component That Owns It
MSW intercepts the request
, the component renders with loading UI, then `findByText` waits for "Alice" to appear once the mocked response resolves.
Lesson 2091Testing Components That Fetch on Mount
Multi-line strings
They preserve line breaks naturally
Lesson 87Template Literals Inside JSX
Multi-step flows
move focus to the next input after completing one
Lesson 734Imperative Focus in Event Handlers
Multi-step logic
where you need intermediate calculations
Lesson 129Immediately Invoked Function Expressions (IIFEs) in JSX
Multi-step wizards
Move to the next step programmatically after validation passes
Lesson 1856Programmatic Navigation with useNavigate
Multiple Branches
When you have three or more possible outcomes, chained ternaries become cryptic:
Lesson 125When Simple Conditionals Break Down
Multiple calls
Each state value gets its own `useState` line
Lesson 316From constructor State to useState
Multiple components
use the same hooks — React would need component-specific namespaces
Lesson 1012Why Hooks Can't Use Names or IDs
Multiple consumers
scattered throughout different branches of the tree
Lesson 828The Scope of Consumer Re-renders
Multiple contexts are cleaner
Just call `useContext` multiple times instead of nesting Consumers
Lesson 800Replacing Context.Consumer with useContext
Multiple discrete options
(4+ cases)
Lesson 130Switch Statements in IIFEs
Multiple DOM commits
trigger additional browser layout/paint cycles
Lesson 447The Performance Cost of flushSync
Multiple mismatches
listed together (not just the first one)
Lesson 1517Stricter Hydration Error Reporting
Multiple named areas
(header, sidebar, footer, toolbar)
Lesson 1148When Slots Win: Multiple Named Insertions
Multiple render passes
instead of one batched pass
Lesson 447The Performance Cost of flushSync
Mutable Values
When you need a "box" to hold a value that persists across renders without causing re-renders
Lesson 2383Typing useRef: Mutable Values vs DOM Refs
Mutate the DOM directly
to prevent flicker (like positioning a tooltip)
Lesson 432useLayoutEffect: Pre-Paint Synchronous Effects
Mutation-triggered
Server Actions or API routes that modify data
Lesson 1571Server Component Caching Behavior
Mutations
are more powerful in TanStack Query with built-in optimistic update patterns, but require more setup than SWR's simpler approach.
Lesson 1811Migration Considerations: SWR to TanStack Query
Mystery bugs
(which listener fired?
Lesson 6Event Listener Spaghetti Code

N

N elements
from a single hook call, where each element gets its own independent spring animation.
Lesson 1995useSprings: Animating Multiple Elements
Name-based tracking
would require a hash map lookup on every Hook call.
Lesson 1016The Performance Win of Order-Based Tracking
Named functions work differently
When you extract a handler into a separate function, TypeScript no longer has that contextual connection.
Lesson 2351Inline Event Handlers vs Named Functions
Named interfaces
extract the type definition:
Lesson 2332Inline Props Types vs Named Interfaces
Named props
work better when:
Lesson 250Children vs Explicit Props
Naming convention
Does the calling function start with `use` or is it a PascalCase component?
Lesson 1019The rules-of-hooks Rule
Native ESM Support
Vitest runs modern JavaScript code the way browsers actually execute it—no transform layer needed.
Lesson 2024Why Vitest Over Jest for Modern React
Natural composition
Adding icons, badges, or complex layouts inside menu items becomes trivial—they're just children.
Lesson 1086Advantages Over Monolithic Components
Natural deceleration
Real-world objects don't move in linear or even ease curves—they have mass and momentum.
Lesson 1990Why Physics-Based Animation vs Keyframe/Duration
Natural defaults
Every parent with children can have a sensible starting point
Lesson 1836Index Routes: Default Child Content
Navigating between routes
When you leave a page, its components unmount and lose state.
Lesson 363Unmounting Destroys State
Navigation changes
Reset when the URL path changes so errors don't persist across pages.
Lesson 1327resetKeys for Automatic Recovery
Nest timelines
within timelines for modular animation logic
Lesson 2012GSAP for Complex Timeline Animations
Nested combinations
`{ users: [{ id: 1 }, { id: 2 }] }`
Lesson 1552Prop Serialization Across the Boundary
Nested Logic
When you nest ternaries or mix `&&` with ternaries, you create a mental maze:
Lesson 125When Simple Conditionals Break Down
Nested routes
allow you to embed routes within other routes, creating a parent-child relationship that mirrors your URL structure.
Lesson 1831What Nested Routes Are and Why They Matter
Network is unreliable
High failure rates make optimistic updates frustrating
Lesson 1802Pessimistic vs Optimistic: When to Choose
Network negotiation overhead
(DNS lookup, connection, headers)
Lesson 1426The Cost of Over-Splitting
Never generate random keys
(like `Math.
Lesson 154What Makes a Good Key
Never modifies external variables
during rendering
Lesson 179Components are Pure Functions of Props
New codebase
Start with plain functions—it's the direction React is heading
Lesson 2396Team Conventions: Picking a Style
New key appears
→ React creates a fresh component instance from scratch.
Lesson 151Keys Preserve Component Identity
new object
each render, causing an infinite loop if `fetchData` triggers a state update.
Lesson 628Missing Memoization on Complex DependenciesLesson 1096Context Memoization in Compound Components
new references
on every parent render, even if their content is identical.
Lesson 901Stabilizing Props to Memoized ComponentsLesson 2274memo + Stable Props Pattern
Next.js/Remix loaders
Use `getServerSideProps`, `getStaticProps`, or Remix loaders for route-level data
Lesson 648Migration Strategy: Moving Fetches Server-Side
No Action Logs
There's no automatic record of what caused state changes.
Lesson 1696Context Limitations: No DevTools
No array
Effect runs after every render (default behavior)
Lesson 536What is the Dependency Array?
No awkward redirects
Instead of redirecting `/dashboard` to `/dashboard/home`, serve content directly
Lesson 1836Index Routes: Default Child Content
No background refetching
Data goes stale, but you'd never know.
Lesson 605The Problem with Manual useEffect Data Fetching
No built-in server-side rendering
support
Lesson 49Create React App: The Legacy Standard
No cache invalidation strategy
– stale data lives forever
Lesson 1345Suspense Without a Data Library
No complex logic needed
You're not transforming, filtering, or manipulating what's passed in
Lesson 1147When Children is Enough
No component escapes
If it uses `useContext` for that specific Context, and it's rendered under that Provider, it *will* re- render when the value changes.
Lesson 828The Scope of Consumer Re-renders
No coordination
between components loading related data
Lesson 1336The Imperative Loading Problem
No data flow pattern
How do you pass different options to each dropdown instance?
Lesson 8Component Reusability Before React
No Dispatch Tracking
If multiple components update the same context, you can't easily trace who did what when.
Lesson 1696Context Limitations: No DevTools
No encapsulation
Your dropdown's HTML, CSS, and JavaScript lived in separate files.
Lesson 8Component Reusability Before React
No error handling
– what if the promise rejects?
Lesson 1345Suspense Without a Data Library
No exposed endpoints
Your database queries never become public APIs
Lesson 1551Data Flow: Server Components Have Direct Backend Access
No hidden complexity
No side effects, context subscriptions, or timers to worry about
Lesson 936memo with Pure Presentational Components
No magic
No hidden subscriptions or re-render surprises
Lesson 823When Prop Drilling is Actually Fine
No manual state management
in the parent component
Lesson 1494Building Disabled Submit Buttons
No mount/unmount animations needed
The element stays in the DOM, just changing styles (hover states, focus rings, color shifts).
Lesson 1978When Framer Motion is Overkill
No naming debates
("Do we call this `PrimaryButton` or `MainButton` when importing?
Lesson 199Named Exports vs Default Exports
No parameters yet
(we'll add those later)
Lesson 178Your First Function Component
No performance concern
Re-renders on change are acceptable because changes are rare
Lesson 1690Context for Simple App-Wide State
No Provider
Atoms are global, shared across the whole app
Lesson 1727The Provider Component (When Needed)
No provider nesting
state lives outside React's tree
Lesson 2328When to Move to External State
No refetching logic
– can't trigger updates
Lesson 1345Suspense Without a Data Library
No request deduplication
– multiple components trigger duplicate fetches
Lesson 1345Suspense Without a Data Library
No runtime at all
Tailwind generates static CSS at build time.
Lesson 1953Tailwind's Rise as the Pragmatic Middle Ground
No scroll performance issues
If users aren't complaining and DevTools shows smooth rendering, you don't have a problem
Lesson 2301When Virtualization Isn't Worth It
No serialization concerns
You're not converting between formats multiple times
Lesson 1551Data Flow: Server Components Have Direct Backend Access
No shared UI exists
Each page has completely different layouts
Lesson 1842When to Nest vs Flatten Routes
No State Inspector
You can't see the current value of your contexts in a dedicated panel.
Lesson 1696Context Limitations: No DevTools
No static optimization
Because styles are in JavaScript, build tools can't extract, deduplicate, or preload them as separate `.
Lesson 1931Performance Tradeoffs: Runtime Style Injection
No surprises
Just calculate and return JSX based on current props and state
Lesson 428Render Phase: Pure Calculation
No synthetic event system
Uses native browser events directly
Lesson 28Preact: React's Lightweight Alternative
No Time-Travel Debugging
When a bug happens after five user interactions, you can't "rewind" to see what the state looked like three steps ago.
Lesson 1696Context Limitations: No DevTools
No true cancellation
The work happens anyway
Lesson 583When Ignore Flags Aren't Enough
No user impact
If users can't perceive the slowness, your time is better spent elsewhere
Lesson 2237Tracking vs Fixing: When to Act
Noise
80% of these components don't *care* about `userImage`
Lesson 820The Component Tree Depth Problem
Non-blocking
They won't freeze the UI while computing
Lesson 1457Transition Priority: Background Updates That Can Wait
Non-critical
The app remains useful even if this feature is temporarily down
Lesson 1310Feature-Level Boundaries
Non-render code
Anything that doesn't directly return JSX
Lesson 2293Dynamic Imports Without Suspense
non-urgent
, allowing React to keep the UI responsive while the server processes your action.
Lesson 1607Server Actions in Non-Form Contexts: startTransitionLesson 2304Basic useTransition Pattern: Search Input Example
Non-urgent updates (transitions)
Secondary effects like filtering results, updating charts, or changing views
Lesson 2302What useTransition Does: Marking Updates as Non-Urgent
Notice
slowness (or suspect a problem)
Lesson 2277When to Profile Before Optimizing
Notifications
changes very frequently, read only by notification bell
Lesson 839Identifying Independent State Domains
Notifications Context
Alerts, messages (frequent)
Lesson 1692Multiple Contexts for Performance
Nullish coalescing (`??`)
applies when the prop is `undefined` *or* `null`.
Lesson 245Default Values vs Nullish Coalescing
Number of renders
How many times React re-rendered
Lesson 2115What Are Implementation Details?

O

Object properties
`<Card name={user.
Lesson 220Passing Variables and Expressions
Objects and arrays
compared by reference, not contents
Lesson 914Shallow Equality Explained: Object.is on Props
Objects, arrays, functions
compare by reference—new ones created each render are considered "changed," even if their contents are identical.
Lesson 896Why Dependencies Care About References
Observable
This is when you'd actually see changes appear in the browser
Lesson 412The Commit Phase: Applying Changes to the DOM
old
object reference to the **new** one, sees they're different (even though `userId` hasn't changed), and runs the effect.
Lesson 624Object Dependencies Causing LoopsLesson 1443The Basic useDeferredValue Pattern
Old way (waterfall)
You wait in line.
Lesson 643The Waterfall Problem
Older browsers
may not handle streamed responses properly
Lesson 1671Streaming SSR Browser Support and Fallbacks
On first render
, the wrapper executes your import function, which returns a **Promise**
Lesson 1348What React.lazy() Does Under the Hood
On interval
You can configure periodic polling (disabled by default, but easy to enable).
Lesson 1807Automatic Revalidation Strategies
On network reconnect
User's WiFi comes back online?
Lesson 1807Automatic Revalidation Strategies
On the client
during hydration to attach event handlers and make the page interactive
Lesson 1524Server Components Run Once, Not TwiceLesson 1655Common Cause: Browser-Only APIs
On window focus
User switches back to your tab?
Lesson 1807Automatic Revalidation Strategies
On-demand revalidation
"Regenerate this specific page right now" (triggered by webhooks, CMS updates, or Server Actions via `revalidatePath`/`revalidateTag`).
Lesson 1678Incremental Static Regeneration (ISR): Hybrid Freshness
One folder per context
(or one file for simple cases):
Lesson 796Organizing Context Files
One handler
instead of four (or ten!
Lesson 383Form State: When Objects Win
Only uses its props
to determine what to render
Lesson 179Components are Pure Functions of Props
Opt-in children
means you only install doors where they belong, making the architecture's intent obvious at a glance.
Lesson 2394Children: Opt-In vs Implicit
Optimistic updates
instantly update the UI as if the server will succeed, then roll back if it fails.
Lesson 1802Pessimistic vs Optimistic: When to Choose
Optimistic updates and mutations
with rollback logic
Lesson 1482When use() Fits vs TanStack Query or Loaders
Optimize dependencies
Replace large libraries with lighter alternatives
Lesson 1421Bundle Budget Strategy: Setting Thresholds
Optimizes
images and assets
Lesson 46Building for Production
Optimizes the file
(compression, format conversion)
Lesson 45Static Asset Handling
Option 2: After ejecting
(if you've run `npm run eject`):
Lesson 1414Setting Up webpack-bundle-analyzer
Optional override props
– Test values or partial overrides of the context state
Lesson 2378Typing Provider Component Props
Order becomes unpredictable
React doesn't guarantee the order components render in, and it might pause and resume rendering.
Lesson 527Why Side Effects Can't Run During Render
Organic feel
Menus that bounce slightly, elements that settle with subtle oscillation
Lesson 2011React Spring for Natural, Physics-Based Motion
Organize
complex interfaces into manageable pieces
Lesson 182Components Can Call Other Components
Other effects
– also run after the DOM is ready
Lesson 715Accessing current After Mount
Out-of-order streaming
breaks this constraint: React can send faster Suspense boundaries *first*, even if they appear *later* in the tree, then inject slower boundaries into their correct positions when ready.
Lesson 1669Out-of-Order Streaming
Outdated tooling
as the project became harder to maintain
Lesson 49Create React App: The Legacy Standard
outside
the component (if it's static) or **memoize it** with `useMemo` (if it depends on props/state):
Lesson 634The Inline Object AntipatternLesson 996Testing Composed Custom HooksLesson 1668The onShellReady and onAllReady Callbacks
Overhead reduction
Paradoxically, the compiler often generates *fewer* memoization wrappers than defensive manual code.
Lesson 1508Compiler vs Manual: Performance Comparison

P

Page Object Model (POM)
is a design pattern where you create classes (or plain objects) that represent pages or components in your app.
Lesson 2170Page Object Model Pattern
Paint storms
Excessive paint operations (green blocks)
Lesson 2021Measuring Frame Rate with DevTools
Panda CSS
shift style extraction to **build time**.
Lesson 1931Performance Tradeoffs: Runtime Style Injection
Parallel fetching
happens when you start all fetches simultaneously:
Lesson 1579Sequential vs Parallel Data Fetching
Parallel placement
(not hierarchical nesting)
Lesson 1148When Slots Win: Multiple Named Insertions
Parameter annotation
Tell TypeScript the destructured props match that interface
Lesson 2329Basic Function Component Type Annotation
Parameters
Each callback receives the mutation result (`data` or `error`), the `variables` you passed to `mutate()`, and `context` (for advanced patterns).
Lesson 1793Mutation Callbacks: onSuccess, onError, onSettled
Parent creates provider
`<Dialog>` renders a context provider with state like `open`, `setOpen`, `triggerId`
Lesson 1101Context-Based State Sharing in Radix
Parent provides
the root component (`Tabs`) wraps children with `Provider`
Lesson 1090Creating a Private Context for Compound Components
Parent rendered
Whether this was just a cascade from a parent re-rendering
Lesson 2225Comparing Renders: Why Did This Update Happen?
Parse time
The browser must read and understand all that code
Lesson 1556The Traditional SPA Performance Problem
Parsed size
After minification (most relevant)
Lesson 1413Reading a Bundle Analysis Report
Parsing and evaluation time
by the JavaScript engine
Lesson 1426The Cost of Over-Splitting
Parsing cost
JavaScript must parse your style definitions at runtime.
Lesson 1931Performance Tradeoffs: Runtime Style Injection
PascalCase.jsx
is trending as the most popular in modern React projects because it matches component names exactly, but many established codebases use `index.
Lesson 200File Naming Conventions
Pass 1 (Server)
Generates static HTML that's sent to the browser immediately
Lesson 1643The Two-Pass Process: Server Render, Then Client Hydrate
Pass 2 (Client)
Re-renders the component tree in memory to attach event listeners and interactivity
Lesson 1643The Two-Pass Process: Server Render, Then Client Hydrate
Pass to client
Send the dehydrated state as props to your page component
Lesson 1820Prefetching tRPC Queries on the Server
Passing arguments
You can't directly pass arguments in `onClick={func}` syntax
Lesson 235The onClick={() => func()} Pattern
Passing props through
If you're spreading remaining props (`{.
Lesson 244Destructuring vs Direct Access Tradeoffs
Payment processing
Does clicking "Pay" trigger the right API call, process through Stripe, update your database, and show confirmation?
Lesson 2185E2E Tests for Integration Points
Per-chunk targets
Route chunks over 75KB trigger investigation.
Lesson 1421Bundle Budget Strategy: Setting Thresholds
Per-route chunks
Keep under 50-100KB each
Lesson 1421Bundle Budget Strategy: Setting Thresholds
Perfect for
Medium-sized apps, teams wanting productivity without complexity, projects that outgrew Context but don't need Redux's ceremony.
Lesson 1718Zustand vs Context vs Redux: The Tradeoffs
Perform complex transformations
(heavy calculations, data parsing)
Lesson 1311Component-Level Boundaries for Risky Code
Performance compromises
where you can't share state without triggering unwanted updates
Lesson 2328When to Move to External State
Performance cost
Stringifying large objects on every render is expensive
Lesson 639JSON.stringify as a Last ResortLesson 1012Why Hooks Can't Use Names or IDs
Performance critical apps
Fine-grained control over re-renders
Lesson 816Context vs State Management Libraries
Performance hits
React can't optimize efficiently
Lesson 142The Key Prop Requirement
Performance overhead
you may not need
Lesson 1688Avoiding Premature Abstraction
Performance profiling
Measuring actual impact by comparing optimized vs unoptimized
Lesson 1507The 'use memo' Directive (Opt-Out)
Performance suffers
(changes trigger unnecessary re-renders in unrelated parts of the tree)
Lesson 1681Colocation: Keep State Close to Where It's Used
Performance-Critical Applications
When every millisecond of runtime JavaScript matters (e-commerce, mobile experiences), vanilla-extract's zero-runtime footprint means no style injection, no dynamic class generation, just static CSS your browser caches efficiently.
Lesson 1941When vanilla-extract Fits Best
Performance-critical scenarios
Mobile devices, high-frequency updates, or animations running constantly.
Lesson 1978When Framer Motion is Overkill
Persistent
across page reloads and API refetches
Lesson 1255Stable IDs: The Gold Standard for Keys
Persistent UI
parent elements stay mounted while children swap
Lesson 1831What Nested Routes Are and Why They Matter
Personalization
Since the server sees the request context (who's logged in, their preferences, location), it can render "Welcome back, Sarah!
Lesson 1674Server-Side Rendering (SSR): HTML on Every Request
Personalized pages
User dashboards, account settings, shopping carts — content that differs per user and needs immediate visibility.
Lesson 1675SSR Trade-offs: Server Cost vs Time-to-Content
Pessimistic updates
wait for the server to confirm success before updating the UI.
Lesson 1802Pessimistic vs Optimistic: When to Choose
Plain `.map()`
Every item should render, no filtering or flattening needed
Lesson 149Alternatives to .map(): .filter() and .flatMap()
Plain objects
`{ name: "Alice", age: 30 }`
Lesson 1552Prop Serialization Across the Boundary
Plain strings
`<Suspense fallback="Loading.
Lesson 1369What the fallback Prop Accepts
Playback controls
Pause, reverse, restart, or seek anywhere
Lesson 2000Why GSAP for React: Imperative Animation Power
Plugins
Extensions that add functionality (like JSX transformation)
Lesson 42vite.config.js: Build Configuration
Poor naming (implementation-focused)
Lesson 205Component Naming for Clarity
Position with transforms
Use CSS positioning to place visible items at their correct scroll position
Lesson 1276What Virtualization Is: Render Only Visible Items
Post-submission redirects
After creating a resource, send users to the new item's detail page
Lesson 1856Programmatic Navigation with useNavigate
Pre-compiler codebases
Legacy optimizations that worked around old React limitations might outperform compiler output until refactored
Lesson 1508Compiler vs Manual: Performance Comparison
Precise failure diagnosis
When a hook test fails, you know the problem is in the hook itself
Lesson 2095Why Testing Hooks in Isolation Matters
Predictable chunks
One route = one chunk = easy mental model
Lesson 1423Route-Level Splitting: The Sweet Spot
Predictable output
Same props always produce the same UI
Lesson 936memo with Pure Presentational Components
Predictable state
Always know what's in the input by checking state
Lesson 1195Controlled Forms: Single Source of Truth Principle
Predictable state transitions
based on action types
Lesson 751When You'd Reach for Redux but It's Overkill
Predictable structure
URL paths mirror component nesting
Lesson 1831What Nested Routes Are and Why They Matter
Predictable Updates
One `dispatch(action)` flows through all reducers.
Lesson 1743Large-Scale Apps with Many Interconnected Features
Prefetching
means loading chunks *in advance* during idle time.
Lesson 2290Prefetching Split Chunks
Preload
the lazy component when the user *hovers* over the button or link, but before they click.
Lesson 1356Preloading Lazy Components on Hover
Presentation is unpredictable
You're building reusable logic but have no idea how consumers will display the data.
Lesson 1052When Render Props Add Value
Preserve component state
(useState, focus, scroll position)
Lesson 1254Keys and React's Reconciliation Algorithm
Preserve context during transitions
If your loading fallback shows "Loading user profile.
Lesson 1320Loading-to-Error Transition Design
Preserved Layouts
The most sophisticated approach maintains the overall page structure.
Lesson 1342The fallback Prop: Spinners and Skeletons
Preserving return-to URLs
means remembering their original destination and completing their interrupted trip.
Lesson 1870Preserving Return-To URLs
Prevent it entirely
by returning the current state unchanged
Lesson 1181Common Use Cases: Preventing Transitions
Preventing immediate execution
Writing `onClick={func()}` calls the function right away during render, not when clicked
Lesson 235The onClick={() => func()} Pattern
Preventing stale data bugs
without manual refetch logic
Lesson 1807Automatic Revalidation Strategies
Prevents
re-insertion if the same script is rendered by different components
Lesson 1519Async Scripts with Direct Support
Prevents the silent bugs
from hook call order misalignment before they reach production
Lesson 1017What eslint-plugin-react-hooks Does
Primitive calculations
`const doubled = count * 2`
Lesson 906When Simple Values Don't Need useMemo
Prioritize optimizations
You know exactly where your effort will have impact.
Lesson 2213Filtering Commits by Duration Threshold
Privacy policy sections
(numbered clauses that never reorder)
Lesson 1257Index Keys in Read-Only Lists
Process user-uploaded data
(parsing files, handling complex input)
Lesson 1311Component-Level Boundaries for Risky Code
Product details section
(image, title, price) — loads together
Lesson 1380Finding the Right Granularity
Product pages
Individual product details that are stable
Lesson 1677SSG Trade-offs: Speed vs Freshness
Production complaints
Real users report sluggishness in specific workflows
Lesson 2237Tracking vs Fixing: When to Act
Production optimization
Manually configure minification, code splitting, and bundling strategies
Lesson 54Webpack from Scratch
Profile
with React DevTools to confirm and measure
Lesson 2277When to Profile Before Optimizing
Profile without `memo`
Record a typical user interaction.
Lesson 930Profiling Before and After memo
Profile/detail views
Clear data when switching between users/products
Lesson 692Refactoring Effect-Based Syncing to Key Prop
Profiler recordings
one before splitting contexts, and one after.
Lesson 844Measuring Impact with React DevTools Profiler
Profiler shows
multiple components updating when only one needed to
Lesson 951Identifying Over-Hoisted State
Profiling confirms slowness
(not gut feeling)
Lesson 696useMemo for Expensive Computations
Progressive disclosure
is your friend: provide sensible defaults that work out-of-the-box, but allow power users to override specific behaviors through props or slots when needed.
Lesson 1154The Flexibility vs Simplicity Tradeoff
Progressive hydration on interaction
means delaying hydration until the user actually tries to interact with that component—clicking a button, hovering, focusing an input, etc.
Lesson 1649Progressive Hydration: Hydrating on Interaction
Progressive migration
where you add Providers gradually
Lesson 795Context Without a Provider
Progressive Rendering
As chunks of HTML arrive, browsers start parsing and displaying them immediately.
Lesson 1641renderToString vs renderToPipeableStream: The Modern ChoiceLesson 1664renderToPipeableStream for Node.js
Progressive web apps
Where offline cache size matters
Lesson 28Preact: React's Lightweight Alternative
Project name
– what you want to call your app
Lesson 38Creating a Vite + React Project
Prop conditions
Render `sidebar` only if `showSidebar` prop is true
Lesson 1143Conditional Rendering of Prop Content
Prop drill
through multiple layers (painful)
Lesson 1778Sharing Data Across Components
Prop drilling
happens when you need to pass props through several intermediate components that don't actually use those props themselves—they're just relay stations passing data down to deeply nested children.
Lesson 266What is Prop Drilling?Lesson 267A Simple Drilling ExampleLesson 777The Global State Problem That useReducer + Context SolvesLesson 787What is Context and Why It ExistsLesson 1700The Problem of Shared State Across Distant Components
Prop drilling hell
Pass every piece of state down through multiple levels
Lesson 1077What Are Compound Components?
prop explosion
when a component becomes a Swiss Army knife of configuration options.
Lesson 196Component Composition vs Prop ExplosionLesson 1106Why These Libraries Choose Compound Patterns
Prop name
in camelCase (like regular JavaScript variables)
Lesson 213Basic Prop Syntax: Passing Values
Propagation to children
Framer Motion automatically propagates variant names down the component tree—child `motion` elements can respond to parent state changes without prop drilling.
Lesson 1973Variants: Named Animation States
Props are grouped together
React bundles them into a single object, the second argument to `createElement`
Lesson 219Props vs Attributes: JSX Transformation
Props are passed down
through components that don't read them (prop drilling to one branch)
Lesson 951Identifying Over-Hoisted State
Props changes
Which props received new values (and what those values were)
Lesson 2225Comparing Renders: Why Did This Update Happen?
Props flow downward
from parent components.
Lesson 229Shallow Immutability: Objects and Arrays
Props interface
Define the shape of your props object
Lesson 2329Basic Function Component Type Annotation
Protected Routes
Navigate directly to routes that require authentication while logged out.
Lesson 2189E2E for Authentication and Authorization Flows
Prototyping and small applications
The developer experience advantage is real.
Lesson 1955When Runtime CSS-in-JS Still Makes Sense
Provider
is a component that wraps part of your tree and supplies a value.
Lesson 789The Context Object Structure
Provider file
(`UserProvider.
Lesson 796Organizing Context Files
Pseudo-classes
like `:hover`, `:focus`, or `:active` don't work.
Lesson 1897What You Can't Do with Inline Styles
Pseudo-elements
like `::before` and `::after` are impossible.
Lesson 1897What You Can't Do with Inline Styles

Q

Query functions
like `getByText`, `queryByRole`, `findByLabelText`—tools to locate elements the way users would
Lesson 2043The render Function from RTL
Query hooks
return an object containing:
Lesson 1739RTK Query: Auto-Generated Hooks
Quick prototypes
where setup time matters more than build optimization
Lesson 53Parcel: Zero-Config Bundler
Quick returns
If a user navigates back within `cacheTime`, the data is *instantly* available (even if stale)
Lesson 1783The cacheTime Configuration

R

race condition
in data fetching occurs when you trigger multiple async requests (like fetches), but they complete in a different order than they were sent.
Lesson 578What Race Conditions Are in Data FetchingLesson 579The Fast-Click Search Box ProblemLesson 672Testing Render vs Effect Approaches
Race condition prevention
(ignore flags or `AbortController`)
Lesson 605The Problem with Manual useEffect Data Fetching
race conditions
whichever fetch finishes last wins, regardless of which request was made most recently.
Lesson 574The Stale Closure ProblemLesson 577Why This Pattern is Problematic at ScaleLesson 1345Suspense Without a Data Library
Racing conditions
(take the first response, ignore others)
Lesson 1746Middleware-Heavy Workflows: Sagas, Observables, Complex Async
Radix UI
embraces explicit composition through named parts and dot notation, giving you granular control over each piece.
Lesson 1107Comparing API Styles: Radix vs Headless UI
Rapid state changes
Interrupting FLIP calculations before completion
Lesson 1987Layout Animation Performance
Rare usage
If you only use a prop once deep in the function, destructuring it upfront feels premature.
Lesson 244Destructuring vs Direct Access Tradeoffs
Rarely changes
(configuration): `staleTime: Infinity` (never stale)
Lesson 1774Cache Staleness: staleTime Explained
Re-creates
new instances with the new data
Lesson 166Performance Implications of Bad Keys
Re-executing all your JSX
with the new state
Lesson 342How setState Triggers Re-renders
Re-measures
when content changes
Lesson 1281Dynamic Item Heights
Re-mounts the component tree
, giving it a fresh attempt to render
Lesson 1324The resetErrorBoundary Function
Re-triggered effects
(useEffect cleanup and re-run)
Lesson 1245Why Keys Must Be Stable Across Renders
React attaches a handler
to the Promise's `.
Lesson 1339How Suspense Detects 'Not Ready'
React batches state updates
in event handlers and lifecycle methods.
Lesson 384Performance: Object vs Multiple Variables
React compares it
to the previous Virtual DOM (this comparison is called "diffing")
Lesson 12The Virtual DOM Concept
React elements
(directly—though Server Components as children works differently)
Lesson 1552Prop Serialization Across the Boundary
React Hook Form
0 React component re-renders (only DOM updates)
Lesson 1227Performance Comparison: RHF vs Controlled
React Native
renders to native mobile UI (iOS/Android)
Lesson 14Learn Once, Write Anywhere
React re-renders
, feeding the new state back to `value`
Lesson 465Controlled: State Drives the DOM
React reconciliation cost
Every re-render must diff thousands of elements
Lesson 2295The Problem Virtualization Solves
React Router
handles navigation state and URL parameters through hooks like `useNavigate` and `useParams`.
Lesson 1004When Framework Libraries Obviate Custom Hooks
React Runtime
Always present if you have *any* Client Components or interactivity.
Lesson 1534What 'No JS' Really Means: The Nuance
React Server Components
Fetch directly in the component body (if using RSC)
Lesson 648Migration Strategy: Moving Fetches Server-Side
React Server Components (RSC)
, Suspense lets the server stream HTML progressively—sending the shell immediately while slower components "suspend" and arrive later.
Lesson 1368Client-Only Apps: Limited Suspense UtilityLesson 1932Migration Path: When to Consider Alternatives
React Spring
Best when the animation needs to *feel physical* rather than *look designed*
Lesson 2011React Spring for Natural, Physics-Based Motion
React Transition Group
that handle this delay logic for you.
Lesson 1965Limitations: No Mount/Unmount Animations
React VR
renders to virtual reality environments
Lesson 14Learn Once, Write Anywhere
react-window
(by Brian Vaughn) was the go-to library for list virtualization.
Lesson 1284Virtualization with react-window (Legacy)Lesson 2296React Window vs React Virtualized
React.lazy() wraps it
in a component that manages loading states
Lesson 1348What React.lazy() Does Under the Hood
React's advantage
Better performance in *complex* applications with frequent, large-scale updates.
Lesson 25Svelte: Compile-Time Reactivity
ReactDOM
renders to web browsers (HTML/CSS)
Lesson 14Learn Once, Write Anywhere
ReactElement
is more strict — it only accepts actual JSX elements (not primitives like strings or numbers).
Lesson 1135Type Safety for Slot PropsLesson 2338Typing Component Return Values
ReactNode
is the most permissive — it accepts anything renderable: strings, numbers, JSX elements, arrays, fragments, or even `null`.
Lesson 1135Type Safety for Slot PropsLesson 2338Typing Component Return Values
Read Context
Holds the actual state values
Lesson 843Read-Only vs Write-Only Context Split
Read the instructions
(parsing the code)
Lesson 1556The Traditional SPA Performance Problem
Read the ref values
inside the submit handler to access what the user typed
Lesson 516Form Submission Basics with Uncontrolled Inputs
Read-heavy
Many components consume, few update
Lesson 1690Context for Simple App-Wide State
Readability suffers
from cramming too much inline
Lesson 187Inline Expressions vs Variables Before Return
Reading locally is easier
When debugging, having the logic right there in the component—where you can see how state connects to JSX—beats jumping between files to understand a `useSpecialFormLogic` hook that's only used once.
Lesson 1000When Single-Component Logic Should Stay Inline
Reads state or actions
it needs from that context
Lesson 1112Creating Named Child Components
Real-time updates
A chat interface, live notifications, or a stock ticker require continuous client-side connections (WebSockets, polling, or subscriptions).
Lesson 1573Client-Side Data Fetching Still Exists
Real-time-ish data
(social feeds, dashboards, notifications)
Lesson 1807Automatic Revalidation Strategies
Real-world validation
If the test passes but users can't see the change, the test would catch it
Lesson 2038Avoiding Direct State and Props Assertions
Realism
Tests match actual user workflows
Lesson 2135The Integration Test Sweet Spot
Reason
about one small part at a time
Lesson 182Components Can Call Other Components
Reason for re-render
(props change, hook change, or parent render)
Lesson 2234Reading the Console Output
Receives
The `initialArg` (second parameter to `useReducer`)
Lesson 773init Function Signature and Arguments
Receives the data
as arguments
Lesson 1043Basic Render Prop Syntax
Record a profile
while changing context (e.
Lesson 2251Measuring Context-Induced Re-renders
Recovery options
– Retry this component vs navigate away vs reload everything
Lesson 1316Contextual Error Messages by Location
Redirect loops
happen when your auth check redirects to login, but login redirects back to the protected page, creating an endless cycle.
Lesson 1874Common Pitfalls: Redirect Loops and Flash
reduce network requests
(debouncing prevents API calls on every keystroke)
Lesson 1451The Debounce AlternativeLesson 2305Deferring vs Debouncing: When Each Fits
Reducer processes it
Your slice's reducer updates the state
Lesson 1737Dispatching Actions with useDispatch
reducers
An object where each key becomes both a reducer case AND an auto-generated action creator
Lesson 1732Slices: State + Reducers + Actions TogetherLesson 1748Strict Architectural Boundaries and Testability
Redux's cost
More files, more boilerplate, steeper learning curve.
Lesson 1718Zustand vs Context vs Redux: The Tradeoffs
Refactor confidence
Change internal logic freely without breaking tests
Lesson 2038Avoiding Direct State and Props Assertions
Refactoring becomes risky
(adding a prop means touching 5 files)
Lesson 809The Prop Drilling Threshold
Refactoring Safety
You can change the internal implementation (maybe switch from Context to another solution) without touching every component.
Lesson 780Custom Hooks for Consuming State and Dispatch
Refactoring tools work better
(rename refactoring updates all imports automatically)
Lesson 199Named Exports vs Default Exports
references
two objects with identical contents but different memory locations are considered different.
Lesson 612What the Dependency Array Actually DoesLesson 878Primitive vs Reference DependenciesLesson 2271The Shallow Equality Check
Referential equality chains
Memoizing one component often requires memoizing everything it touches.
Lesson 1502The Manual Memoization Problem
Refetch
when data goes stale or on window focus
Lesson 1738RTK Query: Declarative Data Fetching
Refetching
Keys decide which queries update when data changes
Lesson 1771Query Keys: The Cache Identifier
Regex
Case-insensitive or partial matches
Lesson 2062TextMatch: String, Regex, and Function
Regexes
shine for case-insensitive matching (`/submit/i`) or partial matches (`/loading/i` finds "Loading.
Lesson 2062TextMatch: String, Regex, and Function
Regular expression
`/submit/i` finds "Submit", "submit", "SUBMIT"
Lesson 2062TextMatch: String, Regex, and Function
Related data stays together
If these values always represent one logical entity (like a user form), a single object makes that relationship explicit.
Lesson 379The Single Object Approach: Pros and Cons
Related products carousel
another independent section
Lesson 1380Finding the Right Granularity
Remains constant
for an item across all renders
Lesson 170What Makes a Key 'Stable'
Remove it after animating
to free up resources
Lesson 2019will-change CSS Property
Remove items
Filter out an item by index
Lesson 1206Arrays in Form State
Remove now-unused dependencies
from your component
Lesson 662Refactoring: From Effect to Direct Call
Removing items
Filter out the item by its ID from the cached array.
Lesson 1798Optimistic Updates for Lists
Removing items from lists
If a list item component is removed, any state it held is gone forever.
Lesson 363Unmounting Destroys State
Render 1
Props change → Component renders with old derived state → Effect runs → Updates derived state
Lesson 670The Stale State Problem with useEffect
Render 2
Component re-renders with the *now-updated* derived state from the previous render
Lesson 670The Stale State Problem with useEffect
Render delay
On first render, `activeProducts` is `[]`, then the effect runs and triggers a *second* render with the filtered list
Lesson 651Example: Filtering Props in an Effect
Render only those items
Create DOM elements for maybe 15-30 items instead of thousands
Lesson 1276What Virtualization Is: Render Only Visible Items
Render Props (Function Signatures)
Lesson 1151Type Safety Across Patterns
Render reasons
Tags like "State change," "Props change," or "Parent rendered"
Lesson 416Visualizing Renders with React DevTools Profiler
Render the component
containing the interactive element
Lesson 2092Testing User-Triggered Fetches
Render time got worse
(the memo check is more expensive than the render)
Lesson 2276When NOT to Use memo: Profiling Says No
Render timing
Prepare everything together, serve the complete sandwich once
Lesson 693When Computation Happens: Render vs Effect Timing
Render to the DOM
A single command that tells React "insert yourself into this specific spot in the HTML"
Lesson 41main.jsx: The React Bootstrap
Render untrusted content
(markdown, user HTML)
Lesson 1311Component-Level Boundaries for Risky Code
Render/Commit/Paint
= Taking your order, cooking it, and serving it to your table
Lesson 561Why Effects Run After Paint
Rendered DOM
What actually appears on screen (text, buttons, images)
Lesson 2036The Mental Model: Black Box Testing
Rendering based on props
Does your component show different content when you pass `isLoading={true}` vs `isLoading= {false}`?
Lesson 2184Unit Tests for Component Logic
Renders its specific UI
based on that shared state
Lesson 1112Creating Named Child Components
Repeated boilerplate
across dozens of components
Lesson 1336The Imperative Loading Problem
Repeated cleanup logic
(like clearing intervals or removing listeners)
Lesson 992Extracting Shared Logic from Multiple Custom Hooks
Repeated patterns
components re-rendering unnecessarily multiple times
Lesson 71Reading Profiler Flamegraphs
Repetitive
The same 10+ props get copied everywhere
Lesson 1165The Problem: Too Many Individual Props
replace
the entire state value—if your state is an object, spread the old properties yourself to preserve them: `setState({ .
Lesson 349State Updates Don't MergeLesson 1712The set Function: Merging and Replacing
Replace `defaultValue` with `value`
(never have both!
Lesson 1203Migration Strategy: Converting Between Approaches
Replace `onChange` handlers
with `ref` access
Lesson 1203Migration Strategy: Converting Between Approaches
Replace index keys
If items reorder, filter, or insert, `key={index}` will cause issues.
Lesson 161Debugging Key-Related Issues
replaces
the old state value with the new one completely.
Lesson 349State Updates Don't MergeLesson 1868Using Navigate for Redirects
Replay scenarios
Jump to any point in your app's history and watch it play forward
Lesson 1744Time-Travel Debugging and Audit Requirements
Request
changes by calling callbacks the parent provides
Lesson 364State is Owned by the Component That Declares It
Request correlation
Link actions to API calls
Lesson 769Meta Fields: Adding Timestamps, IDs, or Metadata
Request counter
to prevent race conditions:
Lesson 707Common Use Case: Counters and Flags
Request deduplication
across your entire app
Lesson 1482When use() Fits vs TanStack Query or Loaders
Reset functionality
automatic retry mechanisms
Lesson 1322Installing and Basic Setup of react-error-boundary
Resetting
means clearing the error state so the component tree can try rendering again.
Lesson 1305Resetting Error Boundaries
Resilience
Tests survive refactors that don't change behavior
Lesson 2103The Core Principle: Test User-Facing Behavior
Resist this urge
Form state is inherently *temporary* and *UI-specific*—it only matters to that one component until the user submits.
Lesson 1683Form State: Almost Always Local
Resizing
expose `width`, `height`, `isResizing`
Lesson 1063Render Props for Complex Interactions
Resolution Phase
Either success (render data) OR failure (throw error → Error Boundary catches it)
Lesson 1320Loading-to-Error Transition Design
Resolve the outcome
Either confirm the optimistic state (on success) or roll it back (on error)
Lesson 1498The Optimistic State Pattern
Responsive feedback
With fixed durations, faster interactions feel sluggish (waiting for the full duration) and slower interactions feel rushed.
Lesson 1990Why Physics-Based Animation vs Keyframe/Duration
Responsive layouts
Breakpoint changes trigger smooth repositioning
Lesson 1984Layout Animations with layout Prop
REST
remains the gold standard for **heterogeneous clients**—when Android, iOS, Python scripts, and web apps all need access.
Lesson 1821When tRPC Fits vs GraphQL or REST
Result state
(success data or form state)
Lesson 1483What useActionState Replaces
Resumability
is Qwik's radical alternative: instead of re-running components on the client, Qwik **serializes** the entire application state (component boundaries, event listeners, closures) directly into the HTML.
Lesson 1651Resumability: Qwik's Alternative to Hydration
Return cached data immediately
(if available)
Lesson 1804SWR's Core Philosophy: Stale-While-Revalidate
Return early
from different branches
Lesson 127Using if/else Before Return
Return type
Explicitly mark the function as returning JSX (optional but clear)
Lesson 2329Basic Function Component Type Annotation
Returned state
`data` (your result), `isLoading` (first fetch), `error` (if failed)
Lesson 1770useQuery: The Basic Data Fetching Hook
Returns the production-ready path
you can use directly
Lesson 45Static Asset Handling
reusable
you can render the same component multiple times with different data, just like calling a function with different arguments.
Lesson 212What Props Are: Arguments to ComponentsLesson 1002The Cohesion Test: Does the Hook Have a Clear Purpose?
Reusable utilities
(date helpers, string manipulation)
Lesson 2190Unit Tests for Pure Functions and Hooks
Reuse the entire subtree
of child components
Lesson 1254Keys and React's Reconciliation Algorithm
Reuse-driven extraction
asks: "Where else will I use this?
Lesson 1001Extracting for Testability vs Reusability
Revenue-impacting
Checkout, subscription signup, payment processing
Lesson 2183E2E Tests Cover Critical User Journeys
Revert the UI
to its previous state (or refetch the real state from the server)
Lesson 1500Handling Optimistic Update Failures
Review
Changes to page interactions are visible in Page Object diffs, not scattered across test files
Lesson 2199Page Objects in CI: Keeping Tests DRY
Reviews section
separate boundary, can load independently
Lesson 1380Finding the Right Granularity
Risk Management
A working Redux codebase is *working*.
Lesson 1747Team Familiarity and Existing Codebase Investment
Risky
Array indexes (stable only if the list never reorders)
Lesson 153Keys Must Be Stable Across Renders
Role-Based Access
Test that users with different roles (admin, user, guest) see only the features and routes they're authorized for.
Lesson 2189E2E for Authentication and Authorization Flows
Role-based authorization
extends your protection logic to check *who* the user is, not just *that* they're logged in.
Lesson 1871Role-Based Authorization
Rollbacks would be jarring
If showing success then yanking it away would confuse users more than waiting
Lesson 1802Pessimistic vs Optimistic: When to Choose
Rollbar
, and **Bugsnag** all follow similar integration patterns—they plug into your error boundaries via `componentDidCatch` or provide library wrappers.
Lesson 1333Error Tracking with LogRocket and Other Services
Root level
contains tooling configuration:
Lesson 61The src Folder Convention
Route changes
Do new chunks load?
Lesson 1427Measuring Real-World Impact
Route paths get autocomplete
Type `/us` and see `/users` suggested
Lesson 1875What TanStack Router Brings: Type Safety End-to-End
Route problems
Client-side routing that works in dev but breaks on static hosts
Lesson 47Previewing the Production Build
Route-based sections
entire pages users may never visit
Lesson 1358Lazy vs Eager: When Each is Right
Route-level
works for simple navigation flows.
Lesson 1383Suspense Boundary Placement Patterns
Route-Level Boundaries
Place boundaries at each major route to prevent one page's errors from affecting navigation.
Lesson 1307Error Boundary Placement StrategyLesson 1340Suspense Boundaries: Where to Place Them
Route-level data requirements
that block navigation
Lesson 1482When use() Fits vs TanStack Query or Loaders
Route-level splitting
means creating separate bundles for each major route in your application.
Lesson 1423Route-Level Splitting: The Sweet SpotLesson 1426The Cost of Over-Splitting
Route/page-level boundaries
caught a page crash.
Lesson 1316Contextual Error Messages by Location
Routes are unrelated
Blog posts and checkout flow don't share context
Lesson 1842When to Nest vs Flatten Routes
RTL
"Test that your component behaves correctly for users.
Lesson 2040RTL vs Enzyme: Philosophy Differences
RTL's philosophy
If you can't test it without diving into React internals (`.
Lesson 2034Why RTL Discourages Testing Details
Run comparison logic
Check if dependencies changed by comparing old values to new ones
Lesson 905The Cost of Memoization Itself
Run the generator
It produces `.
Lesson 1829Apollo Client with TypeScript
Run your production build
in CI (the same `npm run build` you'd deploy)
Lesson 1420Measuring Bundle Size in CI
Running useState again
, which now returns the *updated* state value
Lesson 342How setState Triggers Re-renders
Runs your function
(the expensive calculation or the callback you're defining)
Lesson 874The Mental Model: Cache Invalidation
runtime overhead
(name lookups) because the performance win benefits every React app, every millisecond, forever.
Lesson 1016The Performance Win of Order-Based TrackingLesson 1952The Shift to Zero-Runtime Solutions
Runtime safety
Clear error messages if components are used incorrectly
Lesson 1094Type-Safe Context for Compound Components

S

Safari-specific CSS rendering bugs
(flexbox behaves differently)
Lesson 2187E2E for Cross-Browser and Device Testing
Same component thinking
Your JSX skills transfer directly
Lesson 57Expo for React Native
Same declarative mindset
Describe UI, not DOM manipulation
Lesson 57Expo for React Native
Same state management
`useState`, props, unidirectional data flow
Lesson 57Expo for React Native
Same tooling philosophy
Fast refresh (like HMR), environment variables, build optimization
Lesson 57Expo for React Native
Sanitizing input
Removing special characters or formatting
Lesson 1243Transforming and Preprocessing Data
Save time
You skip over hundreds of unimportant commits.
Lesson 2213Filtering Commits by Duration Threshold
Scalability
Large apps don't slow initial load
Lesson 1651Resumability: Qwik's Alternative to Hydration
Scenario A
A simple text counter component renders 50 times during an animation.
Lesson 2270Measuring Render Count vs Render Time
Scenario B
A complex data table renders once when a user clicks "Load More".
Lesson 2270Measuring Render Count vs Render Time
Schedule
You decide "I want blue walls"
Lesson 348The Re-render Lifecycle Flow
Screen updates
The browser paints the new DOM to the screen
Lesson 438The Render Cycle Timeline
Scroll jank
As users scroll, the browser struggles to repaint and reflow massive DOM trees
Lesson 2295The Problem Virtualization Solves
Scroll lag
The list doesn't keep up with scrolling
Lesson 1277When Virtualization is Worth It
Scrub through time
Move backward and forward through actions to see exactly when something went wrong
Lesson 1744Time-Travel Debugging and Audit Requirements
Search
Typing in a search box → update `?
Lesson 1861Updating Search Params Without Full Navigation
Search bars
Focus on mount so users can type immediately
Lesson 733Auto-focusing Inputs on Mount
Search params are schemas
Define them once, get type-safe reads/writes everywhere
Lesson 1875What TanStack Router Brings: Type Safety End-to-End
Second
Apply memoization and virtualization
Lesson 1470Concurrent Features vs Other Optimizations
Second `!` (negation again)
Flips it back to the "correct" boolean
Lesson 113Safe Boolean Coercion: !! Pattern
second argument
to your component function (alongside the regular `props` object).
Lesson 725The forwardRef Wrapper FunctionLesson 2272Custom Comparison Functions
Second pass
Re-render with the **new** deferred value in the background (as a low-priority update)
Lesson 1443The Basic useDeferredValue Pattern
Second pass (after hydration)
Update to the real, browser-specific value
Lesson 1659The Two-Pass Render Pattern
Selective subscriptions
If components need different slices of the same logical state, context forces you to split into many providers (complexity) or accept over-rendering.
Lesson 2257Comparing Context Overhead to Alternatives
Self-contained button logic
drop it into any form
Lesson 1494Building Disabled Submit Buttons
Semantic clarity
Names like `"loading"`, `"success"`, or `"error"` communicate intent better than raw property values.
Lesson 1973Variants: Named Animation States
Send placeholders
(from Suspense boundaries) for slower components
Lesson 1583Streaming and Incremental Rendering
Send the actual request
Make the network call in the background
Lesson 1498The Optimistic State Pattern
Sensitive or user-specific
Partially filled forms, temporary selections
Lesson 1864Search Params for Component State: Tradeoffs
SEO for dynamic content
Product pages, blog posts, listings — search engines need real HTML, and your content changes too often for static generation.
Lesson 1675SSR Trade-offs: Server Cost vs Time-to-Content
SEO-critical data
that must be server-rendered
Lesson 1482When use() Fits vs TanStack Query or Loaders
separation of concerns
the tracker knows *what* data to provide, consumers know *how* to present it.
Lesson 1051Classic Example: Mouse Position TrackerLesson 1169Event Handler Composition
Sequence dozens of animations
with precise millisecond gaps
Lesson 2012GSAP for Complex Timeline Animations
Sequential fetching
happens when you `await` one fetch before starting the next:
Lesson 1579Sequential vs Parallel Data Fetching
serialize
them—convert them to a format that can be transmitted over the network and reconstructed on the other side.
Lesson 1528Props Must Be SerializableLesson 1587What Can Cross the Server-Client Boundary
Server Action
a function that clients can call, but that always runs on your server with full backend access.
Lesson 1598Creating a Server Action: The 'use server' Directive
Server Actions
are optimized for **mutations triggered by React components**—form submissions, button clicks, or any user interaction originating from your UI.
Lesson 1609When to Use Server Actions vs API Routes
Server Component (the descriptions)
The chef writes the menu once.
Lesson 1559Zero JavaScript for Static Content
Server Components
Pure rendered output in the RSC wire format.
Lesson 1534What 'No JS' Really Means: The Nuance
Server Components incompatibility
As you learned in lesson 1951, React Server Components can't use runtime CSS-in-JS because there's no runtime environment to inject styles into.
Lesson 1952The Shift to Zero-Runtime Solutions
Server load
Your backend processes unnecessary requests
Lesson 583When Ignore Flags Aren't Enough
Server render
`width` is `null`, renders "Loading width.
Lesson 1659The Two-Pass Render Pattern
Server renders
Sees `width === null`, outputs "Loading width.
Lesson 1658The useEffect Solution Pattern
Server state
, on the other hand, is the *truth* that lives on your backend: user profiles, product listings, shopping carts.
Lesson 1684UI State vs Server StateLesson 1704Server State vs Client State SeparationLesson 1768TanStack Query: What Problem Does It Solve?
Server State characteristics
Lesson 1684UI State vs Server State
Server validation is complex
The server might reject the request for non-obvious reasons (permissions, business rules)
Lesson 1802Pessimistic vs Optimistic: When to Choose
Server-first data flow
means your data originates at the top of your tree in Server Components that run on the backend.
Lesson 1574The New Mental Model: Server-First Data Flow
Server-Sent Events (SSE)
, or **GraphQL subscriptions**, libraries like TanStack Query don't handle these out of the box.
Lesson 611When useEffect Data Fetching Still Makes Sense
Server-side
Catch errors in your server rendering logic with try-catch blocks or your framework's error handling
Lesson 1291What Error Boundaries DON'T Catch: Server-Side RenderingLesson 1820Prefetching tRPC Queries on the Server
Server-Side Rendered Applications
SSR apps suffer with runtime CSS-in-JS due to hydration overhead and server rendering complexity.
Lesson 1941When vanilla-extract Fits Best
Server-Side Rendering (SSR)
solves this by running React on a server to generate full HTML before sending it to browsers.
Lesson 34SEO-First Content Without SSR InfrastructureLesson 1368Client-Only Apps: Limited Suspense UtilityLesson 1630What Server-Side Rendering Actually Means
Server-side rendering with GraphQL
using Apollo's SSR utilities
Lesson 1830When Apollo Fits vs TanStack Query
Server-side templates
(like Django templates, ERB, Blade, or Handmade)
Lesson 35Teams Without JavaScript Expertise
Set up loaders
Define rules for processing `.
Lesson 54Webpack from Scratch
Setup time
calculating item sizes and container heights
Lesson 2301When Virtualization Isn't Worth It
shallow comparison
check if any props or state values changed using strict equality (`!
Lesson 300shouldComponentUpdate: Manual Render OptimizationLesson 914Shallow Equality Explained: Object.is on Props
shallow equality check
by default—comparing each prop value with `Object.
Lesson 922The Default Behavior: Why Shallow is Usually RightLesson 2271The Shallow Equality Check
Shallow nesting (1-2 levels)
All three work fine; choose based on content structure
Lesson 1150Composability Comparison: Nesting and Flexibility
Shared components
are like basic utensils (knives, spoons, measuring cups) that you use everywhere—they belong in a common drawer.
Lesson 63The Components Folder: Shared vs Feature-Specific
Shared element transitions
An image smoothly transitions from thumbnail to full-screen using `layoutId`
Lesson 2010Framer Motion for Component-Driven UI Animations
Shared layouts exist
Dashboard pages all need the same sidebar
Lesson 1842When to Nest vs Flatten Routes
Shopping cart
changes frequently, read only by cart-related components
Lesson 839Identifying Independent State Domains
Shorter bars
in the Ranked Chart
Lesson 2273Profiling After Adding memo
Show a loading indicator
(spinner, skeleton, or status text)
Lesson 1411Handling Loading States in Interaction-Based Splits
Show immediate feedback
to user input (the input updates instantly)
Lesson 1471User Perception: Immediate Feedback Matters Most
Show loading indicators
Lesson 1486The Pending State
Show/hide patterns
with opacity and transform
Lesson 1957When CSS Transitions Are Enough
Sibling boundaries
sit next to each other at the same level, letting independent sections load in parallel without blocking each other.
Lesson 1377Multiple Suspense Boundaries: Nested vs Sibling
Sibling components re-render
despite not using that state
Lesson 951Identifying Over-Hoisted State
Siblings subscribe
child components (`Tab`, `TabPanel`) call `useContext` to tap into shared state
Lesson 1090Creating a Private Context for Compound Components
Side effects happen here
After DOM updates, React calls `useEffect` hooks and other lifecycle methods
Lesson 429Commit Phase: Applying Changes to the DOM
Similar colors
(indicating similar durations) cascading downward
Lesson 2216Identifying Cascading Renders in the Flame Graph
Similar patterns
for form inputs, toggle states, or timers appearing in multiple places
Lesson 997The Signal: When Logic is Repeated Across Components
Simple APIs
where users shouldn't think about functions
Lesson 1148When Slots Win: Multiple Named Insertions
Simple calculations
wrapped in `useMemo`—the compiler handles these automatically now
Lesson 1509Migration Strategy: Removing Manual Memoization
Simple comparison
Primitive props (strings, numbers, booleans) compare perfectly with shallow equality
Lesson 934List Items with Stable Props: A Common Win
Simple consumption patterns
When most components need all or most of the context value
Lesson 816Context vs State Management Libraries
Simple containment
The component is primarily a wrapper (layout, styling, behavior)
Lesson 1147When Children is Enough
Simple data
Primitives or small objects, not complex nested structures
Lesson 1690Context for Simple App-Wide State
Simple DOM nodes
(text, small images): The browser handles these efficiently
Lesson 2301When Virtualization Isn't Worth It
Simple loading indicators
(pulsing dots, rotating spinners)
Lesson 1957When CSS Transitions Are Enough
Simple object/array literals
`const style = { color: 'blue' }` (when referential identity doesn't matter)
Lesson 906When Simple Values Don't Need useMemo
Simple Spinners
The easiest approach is a centered loading spinner.
Lesson 1342The fallback Prop: Spinners and Skeletons
Simple UIs
A basic form with a few inputs doesn't need concurrent features.
Lesson 1469When Concurrent Features Don't Help
Simple URLs suffice
Sometimes `/checkout` is clearer than nesting under `/store/cart/checkout`
Lesson 1842When to Nest vs Flatten Routes
Simpler caching needs
you don't need entity normalization across deeply nested data
Lesson 1830When Apollo Fits vs TanStack Query
Simpler mental model
Data routers are powerful but conceptually lighter than TanStack's full type-safe approach
Lesson 1885When TanStack Router Fits vs React RouterLesson 2328When to Move to External State
Simpler onboarding
New developers understand props first
Lesson 823When Prop Drilling is Actually Fine
Simplicity without sacrifice
Zustand excels in the sweet spot between Context and Redux.
Lesson 1718Zustand vs Context vs Redux: The Tradeoffs
Simplify component code
Hide complexity behind intuitive names
Lesson 993Composing Third-Party Hooks
Simulate the user action
with `user-event` (clicking a "Load More" button, submitting a form, etc.
Lesson 2092Testing User-Triggered Fetches
Single Page Applications (SPAs)
smooth, app-like experiences without page refreshes.
Lesson 1672Client-Side Rendering (CSR): The SPA Default
Single-property changes
Animating `opacity`, `transform`, or `background-color` based on a class toggle.
Lesson 1978When Framer Motion is Overkill
Skeleton Screens
These are placeholder shapes that mimic the structure of the content about to load.
Lesson 1342The fallback Prop: Spinners and SkeletonsLesson 1388The fallback Prop: Loading UILesson 1400Route Transition States and UX
Skeleton UI
works best when replacing specific content areas.
Lesson 1373Common Fallback Patterns: Spinners and Skeletons
Skip re-renders
when props/state haven't changed (optimization)
Lesson 407Pure Functions: Why Components Must Be Pure
slot pattern
in action: you're filling named placeholders with specific content.
Lesson 1141Passing JSX as Regular PropsLesson 1591The Slot Pattern with Server Components
Slots (Named Props)
You pass JSX elements as explicitly named props like `header={<Logo />}` or `footer={<Nav />}`.
Lesson 1146Three Ways to Inject Content: A Comparison
Slow components stall everything
if one component takes 5 seconds to render, the entire response waits 5 seconds
Lesson 1633The Performance Problem with renderToString
Slower CPUs
that take longer to parse and execute JavaScript
Lesson 33Performance-Critical Mobile Web Apps
Sluggish hot reloading
compared to Vite's instant updates
Lesson 49Create React App: The Legacy Standard
Small component trees
(2-3 levels deep): The explicitness and zero abstraction overhead of props often outperforms context setup.
Lesson 2257Comparing Context Overhead to Alternatives
Small in size
a few KB won't justify split overhead
Lesson 1358Lazy vs Eager: When Each is Right
Small projects
that don't need custom build pipelines
Lesson 53Parcel: Zero-Config Bundler
Small to medium apps
When your state tree isn't deeply nested or constantly changing
Lesson 816Context vs State Management Libraries
Small, private helper components
used only by one parent component
Lesson 201One Component Per File (Usually)
Smaller bundle size matters
TanStack Query is lighter and has no GraphQL parser overhead
Lesson 1830When Apollo Fits vs TanStack Query
Smaller bundles
only interactive pieces add to your JavaScript payload
Lesson 1621The Default: Start with Server Components
Smaller initial bundle
→ faster download over the network
Lesson 2287Performance Impact of Code Splitting
Smaller virtual DOM implementation
Optimized diffing with less overhead
Lesson 28Preact: React's Lightweight Alternative
Smart refetching
Data refreshes when windows regain focus, components remount, or network reconnects
Lesson 596Why Libraries Handle This Better
Social media previews
Any page users might share on Twitter, Facebook, or Slack — Open Graph tags need real content at request time for rich previews.
Lesson 1675SSR Trade-offs: Server Cost vs Time-to-Content
Solid
State change → directly updates the exact DOM nodes that depend on it
Lesson 26Solid: Fine-Grained Reactivity
Some proxies and CDNs
buffer responses before sending them
Lesson 1671Streaming SSR Browser Support and Fallbacks
Sophisticated caching strategies
with stale-while-revalidate patterns
Lesson 1482When use() Fits vs TanStack Query or Loaders
Source maps
are special files that map minified code back to your original source.
Lesson 1334Source Maps for Readable Stack TracesLesson 1510Debugging Compiler Output
Specific component types
are the most restrictive — they enforce that a particular component is used.
Lesson 1135Type Safety for Slot Props
Speed perception matters
Social feeds, chat apps, collaborative tools where instant feedback is expected
Lesson 1802Pessimistic vs Optimistic: When to Choose
Splitting would improve readability
A parent with 200 lines becomes clearer when you extract logical sections into named components, even if they're only used once.
Lesson 211When to Split vs Keep Components Together
SSG
Pre-packaged meals—made once, served instantly (CDN-cached HTML)
Lesson 1679Decision Matrix: Choosing the Right Rendering Strategy
Stability
Refactoring internal code doesn't break tests
Lesson 2135The Integration Test Sweet Spot
Stabilize the references
using `useCallback` for functions and `useMemo` for objects:
Lesson 901Stabilizing Props to Memoized Components
Stable across renders
The ID doesn't change when you re-fetch or update the data
Lesson 155Using Database IDs as Keys
Stable identifiers
let you maintain continuity.
Lesson 153Keys Must Be Stable Across Renders
Stable Props Pattern
ensure every prop passed to a memoized component maintains the same reference across renders unless the underlying value truly changes.
Lesson 2274memo + Stable Props Pattern
Stack traces
showing exactly where code failed
Lesson 1330Why Log Errors Remotely: Visibility into Production
Stagger patterns
across arrays of elements with fine-grained control
Lesson 2012GSAP for Complex Timeline Animations
Stale UI flash
The component briefly shows old data before the effect runs
Lesson 683The Props-Change-Triggers-Effect Antipattern
Stale value window
Between when `products` changes and the Effect runs, your UI displays outdated information
Lesson 694The Effect Antipattern: Computing Derived Values
Standard patterns
for actions, reducers, or mutations
Lesson 1705Team Collaboration and Predictable Patterns
Standardize spacing
across your entire app
Lesson 194Layout Components: Composing Structure
start
the synchronization when the component appears (or when dependencies change) and **stop** it when appropriate.
Lesson 534The Mental Model: SynchronizationLesson 656Exception: External System Synchronization
Start here
`useState` in the component
Lesson 1680The Local-First Principle
Start Recording
Click the record button (red circle) in the Profiler tab before doing anything
Lesson 2208Recording a Profile: Start, Interact, Stop
Start simple
Build components that work great for the 80% case with minimal configuration.
Lesson 1154The Flexibility vs Simplicity Tradeoff
Start streaming HTML immediately
for components that resolve quickly
Lesson 1583Streaming and Incremental Rendering
State changes
Which state variables updated
Lesson 2225Comparing Renders: Why Did This Update Happen?
State confusion
Component state (like form inputs) can attach to the wrong items
Lesson 142The Key Prop Requirement
State desync
(listeners holding references to stale state)
Lesson 6Event Listener Spaghetti Code
State diff visualization
exactly what changed between states
Lesson 1703Developer Experience: DevTools and Time Travel
State domains
are groups of related data that:
Lesson 839Identifying Independent State Domains
State management hooks
`useFormState` vs `useForm`—pick one pattern
Lesson 987Consistency Across Your Codebase
State persistence
A reused component keeps its local state
Lesson 151Keys Preserve Component Identity
State Reducer pattern
inverts control of *how state transitions happen*.
Lesson 1174What the State Reducer Pattern Solves
State reducers
to let you customize behavior
Lesson 1183What 'Headless' Means: Logic Without Styling
State survives re-renders
Your function runs many times, but state doesn't reset because it's stored externally.
Lesson 362State Lives in the React Tree, Not the Component Function
State updates queued
Calls to `setState` schedule updates, they don't apply yet
Lesson 438The Render Cycle Timeline
State variable
holds the current value
Lesson 480The Standard Controlled Input Pattern
State variable names
`const [count, setCount]` vs `const [value, setValue]`
Lesson 2115What Are Implementation Details?
State variants
`hover:bg-blue-700 active:bg-blue-800 disabled:opacity-50`
Lesson 1915Composing Utilities for Complex Styles
state-driven animations
you declare what should animate based on component state, and the library handles the rest.
Lesson 2000Why GSAP for React: Imperative Animation PowerLesson 2010Framer Motion for Component-Driven UI Animations
StateContext
is the menu board that changes daily (you check it to see what's available), while **DispatchContext** is the ordering counter—it never moves.
Lesson 778Creating the Context Pair: State and DispatchLesson 2324Separating State and Dispatch Contexts
Static configuration displays
(showing hardcoded options)
Lesson 1257Index Keys in Read-Only Lists
Static labels
that aren't formally associated with inputs
Lesson 2056getByText for Non-Interactive Content
Static lists
that never change (a hardcoded array of links)
Lesson 162The Index-as-Key Pattern and Why It's Common
Still no lint error
The linter doesn't know `getUser` contains hooks.
Lesson 984What Happens Without the 'use' Prefix
Stop Recording
Click the record button again to stop and generate the flame graph
Lesson 2208Recording a Profile: Start, Interact, StopLesson 2230Establishing a Performance Baseline
Storage APIs
`localStorage`, `sessionStorage`
Lesson 1623When You MUST Use Client: Browser APIs
Storage overhead
React must store both the memoized value and the dependency array in memory
Lesson 2279The Cost of useMemo Itself
store
the fact that your sandwich exists separately from storing the bread and filling.
Lesson 649What 'Deriving State' MeansLesson 889The Cost-Benefit Analysis of useMemo
Store references
Keep the memoized value in memory between renders
Lesson 905The Cost of Memoization Itself
Stores the result
in memory (the cache)
Lesson 874The Mental Model: Cache Invalidation
Streams in
the suspended component's HTML once its data resolves
Lesson 1367The Streaming SSR Connection
Strike One
You write logic in a component.
Lesson 999The Three-Strike Rule for Hook Extraction
Strike Three
A third component needs it.
Lesson 999The Three-Strike Rule for Hook Extraction
Strike Two
You need similar logic elsewhere.
Lesson 999The Three-Strike Rule for Hook Extraction
String concatenation
`const greeting = "Hello, " + name`
Lesson 906When Simple Values Don't Need useMemo
Stripped legacy support
Focuses on modern browsers only
Lesson 28Preact: React's Lightweight Alternative
Style-based hiding
Render the element but make it invisible with CSS (`display: none`, `visibility: hidden`, or `opacity: 0`)
Lesson 139Style-Based Hiding vs Conditional Rendering
Submission state
(pending/idle)
Lesson 1483What useActionState Replaces
Submit handling
with loading states
Lesson 1228Why Formik Was Popular
Submitted data
After validation passes and the user clicks "Save"
Lesson 1683Form State: Almost Always Local
Subscriptions
Setting up event listeners or WebSocket connections
Lesson 297componentDidMount: Side Effects After First Render
Subscriptions that leak
(connections that never close)
Lesson 597What StrictMode Does: Intentional Double-Mounting
Subtle spinner
Small indicator in corner
Lesson 1446Visual Feedback During Deferral
Success is highly likely
The server rarely rejects these requests
Lesson 1802Pessimistic vs Optimistic: When to Choose
Suppressing console error output
so intentional test errors don't pollute results
Lesson 2136Why Error Boundaries Need Special Testing
Survives
sorting, filtering, and reordering
Lesson 170What Makes a Key 'Stable'
Suspense
catches the "waiting" state (loading)
Lesson 1344What Suspense Doesn't Handle
Suspense boundary
is a dividing line in your component tree.
Lesson 1637Suspense Boundaries in Streaming SSR
Suspense displays the fallback
UI you specified
Lesson 1339How Suspense Detects 'Not Ready'
Suspense Support
Streaming is the *only* way to leverage Suspense boundaries for SSR.
Lesson 1641renderToString vs renderToPipeableStream: The Modern Choice
Svelte's advantage
Smaller bundle sizes and faster runtime performance for simpler applications.
Lesson 25Svelte: Compile-Time Reactivity
SWC
(Speedy Web Compiler) is written in Rust and offers similar performance to esbuild while maintaining more Babel-like features.
Lesson 79The Role of Babel and Modern Transpilers
Switch statements
that pick between many components
Lesson 129Immediately Invoked Function Expressions (IIFEs) in JSX
SWR
treat data fetching as a *solved problem*.
Lesson 587Why Modern Libraries Solve This Automatically
Symbols
, WeakMaps, or other non-serializable types
Lesson 1552Prop Serialization Across the Boundary
Symptom
Your memoized value or callback seems to run constantly despite "nothing changing.
Lesson 879The Object Dependency Problem
synchronization
your component needs to stay connected to something outside React.
Lesson 534The Mental Model: SynchronizationLesson 1768TanStack Query: What Problem Does It Solve?
Synchronization bugs
the derived state can fall out of sync with its source
Lesson 684Derived State: Compute During Render Instead
Synchronization burden
The effect must re-run every time `products` changes
Lesson 651Example: Filtering Props in an Effect
Synchronize with third-party libraries
that need pre-paint access
Lesson 432useLayoutEffect: Pre-Paint Synchronous Effects
Synchronized inputs
(two fields that must stay in sync)
Lesson 515Recognizing When Controlled is Still Better
Syntax Brevity
Arrow functions can be more concise with implicit returns:
Lesson 183Arrow Functions vs Function Declarations

T

Tab content
Fresh state when switching tabs
Lesson 692Refactoring Effect-Based Syncing to Key Prop
Tabbing
triggers `keydown`, `keyup`, `focus` on the next element, and `blur` on the previous one
Lesson 2072Testing Focus Behavior with user-event
Table rows
with multiple cells that need semantic grouping
Lesson 160Fragment Keys
Tabs
A `<TabList>` needs to know which tab is active.
Lesson 1087When to Use This Pattern
Tailwind
produces a static CSS file that browsers cache efficiently.
Lesson 1921Tailwind vs CSS-in-JS Tradeoffs
Tailwind CSS
Zero runtime, utility-first approach retains component colocation without the parsing cost.
Lesson 1932Migration Path: When to Consider Alternatives
TanStack Query and SWR
require opt-in configuration (experimental features)
Lesson 1346The Suspense-Ready Ecosystem
TanStack Virtual
(formerly known as `react-virtual`) has emerged as the recommended solution for virtualizing long lists in modern React applications.
Lesson 1278TanStack Virtual: The Modern Choice
Target high-traffic pages next
Identify pages with the most user traffic or the worst performance metrics.
Lesson 1956Migration Strategies from Runtime to Zero-Runtime
Team collaboration
Share profiles in code reviews or bug reports
Lesson 2219Exporting and Sharing Profiler Data
Team Consistency
Every React codebase uses this convention.
Lesson 335Naming Convention: [thing, setThing]
Team Coordination
Large teams can work on different slices simultaneously.
Lesson 1743Large-Scale Apps with Many Interconnected Features
Team experience
Less TypeScript-savvy teams benefit from simpler, explicit patterns
Lesson 2396Team Conventions: Picking a Style
Team experience matters
Your developers already know the patterns cold
Lesson 1885When TanStack Router Fits vs React Router
Team Knowledge
Your developers can debug Redux DevTools in their sleep, write reducers without thinking, and have built internal tooling around your Redux patterns.
Lesson 1747Team Familiarity and Existing Codebase Investment
Temporary selections
(local to the feature)
Lesson 1688Avoiding Premature Abstraction
Tension
(default: 170): How stiff the spring is.
Lesson 1993Spring Configuration: Tension, Friction, Mass
Terms below were extracted from bolded phrases in lesson content. Click a lesson reference to jump
Ternaries
`<Card status={isActive ?
Lesson 220Passing Variables and Expressions
Test coverage
– Don't migrate without tests confirming behavior stays identical
Lesson 327When Teams Haven't Migrated Yet
Test filtering
Remove items—do remaining items keep their identity?
Lesson 1274Debugging Key-Related Issues
Test IDs
(`getByTestId`) - last resort only
Lesson 2033The Guiding Principle: Accessibility First
Test reordering
Sort your list—do keys stay with their data?
Lesson 1274Debugging Key-Related Issues
Test-driven extraction
asks: "Can I verify this logic without the component?
Lesson 1001Extracting for Testability vs Reusability
Testable in isolation
(no React needed)
Lesson 776Common Pattern: Reusable Init Functions
Testing
Isolated stores are simpler to test
Lesson 1717Multiple Stores and When to Split
Testing becomes simpler
because inputs and outputs are clear
Lesson 16Explicit Over Implicit
Testing becomes straightforward
Pass in specific state, verify the output matches expectations.
Lesson 17UI as a Function of State
Testing components in isolation
without wrapping every test in a Provider
Lesson 795Context Without a Provider
Testing edge cases
in a controlled test environment
Lesson 1035ESLint Override Comments: When and How
Testing gets complicated
(you need to mock global stores or wrap components in providers)
Lesson 1681Colocation: Keep State Close to Where It's Used
Tests survive refactoring
from fetch to axios to a custom hook
Lesson 2127MSW for Realistic API Mocking
Text content
Does the text inside elements match exactly?
Lesson 1654How React Detects MismatchesLesson 2167Assertions with expect()
That's not true
If a Provider exists, its value wins — even if that value is `undefined`.
Lesson 793Default Values vs Provider Values
That's your signal
When you need documentation to track interdependent state updates, your code has crossed the **readability tipping point**.
Lesson 753The Readability Tipping Point
Theme + User
Styling based on theme while displaying user information
Lesson 804Multiple Contexts in One Component
Theme preferences
Dark mode affects styling across your entire app
Lesson 810Context for Truly Global State
Theme transitions
(background color shifts when switching light/dark mode)
Lesson 1957When CSS Transitions Are Enough
Theme/Dark Mode
A user toggles dark mode.
Lesson 1690Context for Simple App-Wide State
there.
Think of it as
Instead of building your own airbag system for every car, you buy a tested, certified airbag off the shelf and install it where needed.
Lesson 1322Installing and Basic Setup of react-error-boundary
Third
Use concurrent features for remaining responsiveness issues
Lesson 1470Concurrent Features vs Other Optimizations
Third return value
React 19 added `isPending` (in experimental `useFormState`, you needed `useFormStatus` separately)
Lesson 1491Migration from useFormState
Third-party components
don't expose semantic structure
Lesson 2064getByTestId: The Escape Hatch
Third-party integration
Libraries that expect fresh object references every render
Lesson 1507The 'use memo' Directive (Opt-Out)
Third-party library callbacks
that you know are stable despite what the linter thinks
Lesson 1022When to Disable exhaustive-deps (Rarely)
Third-party services
(analytics, payment processors)
Lesson 2135The Integration Test Sweet Spot
This breaks
React will immediately complain with a syntax error.
Lesson 181Returning Multiple Elements Requires a Wrapper
This is wrong
A render in React simply means calling your component function to generate a new description of what the UI *should* look like.
Lesson 411Render Does Not Mean DOM UpdateLesson 744State Transitions That Depend on Previous State
This requires framework support
Libraries like Relay, SWR, TanStack Query, and frameworks like Next.
Lesson 1359Why Suspense for Data ≠ Suspense for Code Splitting
This works without JavaScript
Add a Client Component wrapping for enhancements:
Lesson 1617Progressive Enhancement Pattern
Three state variables
one for the data itself, one for loading status, and one for any errors
Lesson 567The Classic useEffect Fetch Pattern
Throwing errors
in a Server Action will trigger React's error boundary mechanism on the client side.
Lesson 1604Error Handling in Server Actions
Tightly coupled components
that always appear together
Lesson 201One Component Per File (Usually)
Time slicing
is React's solution: instead of rendering everything in one continuous block, React breaks the work into small chunks (typically 5ms each).
Lesson 1459Time Slicing: Yielding Control Back to the Browser
Time to First Byte
and **Largest Contentful Paint**.
Lesson 1583Streaming and Incremental Rendering
Time-based
After a configured duration (e.
Lesson 1571Server Component Caching Behavior
Time-based revalidation
"Regenerate this page every 60 seconds if someone visits it.
Lesson 1678Incremental Static Regeneration (ISR): Hybrid Freshness
Time-dependent data
Rendering `new Date().
Lesson 1653What is a Hydration Mismatch?
Timeline sequencing
Chain animations with exact delays
Lesson 2000Why GSAP for React: Imperative Animation Power
Timers
Countdown values, elapsed time displays
Lesson 1685Temporary State: Counters, Timers, Animations
Tiny bundle size matters
Every KB counts in your initial load.
Lesson 1978When Framer Motion is Overkill
Too few chunks
Large initial bundle, slow first load
Lesson 1422The Bundle Size vs Request Count Tradeoff
Too many chunks
Fast initial load, but slow complete experience due to waterfall requests
Lesson 1422The Bundle Size vs Request Count Tradeoff
Too many context providers
stacked in your component tree (five or more)
Lesson 2328When to Move to External State
Too many dependencies
More comparisons = more work
Lesson 2284Dependency Array Performance Impact
Too many required decisions
If users must provide 5+ props just to render something basic, you've inverted too much.
Lesson 1163When Inversion Becomes Over-Engineering
Tooling Support
Many editor extensions and linters expect this pattern and provide better autocomplete and error detection when you follow it.
Lesson 335Naming Convention: [thing, setThing]
Top (Narrow)
E2E tests — few, slow, comprehensive tests running the entire application
Lesson 2182The Testing Pyramid: Unit, Integration, E2E
Total Blocking Time
Are expensive chunks deferred properly?
Lesson 2291Measuring Split Effectiveness
Total Blocking Time (TBT)
How long users wait
Lesson 1427Measuring Real-World Impact
Total Count Announcement
Use `aria-label` on the container to announce the full list size:
Lesson 1285Accessibility Considerations
Total duration
The cumulative time spent rendering that component across all renders
Lesson 2215Component Render Count and Duration Totals
Touch event handling issues
(works with mouse, fails with touch)
Lesson 2187E2E for Cross-Browser and Device Testing
Touched/dirty tracking
out of the box
Lesson 1228Why Formik Was Popular
Trace viewer
Time-travel debug with screenshots, network logs, and DOM snapshots
Lesson 2161Why Playwright is the Modern E2E Choice
Traceability
You can easily follow where data comes from and goes
Lesson 269When Drilling Isn't a ProblemLesson 823When Prop Drilling is Actually Fine
Tracks
which scripts have already been inserted
Lesson 1519Async Scripts with Direct Support
Tracks reads
during component render—knowing *this component accessed `state.
Lesson 1760Proxy-Based State: How Valtio Tracks Mutations
Tracks the dependency
so the file is included in your build
Lesson 45Static Asset Handling
Tracks writes
when you mutate—knowing *`state.
Lesson 1760Proxy-Based State: How Valtio Tracks Mutations
Trade-off
Requires rethinking data fetching.
Lesson 1343Suspense vs Traditional Loading States
Tree-shake better
Ensure you're importing selectively
Lesson 1421Bundle Budget Strategy: Setting Thresholds
Tree-shakes
unused code away
Lesson 46Building for Production
Tree-shaking
Unused methods in classes are harder to detect and remove
Lesson 311Classes Confuse Both People and Machines
Triggering
an error to display the fallback UI
Lesson 2141Testing Reset Functionality
Triggers a background refetch
to get fresh data
Lesson 1781Stale-While-Revalidate Explained
Triggers re-renders
only in components that read the changed property
Lesson 1760Proxy-Based State: How Valtio Tracks Mutations
Truly global state
is data that a large portion of your component tree needs to access, regardless of where those components sit in the hierarchy.
Lesson 810Context for Truly Global State
Truly repeated patterns
that appear across many components and resist React component extraction
Lesson 1919The @apply Directive: When and Why
Truly unique
across your entire dataset
Lesson 1255Stable IDs: The Gold Standard for Keys
Truthy left side
(everything else): The gatekeeper waves you through.
Lesson 111Why && Works: Truthy/Falsy Evaluation
Try/catch blocks
give you fine-grained control.
Lesson 1604Error Handling in Server Actions
Twelve spinners
appear simultaneously across the screen
Lesson 1379Granularity Tradeoff: Too Fine
Type coercion
Converting string numbers to actual numbers
Lesson 1243Transforming and Preprocessing Data
Type inference
TypeScript knows your form data shape from the schema
Lesson 1225Schema Validation with Zod Resolver
Type refinement
`type="email"` for specific input types
Lesson 1170Prop Getter Arguments: Customization Points
Type safety is non-negotiable
Large teams where catching routing errors at compile time prevents production bugs
Lesson 1885When TanStack Router Fits vs React Router
Type safety matters
TypeScript discriminated unions work beautifully
Lesson 768When to Use Multiple Action Types vs Single with Payload
Type-Based Structure
groups files by *what they are* (their technical type):
Lesson 208Folder Structure: Feature-Based vs Type-Based
Type-based works well
when your app is small (under ~10 components).
Lesson 208Folder Structure: Feature-Based vs Type-Based
Types folder
If it's a TypeScript definition used in multiple places.
Lesson 64Common Top-Level Folders: hooks, utils, types
TypeScript types
need to be clear and autocomplete-friendly
Lesson 1128Slots vs Compound Components: Design Tradeoffs
TypeScript verbosity
Duplicate the type annotation everywhere
Lesson 820The Component Tree Depth Problem
TypeScript-First Teams
If your team values type safety everywhere, vanilla-extract's `.
Lesson 1941When vanilla-extract Fits Best
TypeScript-only, full-stack projects
where you control both the frontend and backend.
Lesson 1821When tRPC Fits vs GraphQL or REST

U

UI
or performing an **imperative action**.
Lesson 722When to Use Refs vs State for DOM Interaction
UI concerns
Which field is focused, show/hide password
Lesson 1683Form State: Almost Always Local
UI preferences
(theme, language) — changes rarely, read by layout components
Lesson 839Identifying Independent State Domains
UI toggles
(modals, dropdowns—local to the component)
Lesson 1688Avoiding Premature Abstraction
UI-only concerns
whether an accordion is open, a dropdown is expanded, or a tooltip is visible—should typically live in local component state using `useState`.
Lesson 2318Local State for UI-Only Concerns
Unclear intent
When another developer might misunderstand your condition
Lesson 114Explicit Comparisons Over Implicit Truthiness
Uncontrolled components
flip this model: the DOM itself manages the input's value, just like traditional HTML forms.
Lesson 490What Are Uncontrolled Components?Lesson 507Simple Forms Without Real-Time ValidationLesson 1157The Controlled vs Uncontrolled Pattern Generalized
Uncontrolled refs
Lose reactivity and validation capabilities
Lesson 1228Why Formik Was Popular
Under ~50-100 items
with simple content: Regular rendering is often faster
Lesson 2301When Virtualization Isn't Worth It
Understandable
Others (including future you) know what it does
Lesson 1002The Cohesion Test: Does the Hook Have a Clear Purpose?
Undo/redo systems
Store original timestamps
Lesson 769Meta Fields: Adding Timestamps, IDs, or Metadata
Unexpected re-renders
Use React DevTools Profiler alongside compiler output to correlate
Lesson 1510Debugging Compiler Output
Unexpectedly wide bars
If a small, simple component shows a surprisingly wide bar, investigate why it's slow.
Lesson 2223Reading the Profiler Flamegraph
Unique
The combination prevents collisions across all nesting levels
Lesson 1249Composite Keys for Nested Lists
unique among siblings
and **stable** (doesn't change between renders).
Lesson 142The Key Prop RequirementLesson 155Using Database IDs as Keys
Unmount
is when React removes the component from the screen entirely.
Lesson 296The Three Lifecycle Phases: Mount, Update, Unmount
Unmount Phase (component disappears)
Lesson 307The Lifecycle Diagram: Mental Model
Unnecessary granularity
Not every component needs isolation.
Lesson 1312Avoiding Boundary Overuse
Unnecessary unmounting and remounting
(performance hit)
Lesson 1245Why Keys Must Be Stable Across Renders
Unstable dependencies
You include a reference that changes every render (like a new object or function), making the memoization pointless—it recalculates every time anyway.
Lesson 2236Finding Hook Dependency Issues
Unstable networks
where downloading even 100 KB can be painfully slow
Lesson 33Performance-Critical Mobile Web Apps
Update history
Track when atoms change
Lesson 1728Jotai DevTools and Debugging
Update items
Replace a specific item's field value
Lesson 1206Arrays in Form State
Update logic
Spreading large objects can be verbose
Lesson 384Performance: Object vs Multiple Variables
Update on scroll
As you scroll, new items render into view and old ones unmount
Lesson 1276What Virtualization Is: Render Only Visible Items
Update submit handler
to read from refs or `FormData`
Lesson 1203Migration Strategy: Converting Between Approaches
Update the dependency
first, ensure everything still works
Lesson 1521Migration Strategy: Incremental Adoption
Updates are infrequent
(theme changes, user auth state)
Lesson 1694When Context Beats Prop Drilling
Updates to Unmounted Components
Lesson 558What Happens Without Cleanup
Updating items
Map through the array and replace the matching item with its updated version.
Lesson 1798Optimistic Updates for Lists
Updating the DOM
only where things actually changed
Lesson 342How setState Triggers Re-renders
Urgent update renders first
React immediately re-renders with the new urgent value
Lesson 1445When Deferred Values Update
Urgent updates always win
React interrupts transition rendering
Lesson 1433Urgent vs Transition Updates Prioritization
Urgent value
The search input itself (updates immediately)
Lesson 1448Deferring Expensive List Filters
URL structure aids comprehension
`/dashboard/analytics` reads better than `/dashboard-analytics`
Lesson 1842When to Nest vs Flatten Routes
Use `componentDidUpdate`
to respond to prop changes with side effects
Lesson 302getDerivedStateFromProps: Syncing State to Props
Use `createRoot`
for purely client-side applications:
Lesson 1644hydrateRoot vs createRoot
Use `hydrateRoot`
after server-side rendering:
Lesson 1644hydrateRoot vs createRoot
Use `useDeferredValue`
when receiving props:
Lesson 1447useDeferredValue vs useTransition
Use `useMemo` inline
when your computation **depends on props or state**:
Lesson 699When to Extract vs Inline with useMemo
Use `useTransition`
when you own the state:
Lesson 1447useDeferredValue vs useTransition
Use `vi.mocked()`
to get TypeScript-safe access
Lesson 2080Mocking Custom Hooks
Use a controlled component
(`value` + `onChange`)
Lesson 503When Default Props Don't Update
Use a ref
to imperatively set `inputRef.
Lesson 503When Default Props Don't Update
Use absolute paths
rarely, when you need to escape the parent's path for architectural reasons while maintaining the component hierarchy.
Lesson 1835Path Construction in Nested Routes
Use behavior props
when consumers need to customize logic conditionally:
Lesson 1182When State Reducer is Overkill
Use callbacks
when consumers need to react to state changes or inject side effects:
Lesson 1182When State Reducer is Overkill
Use case
Web components, testing selectors, or progressive enhancement scripts often need custom attributes.
Lesson 103Custom Attributes: When They Work and When They're StrippedLesson 1779Initial Data and Placeholder Data
Use case example
An expensive analytics loader that only needs fresh data when users explicitly refresh, not after every action.
Lesson 1854shouldRevalidate for Fine-Grained Control
Use composition over configuration
Instead of adding 20 boolean props to a single component, consider breaking it into smaller pieces users can compose themselves—but only when the added flexibility justifies the learning curve.
Lesson 1154The Flexibility vs Simplicity Tradeoff
Use controlled props
when consumers need to override specific state values:
Lesson 1182When State Reducer is Overkill
Use experimental features
(new libraries, beta APIs)
Lesson 1311Component-Level Boundaries for Risky Code
Use functional updates
or `useRef` in those handlers to avoid dependencies that change
Lesson 946Memoizing Component Lists with Map Callbacks
Use it sparingly
Only apply it to elements where the mismatch is unavoidable (timestamps, random IDs, browser- only features).
Lesson 101suppressHydrationWarning: The Escape Hatch
Use labels
to mark important moments and build from them
Lesson 2012GSAP for Complex Timeline Animations
Use metadata APIs
in new pages while old pages keep their helmet solution
Lesson 1521Migration Strategy: Incremental Adoption
Use nested boundaries
for hierarchical, progressive disclosure:
Lesson 1377Multiple Suspense Boundaries: Nested vs Sibling
Use props
when the parent component should be in charge (display a user's name passed from above)
Lesson 228Props vs State: Who Owns the Data
Use React DevTools
Inspect the Components tab to see which components are mounting/unmounting unexpectedly during list updates.
Lesson 161Debugging Key-Related Issues
Use relative paths
(99% of cases) when the child logically belongs under the parent in your URL structure.
Lesson 1835Path Construction in Nested Routes
Use sibling boundaries
when you have independent features on the same page:
Lesson 1377Multiple Suspense Boundaries: Nested vs Sibling
Use stable keys
that represent the actual identity of your data.
Lesson 1273Memory Leaks from Incomplete Cleanup
Use state
when the component itself needs to manage the value (track whether a toggle is on/off)
Lesson 228Props vs State: Who Owns the Data
Use those primitives
inside your memoized function
Lesson 880Extracting Primitive Values from Objects
Used on every page
shared layouts, common UI components
Lesson 1358Lazy vs Eager: When Each is Right
User authentication
(login state, user profile) — changes on login/logout
Lesson 839Identifying Independent State Domains
User context switches
Clear errors when a different user logs in or when switching between accounts.
Lesson 1327resetKeys for Automatic Recovery
User doing something
→ Event handler
Lesson 681The Mental Model: Cause and Effect
User experience
Extra loading states mean more spinners, more layout shifts
Lesson 642Client-Side Fetching: The Hidden Cost
User impact severity
– Did one button break, or the entire app?
Lesson 1316Contextual Error Messages by Location
User intent alignment
Code loads when users actually need it
Lesson 1423Route-Level Splitting: The Sweet Spot
User interactions
A search box that filters results as you type needs immediate, client-side data fetching.
Lesson 1573Client-Side Data Fetching Still Exists
User preferences Context
Theme, language (stable)
Lesson 1692Multiple Contexts for Performance
User Profile
Basic user info (name, avatar) that many components display but rarely updates.
Lesson 1690Context for Simple App-Wide State
User-generated content
that changes frequently
Lesson 1782The staleTime Configuration
User-perceptible lag
Typing feels sluggish, scrolling stutters, or interactions feel delayed
Lesson 2237Tracking vs Fixing: When to Act
Users need immediate feedback
There's a text input or button that must feel responsive
Lesson 1436When useTransition Actually Helps
Users see magic
from their perspective, components "just work" together
Lesson 1090Creating a Private Context for Compound Components
Utility functions
are plain JavaScript functions that perform calculations or transformations without any React features.
Lesson 970Custom Hooks vs Utility FunctionsLesson 1713Reading State Without Subscribing
Utils folder
If it's a plain function doing calculations, transformations, or formatting.
Lesson 64Common Top-Level Folders: hooks, utils, types

V

Validation
You control exactly what appears in the input
Lesson 462Why Controlled Components Re-render on Every Change
Validation before storage
You can reject or transform input before it reaches state
Lesson 1195Controlled Forms: Single Source of Truth Principle
Validation errors
"Email is invalid" messages
Lesson 1683Form State: Almost Always Local
Value-tracking animations
Following a moving target (cursor, scroll position) where the destination keeps changing
Lesson 2011React Spring for Natural, Physics-Based Motion
Verbose code
Every intermediate component must accept and pass along props it doesn't need
Lesson 266What is Prop Drilling?
Verify prop types
Remove non-serializable props (functions, Dates, class instances)
Lesson 1545Debugging Boundary Violations
Verify proper splits
Each lazy-loaded route should appear as its own chunk file.
Lesson 1402Route-Based Bundle Analysis
Verify stability
Keys shouldn't change between renders.
Lesson 161Debugging Key-Related Issues
Verifying the fallback UI
renders when the error occurs
Lesson 2136Why Error Boundaries Need Special Testing
Vertical stacking
Shows component hierarchy (children appear below parents)
Lesson 71Reading Profiler FlamegraphsLesson 2269Reading Profiler Flamegraphs
Very simple components
(2-3 lines) that exist purely to support one main component
Lesson 201One Component Per File (Usually)
Views
that *listened* to those events and re-rendered themselves
Lesson 20Backbone.js: MVC in the Browser
Virtual DOM Concept
from our last lesson?
Lesson 13Reconciliation: React's Diffing Algorithm
Visual continuity
Keep the error message in the same location as the loading spinner.
Lesson 1320Loading-to-Error Transition Design
Visual distinction
Action types stand out immediately in your code.
Lesson 767Naming Action Types: SCREAMING_SNAKE_CASE
Visual glitches
Components animate to wrong positions, or content "jumps" during updates.
Lesson 161Debugging Key-Related IssuesLesson 439Batching Hides Individual Updates
Visual hierarchy is clear
Settings → Profile → Avatar feels naturally nested
Lesson 1842When to Nest vs Flatten Routes
Visual noise
If every minor component has a fallback UI, users see fragmented error screens everywhere instead of one cohesive recovery experience.
Lesson 1312Avoiding Boundary Overuse
Visual options
`disabled`, `placeholder`, `className`
Lesson 1170Prop Getter Arguments: Customization Points
Vite Integration
If you're already using Vite (which powers modern React tooling like Create-React-App alternatives), Vitest reuses your *exact* Vite config.
Lesson 2024Why Vitest Over Jest for Modern React
Vite/CRA
Requires manual webpack/Babel plugin setup
Lesson 1512Compiler Adoption Timeline and Stability
Vitest
is your test runner—it finds, executes, and reports on your tests.
Lesson 2025Installing Vitest and Testing Dependencies

W

WAI-ARIA compliant components
by simply assembling the compound parts correctly.
Lesson 1104Accessibility Built Into Compound Components
Wait if
Your team prefers battle-tested tools, lacks React expertise, or can't afford unexpected debugging sessions from compiler edge cases.
Lesson 1512Compiler Adoption Timeline and Stability
Waiting for the server
– users see a loading spinner while the mutation completes
Lesson 609Optimistic Updates and Mutations Made Simple
Wasted bandwidth
Mobile users pay for data
Lesson 583When Ignore Flags Aren't Enough
Wasted renders
Empty render → loading render → data render (three renders for one piece of data)
Lesson 642Client-Side Fetching: The Hidden Cost
Watches the dependency array
for changes
Lesson 874The Mental Model: Cache Invalidation
Web Components
are built directly into browser standards.
Lesson 27Web Components: Standards-Based Approach
Webpack
as its bundler, which works but is significantly slower than modern alternatives like Vite.
Lesson 49Create React App: The Legacy StandardLesson 54Webpack from Scratch
WebSocket messages
arriving continuously
Lesson 813When NOT to Use Context: Frequent Updates
WebSockets
, **Server-Sent Events (SSE)**, or **GraphQL subscriptions**, libraries like TanStack Query don't handle these out of the box.
Lesson 611When useEffect Data Fetching Still Makes Sense
What data it needs
(its inputs)
Lesson 10Component-Based Architecture
What goes wrong
On first render when `userId` is null, React records zero hooks.
Lesson 1027Calling Hooks After Early Returns
What happens
Server renders `className="light"`.
Lesson 1657Common Cause: Conditional Rendering Based on State
What it displays
(the visual structure)
Lesson 10Component-Based Architecture
What the transpiler does
It transforms your clean JSX into these calls
Lesson 76JSX Without a Transpiler: The Raw API
When it occurred
relative to other commits
Lesson 2211Understanding Commit Information
When resolved
, React triggers a re-render of the suspended subtree
Lesson 1339How Suspense Detects 'Not Ready'
When SEO Doesn't Matter
Internal tools, browser extensions, desktop-like web apps (Slack, Discord).
Lesson 1673CSR Trade-offs: Interactivity vs Initial Load
When successful
Neither boundary activates, content renders normally
Lesson 1381Suspense Boundaries and Error Boundaries Together
When the closure executes
(inside the callback)
Lesson 404Debugging Stale State with Logging
When the Promise resolves
, React retries rendering the component
Lesson 1348What React.lazy() Does Under the Hood
When to annotate explicitly
If the inferred type is too broad (like `string` instead of a literal type), or you want to enforce a specific shape:
Lesson 2388Typing useMemo and useCallback
When to expose
You want to control which operations are allowed (encapsulation).
Lesson 728Forwarding Refs to Nested Components
When to forward
The parent needs full DOM access (measuring, scrolling).
Lesson 728Forwarding Refs to Nested Components
When to use it
For user-facing pages where you want the fastest possible First Contentful Paint (FCP).
Lesson 1668The onShellReady and onAllReady Callbacks
Which components
actually render during user interactions
Lesson 2268Profiling Before Adding memo
Which components are slowest
Look for the widest, brightest bars
Lesson 2223Reading the Profiler Flamegraph
Which components got memoized
Verify expensive renders are wrapped
Lesson 1510Debugging Compiler Output
Which prop changed
(and shows old vs new values)
Lesson 2229The 'Record why each component rendered' Setting
Which props changed
between renders (with old and new values)
Lesson 2212Identifying Why a Component Rendered
Which state changed
(if managed by hooks)
Lesson 2212Identifying Why a Component Rendered
Which users
are affected (browser, device, location)
Lesson 1330Why Log Errors Remotely: Visibility into Production
Who consumes it
(Only the header needs user info; only one modal needs form data)
Lesson 839Identifying Independent State Domains
Why components rendered
(props change, state change, parent re-rendered)
Lesson 70Profiler Tab: Recording Performance Sessions
Why does this happen
JavaScript methods aren't bound to their object by default.
Lesson 292Binding Event Handlers: The this Problem
Why each component rendered
(props change, state change, parent rendered, hooks changed)
Lesson 2211Understanding Commit Information
Why it fails
`"Click me"` is a string, not a `ReactElement`.
Lesson 2349Common Children Typing Pitfalls
Why it rendered
(if you enabled that setting)
Lesson 2269Reading Profiler Flamegraphs
Why JSX exists
Writing nested UIs this way is brutally verbose
Lesson 76JSX Without a Transpiler: The Raw API
Why optimization failed
Look for dynamic dependencies or non-compiler-friendly patterns
Lesson 1510Debugging Compiler Output
Why pass `props`
Passing `props` to `super()` ensures that `this.
Lesson 290constructor() and super(props)
Why the difference
JSX is JavaScript, not HTML.
Lesson 96camelCase Attributes: style, onClick, onChange
Why the exception
Because `use()` reads values (Promises or Context) rather than creating stateful slots.
Lesson 1475Conditional use() Calls: Breaking Hook Rules Intentionally
Why this happens
Arrow functions are expressions.
Lesson 2244Callback Props with Inline Arrow Functions
Why this matters
Imagine testing how your button looks when the `isLoading` state is `true`.
Lesson 69Editing Props and State Live
Why this wins
Related fields stay grouped, your component has one state variable instead of twenty, and submission becomes `fetch('/api/user', { body: JSON.
Lesson 1205Nested State Structures for Forms
Wide cascades
Many components at different tree levels all rendering simultaneously
Lesson 2322Measuring Context Performance Impact
Wide subtrees
where many children render because of one parent
Lesson 2216Identifying Cascading Renders in the Flame Graph
Wide yellow/orange bars
these are your slowest components
Lesson 71Reading Profiler Flamegraphs
width
of each bar indicates how long that component took to render—wider bars mean slower renders.
Lesson 2223Reading the Profiler FlamegraphLesson 2269Reading Profiler Flamegraphs
With `React.memo`
Child components disappear from recordings when their props stay the same (referentially equal)
Lesson 918Demonstrating Skipped Renders with DevTools Profiler
With HMR
You save the file → button text updates instantly → counter *stays at 47*.
Lesson 43Hot Module Replacement (HMR)
With HOCs
Wrap a render prop component in an HOC when you need to inject additional props or behavior that's unrelated to the render logic itself:
Lesson 282Combining Render Props with Other Patterns
With Hooks
Use hooks *inside* your render prop component to manage state or effects, keeping the render prop pattern for the flexible rendering part:
Lesson 282Combining Render Props with Other Patterns
With JavaScript
React Router intercepts the submission, calls your action function, and updates the UI without reloading.
Lesson 1849Form Component: Progressive Enhancement
With JS
React prevents the default submission, calls your Server Action seamlessly, and updates the UI without a full page reload.
Lesson 1601Server Actions in Forms: The action Prop
With Provider
Atoms get a fresh scope for that subtree
Lesson 1727The Provider Component (When Needed)
With React Hook Form
Only the specific input field re-renders (at the DOM level), while your React component stays untouched.
Lesson 1227Performance Comparison: RHF vs Controlled
With Server Components
, you skip the middle steps entirely:
Lesson 1551Data Flow: Server Components Have Direct Backend Access
With stable keys
, React can think: "Old element with key='user-42' matches new element with key='user-42', regardless of position.
Lesson 1254Keys and React's Reconciliation Algorithm
With TypeScript
, you'll get a compile-time error before your code even runs:
Lesson 226The Error When You Try to Mutate Props
With uncontrolled components
, you need:
Lesson 513Forms with Minimal State Requirements
Without `React.memo`
Child components appear in every profiler recording when the parent re-renders
Lesson 918Demonstrating Skipped Renders with DevTools Profiler
Without `useMemo`
Every time you toggle view mode, React re-runs the entire filtering and sorting logic on all 10,000 items—even though the search term and sort order haven't changed.
Lesson 892Real Example: Filtering and Sorting Large Lists
Without HMR
You save the file → browser refreshes → counter resets to 0 → you have to click 47 times again.
Lesson 43Hot Module Replacement (HMR)
without JavaScript
(progressive enhancement), and when JS loads, React upgrades it to a smooth, no-refresh experience.
Lesson 1610Server Actions as Form HandlersLesson 1849Form Component: Progressive Enhancement
Without JS
The browser does a traditional form POST.
Lesson 1601Server Actions in Forms: The action Prop
Works with existing tools
Tailwind plays nicely with CSS Modules, CSS variables, and even CSS-in-JS for edge cases.
Lesson 1953Tailwind's Rise as the Pragmatic Middle Ground
Works with progressive enhancement
even without JavaScript, forms still submit once
Lesson 1494Building Disabled Submit Buttons
Wrap callbacks
passed to that child with `useCallback`
Lesson 2286Combining memo, useMemo, and useCallback
Wrap conditional content
`AnimatePresence` must be the parent of conditionally rendered `motion` elements
Lesson 1979AnimatePresence for Enter/Exit Animations
Wrap object/array values
passed to that child with `useMemo`
Lesson 2286Combining memo, useMemo, and useCallback
Wrap your component
with `forwardRef()`
Lesson 726Basic forwardRef Pattern
wrapper component
is a component whose primary job is to "wrap around" other components and add something extra — like styling, error handling, or common layout structure.
Lesson 193Wrapper Components for Shared BehaviorLesson 252Wrapper Components with Children
Wrapper component proliferation
If everyone creates wrapper components to simplify your API, you've pushed complexity onto users.
Lesson 1163When Inversion Becomes Over-Engineering
Wrapper components
`<DialogTitle>`, `<DialogContent>`, etc.
Lesson 1120The Problem Slots Solve: Multiple Content Areas
Wrapper elimination
Avoid rendering containers for empty slots
Lesson 1133Optional Slots with Conditional Rendering
Wrapper-based styling
where you style a container div
Lesson 1909Common Pitfalls
Write Context
Holds the dispatch function or setter functions
Lesson 843Read-Only vs Write-Only Context Split
Write your component naturally
without memoization
Lesson 875Reading the React Docs on When to Memoize
Writing framework adapters
Code that bridges React to other systems might require non-standard hook patterns
Lesson 1040Library Authors: When You Actually Need Overrides
Wrong abstraction
You're treating synchronous data (props) as an asynchronous event
Lesson 683The Props-Change-Triggers-Effect Antipattern
Wrong components update
When you reorder items, React might update the wrong DOM nodes
Lesson 142The Key Prop Requirement
Wrong content
You edit "Item A" but "Item B" changes instead.
Lesson 161Debugging Key-Related Issues
Wrong initial state
→ flash of incorrect content
Lesson 672Testing Render vs Effect Approaches
Wrong solution
The real issue might be needing `useCallback` or functional updates, but auto-fix just adds the problematic dependency
Lesson 1023Auto-Fix Behavior and Pitfalls

Y

Yellow/Orange bars
These components took longer to render
Lesson 71Reading Profiler Flamegraphs
You can trace problems
because data flow is visible
Lesson 16Explicit Over Implicit
You catch real bugs
typos in `mapStateToProps`, wrong context key, broken hooks.
Lesson 2123When Container/Presentational Split Doesn't Matter
You need GraphQL-specific tooling
fragment composition, automatic TypeScript generation from schema, Apollo DevTools graph visualization
Lesson 1830When Apollo Fits vs TanStack Query
You need proven stability
React Router has years of production use across millions of apps
Lesson 1885When TanStack Router Fits vs React Router
You need routing flexibility
Client-only SPAs, hybrid approaches, or custom route organization beyond file-system constraints
Lesson 1893When Next.js Routing Fits vs React Router
You provide a function
that returns a dynamic `import()` statement
Lesson 1348What React.lazy() Does Under the Hood
You validate the values
(check for empty fields, format, length, etc.
Lesson 520Combining Uncontrolled Inputs with Validation
You verify the integration
does the selector work?
Lesson 2123When Container/Presentational Split Doesn't Matter
You want abundant resources
More tutorials, Stack Overflow answers, and third-party integrations exist
Lesson 1885When TanStack Router Fits vs React Router
You want explicit dependencies
seeing props makes data flow obvious
Lesson 808Context vs Props: Choosing the Right Tool
You want framework independence
React Router works with any bundler or backend—no Next.
Lesson 1893When Next.js Routing Fits vs React Router
You want minimal setup
for proof-of-concepts or simple apps
Lesson 1482When use() Fits vs TanStack Query or Loaders
You write normal components
without thinking about the boundary
Lesson 1536Default is Server: The New Mental Model
You're animating CSS properties
like `opacity`, `transform`, `background-color`
Lesson 2009CSS Transitions for Simple State Changes
You're building library code
where consumers need maximum flexibility in rendering
Lesson 284Render Props vs Hooks: The Modern Tradeoff
You're testing integration points
The value is in how pieces work *together*
Lesson 2083When NOT to Mock: Testing Philosophy
You're using REST APIs
or a mix of data sources (REST + WebSockets + custom endpoints)
Lesson 1830When Apollo Fits vs TanStack Query
You've profiled
and identified a bottleneck
Lesson 911Clean Code vs Optimized Code
Your component
calls the consumer's reducer with the current state, action, and any changes you were planning to make
Lesson 1177Consumer-Provided Reducer Override
Your tests survive refactoring
merge container and presentational?
Lesson 2123When Container/Presentational Split Doesn't Matter
Yup
was the de facto standard for schema-based form validation in React.
Lesson 1232Validation with Yup Integration

Z

Zero JavaScript by default
your component doesn't ship code to the browser unless it needs to
Lesson 1621The Default: Start with Server Components
Zero-runtime
means your styling solution extracts all CSS at **build time** and ships static `.
Lesson 1933What Zero-Runtime Means
Zero-runtime CSS solutions
like vanilla-extract work fine because they generate CSS at build time—no browser JavaScript needed.
Lesson 1951Server Components Break Runtime CSS-in-JS
Zod
is a TypeScript-first schema validation library.
Lesson 1225Schema Validation with Zod Resolver
Zombie fetch requests
updating unmounted components
Lesson 601Why React Does This: Finding Missing Cleanup
Zustand
and **Jotai** take a different path: they don't use context at all.
Lesson 863Alternatives: Zustand and JotaiLesson 2257Comparing Context Overhead to Alternatives