React Glossary
Key terms from the React course, linked to the lesson that introduces each one.
2,717 terms.
#
- `ease`
- Default, slight ease-in and ease-out
- Lesson 1961 — Timing Functions and DurationLesson 1970 — The transition Prop: Controlling Animation Timing
- `error`
- The actual JavaScript error object thrown
- Lesson 1302 — Logging Errors to ServicesLesson 1823 — useQuery Hook for Data Fetching
- `exhaustive-deps`
- Warns when dependency arrays in `useEffect`, `useCallback`, or `useMemo` might be missing dependencies
- Lesson 1017 — What eslint-plugin-react-hooks DoesLesson 1018 — Installing and Configuring the Plugin
- `isPending`
- A boolean flag that's `true` while the action is in flight and `false` otherwise.
- Lesson 1484 — The useActionState SignatureLesson 1792 — useMutation BasicsLesson 2303 — The isPending Flag for Loading States
- `onChange`
- When the user types, this handler fires on every keystroke
- Lesson 455 — Controlled Text InputsLesson 1217 — The register Function: Connecting InputsLesson 1542 — Interactive Features Require 'use client'
- `queryKey`
- An array that uniquely identifies this query (like `['todos']` or `['user', userId]`)
- Lesson 1770 — useQuery: The Basic Data Fetching HookLesson 1780 — Query Function Context and Signals
- `ReactElement`
- – Stricter, only accepts actual JSX elements (the result of `<Component />`).
- Lesson 1145 — Type Safety with JSX PropsLesson 2342 — When 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 1145 — Type Safety with JSX PropsLesson 2342 — When 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 1017 — What eslint-plugin-react-hooks DoesLesson 1018 — Installing and Configuring the Plugin
- `state`
- The current state value.
- Lesson 1484 — The useActionState SignatureLesson 1753 — Using Machines in React with useMachine
- `type`
- A string that identifies what happened (required)
- Lesson 763 — Action Objects: type and payloadLesson 1970 — The transition Prop: Controlling Animation Timing
- `useDeferredValue`
- Use when **you don't control the state update** (the value comes from props or external sources)
- Lesson 1447 — useDeferredValue vs useTransitionLesson 1451 — The Debounce AlternativeLesson 1542 — Interactive Features Require 'use client'Lesson 2022 — Reducing JavaScript Work During Animations
- `useEffect`
- Side effects happen in the browser, not during server rendering
- Lesson 1542 — Interactive Features Require 'use client'Lesson 1622 — When You MUST Use Client: Interactivity
- `useState`
- Managing changing values requires client-side JavaScript
- Lesson 1542 — Interactive Features Require 'use client'Lesson 1622 — When You MUST Use Client: Interactivity
- `useTransition`
- doesn't wait at all.
- Lesson 1437 — useTransition vs debouncingLesson 1447 — useDeferredValue vs useTransitionLesson 2022 — Reducing JavaScript Work During Animations
- `value`
- attribute (their individual identity)
- Lesson 484 — Radio Buttons: Grouping by nameLesson 500 — defaultValue vs value: The Key Difference
- `value` prop
- displays that state on the input
- Lesson 480 — The Standard Controlled Input PatternLesson 791 — The Provider's value Prop
A
- Abandon
- work if it becomes obsolete
- Lesson 409 — Fiber: React's Internal Reconciliation EngineLesson 1435 — Transitions and Component Re- rendersLesson 1455 — The Interruptible Render: What Makes Concurrent Mode Different
- AbortController
- .
- Lesson 557 — Cleanup for AbortControllerLesson 592 — The Complete Abort Pattern in One Example
- Above-the-fold vs below-the-fold
- content not immediately visible
- Lesson 1358 — Lazy vs Eager: When Each is Right
- Accidental Prop Forwarding
- Lesson 263 — The Indiscriminate Spread Antipattern
- Accordions
- The accordion container manages which sections are open.
- Lesson 1087 — When to Use This Pattern
- Action creators
- are simple functions that return action objects.
- Lesson 765 — Action Creators: Functions That Return Actions
- Action filtering and search
- find specific mutations in large applications
- Lesson 1703 — Developer Experience: DevTools and Time Travel
- Action history
- every state change logged with timestamps and payloads
- Lesson 1703 — Developer 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 1320 — Loading-to-Error Transition Design
- Action Permalinks
- solve this by serializing the action's state into the URL, making the results shareable and bookmarkable.
- Lesson 1490 — Action Permalinks
- Actions
- that describe what happened
- Lesson 751 — When You'd Reach for Redux but It's OverkillLesson 1711 — Actions Inside the StoreLesson 1748 — Strict Architectural Boundaries and TestabilityLesson 1755 — Actions: Side Effects on TransitionsLesson 1843 — The Data Router Paradigm Shift in v6.4Lesson 1848 — Route Actions for MutationsLesson 2170 — Page Object Model Pattern
- Actions are low-stakes
- Liking a post, marking as read, simple toggles
- Lesson 1802 — Pessimistic vs Optimistic: When to Choose
- Active
- At least one component is using this query
- Lesson 1773 — Automatic Caching: How TanStack Query Stores DataLesson 1775 — Cache Garbage Collection: cacheTime / gcTime
- Add `defaultValue`
- instead of `value` props
- Lesson 1203 — Migration Strategy: Converting Between Approaches
- Add `onChange` handlers
- to update state
- Lesson 1203 — Migration Strategy: Converting Between Approaches
- Add a dev server
- Configure `webpack-dev-server` for local development (no HMR by default!
- Lesson 54 — Webpack from Scratch
- Add keys to fragments
- When using `<Fragment>` in arrays, don't forget `<Fragment key={item.
- Lesson 161 — Debugging Key-Related Issues
- Add state
- for each input you need to control
- Lesson 1203 — Migration Strategy: Converting Between Approaches
- Adding items
- Insert the new item into the cached array immediately (usually at the start or end).
- Lesson 1798 — Optimistic Updates for Lists
- Adds development-mode checks
- for common mistakes (like mutating state)
- Lesson 1731 — Creating a Store with configureStore
- Advanced easing
- Hundreds of easing functions built-in
- Lesson 2000 — Why 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 720 — The Ref Callback Pattern
- Advantage
- Deep nesting doesn't confuse intent — `header={.
- Lesson 1150 — Composability Comparison: Nesting and Flexibility
- After (Hooks)
- Call a function, get values, use them directly in your component.
- Lesson 284 — Render Props vs Hooks: The Modern Tradeoff
- After (lifted content)
- Lesson 2256 — When Context is Wrong: Lift Content Up Instead
- After (Object Lookup)
- Lesson 131 — Object Lookup Patterns for Mapping
- After (React 19)
- Lesson 1514 — Automatic ref Forwarding in Function Components
- After adding `useMemo`
- Lesson 893 — Measuring the Impact of useMemo
- After adding `useTransition`
- Lesson 2310 — Measuring Impact: Profiling Before and After useTransition
- After destructuring
- Lesson 240 — Destructuring Props in Function Parameters
- After form submission
- refocus the input for another entry
- Lesson 734 — Imperative Focus in Event Handlers
- After hydration
- `useEffect` runs, updates state to real width, triggers re-render with actual value
- Lesson 1658 — The useEffect Solution Pattern
- After lifting state down
- to the form component, the parent no longer re-renders.
- Lesson 2319 — Combining with React.memo for Maximum Effect
- After optimization
- Wrap your component with `React.
- Lesson 932 — Profiling Before and After: Measuring memo's Impact
- After recording
- Add your `useMemo` or `useCallback`, then profile the same interaction again.
- Lesson 2282 — Profiling Before and After Memoization
- After refetch
- `data` updates with fresh value, `isFetching` becomes `false`
- Lesson 1781 — Stale-While-Revalidate Explained
- all
- values are the same, React skips the effect entirely.
- Lesson 612 — What the Dependency Array Actually DoesLesson 721 — Multiple Refs in ListsLesson 803 — Component Re-renders on Context ChangesLesson 827 — How Context Triggers Re-rendersLesson 871 — When Memoization Actually RunsLesson 1667 — Selective Hydration with StreamingLesson 1801 — Global Mutation Defaults
- All components exported
- from that file are Client Components
- Lesson 1537 — The Module Boundary, Not Component Boundary
- All of them simultaneously
- when the Provider's value changes
- Lesson 828 — The Scope of Consumer Re-renders
- Almost
- Here's the trap: the number `0` is *falsy* in JavaScript, but React *renders numbers as text*.
- Lesson 112 — The Zero Trap: 0 Renders Visibly
- Already-optimized code
- If you've memoized effectively and your renders are quick, transitions won't help.
- Lesson 1469 — When 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 1285 — Accessibility Considerations
- Analogy
- JSX is like writing in English while `createElement` is writing in assembly language.
- Lesson 76 — JSX Without a Transpiler: The Raw APILesson 77 — Why JSX Improves Developer ExperienceLesson 81 — Why React Must Be In Scope (Classic Transform)Lesson 102 — SVG Attributes in JSX: Subtle Naming DifferencesLesson 176 — Profiling Key-Related Performance IssuesLesson 234 — Inline Arrow Functions vs Stable ReferencesLesson 297 — componentDidMount: Side Effects After First RenderLesson 299 — componentWillUnmount: Cleanup Before Removal (+34 more)
- Analytics
- Record when users perform actions
- Lesson 769 — Meta Fields: Adding Timestamps, IDs, or Metadata
- Animation completes
- Lesson 1980 — The exit Prop and Unmount Timing
- Animation frame data
- Lesson 813 — When NOT to Use Context: Frequent Updates
- Animations
- "is animating" flags, current frame numbers
- Lesson 1685 — Temporary State: Counters, Timers, Animations
- Another alternative—explicit props
- Lesson 257 — When Children Becomes Too Magic
- Another example
- Form state with `firstName`, `lastName`, and `fullName` (derived from both).
- Lesson 845 — When Not to Split: Tightly Coupled State
- any
- of these features, controlled components are the better path:
- Lesson 515 — Recognizing When Controlled is Still BetterLesson 539 — Array with Values: Run When Dependencies ChangeLesson 542 — Multiple DependenciesLesson 612 — What the Dependency Array Actually DoesLesson 871 — When Memoization Actually RunsLesson 1157 — The Controlled vs Uncontrolled Pattern GeneralizedLesson 1348 — What React.lazy() Does Under the Hood
- API calls
- to remote servers
- Lesson 2075 — Why Module Mocking is Necessary in TestsLesson 2135 — The Integration Test Sweet Spot
- API endpoint issues
- Environment variables that differ between dev and production
- Lesson 47 — Previewing 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 1609 — When to Use Server Actions vs API Routes
- App developers
- typically always use Providers, so the default becomes just a TypeScript placeholder or `null`
- Lesson 793 — Default Values vs Provider Values
- App-level boundaries
- caught a catastrophic failure.
- Lesson 1316 — Contextual Error Messages by Location
- App-level boundary
- Wraps your whole app → shows full-page error with contact info
- Lesson 1321 — Nested Boundary Fallback Strategies
- App-specific state
- that isn't shared across multiple applications.
- Lesson 785 — When This Pattern Beats External State Libraries
- Append-only lists
- where you only add to the end
- Lesson 162 — The 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 1104 — Accessibility Built Into Compound Components
- ARIA attributes
- (`aria-*`) provide accessibility information to screen readers.
- Lesson 99 — data-* and aria-* Attributes: The kebab-case Exceptions
- array
- of selected option values instead of a single string.
- Lesson 460 — Multi-Select DropdownsLesson 486 — Multi-Select: value as Array
- Array children with conventions
- `<Dialog>{[title, content, actions]}</Dialog>` — fragile and requires documentation
- Lesson 1120 — The Problem Slots Solve: Multiple Content Areas
- Array Type Confusion
- Lesson 2349 — Common Children Typing Pitfalls
- Array with values
- Effect runs when any listed value changes
- Lesson 536 — What is the Dependency Array?
- Arrays
- Lesson 215 — Curly Braces for Non-String ValuesLesson 251 — Children Types: Elements, Strings, NumbersLesson 1206 — Arrays in Form StateLesson 1552 — Prop Serialization Across the BoundaryLesson 2340 — ReactNode: The Broadest Children Type
- Arrays of specific types
- Beyond simple primitives
- Lesson 2381 — Typing useState: Explicit Type Arguments
- As attribute values
- Lesson 83 — Curly Braces: The Escape Hatch to JavaScript
- As effect dependencies
- Lesson 898 — useCallback for Stable Function References
- As text content
- Lesson 83 — Curly Braces: The Escape Hatch to JavaScript
- Ask yourself
- "Can I wrap the state update in `startTransition()`?
- Lesson 1447 — useDeferredValue vs useTransition
- Assemble everything
- (executing and hydrating the app)
- Lesson 1556 — The Traditional SPA Performance Problem
- assert
- the context exists:
- Lesson 1094 — Type-Safe Context for Compound ComponentsLesson 2163 — Your First Playwright Test
- Asserting
- that the original component tree renders again successfully
- Lesson 2141 — Testing Reset Functionality
- Async code
- (timers, fetch) often runs after other updates
- Lesson 369 — The Closure Trap with Direct UpdatesLesson 424 — When Batching Doesn't Apply
- Async debugging
- Record a slow interaction, export it, and analyze it later without time pressure
- Lesson 2219 — Exporting and Sharing Profiler Data
- Async-first patterns
- With built-in Suspense integration, Jotai handles async atoms elegantly—no middleware required.
- Lesson 1729 — When Jotai Fits: Bottom-Up State
- at the same time
- Lesson 1382 — Waterfall Prevention with Parallel SuspenseLesson 1578 — Multiple Async Components in ParallelLesson 1982 — The mode Prop: wait, sync, and popLayout
- Atom dependencies
- Visualize which atoms depend on others (e.
- Lesson 1728 — Jotai DevTools and Debugging
- Attach
- event listeners to make things interactive
- Lesson 1647 — The Cost of Hydration: CPU and Time to Interactive
- Attaches event listeners
- to the existing DOM nodes
- Lesson 1642 — What Hydration Is: Attaching Event Listeners to Server HTML
- Attributes
- Do props like `className`, `id`, and `data-*` match?
- Lesson 1654 — How React Detects MismatchesLesson 2167 — Assertions with expect()
- Auth + Settings
- Checking authentication status while reading app preferences
- Lesson 804 — Multiple Contexts in One Component
- Authenticated Dashboards
- If users must log in first, there's no SEO benefit to server-rendering.
- Lesson 1673 — CSR 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 1573 — Client-Side Data Fetching Still Exists
- Authentication flow
- Login, logout, session persistence
- Lesson 2191 — Balance: Enough E2E Coverage Without Fragility
- Authentication Flows
- Lesson 1758 — When XState Fits: Complex Workflows and Multi-Step ProcessesLesson 1856 — Programmatic Navigation with useNavigateLesson 2185 — E2E Tests for Integration Points
- Authentication status
- Nearly every component might need to know if a user is logged in
- Lesson 810 — Context for Truly Global StateLesson 1690 — Context for Simple App-Wide State
- Authentication walls everything
- Users must log in before seeing anything meaningful (no SEO benefit)
- Lesson 1652 — When to Skip SSR: SPAs and Hydration-Heavy Apps
- Authentication wrappers
- that check login status across multiple routes
- Lesson 1838 — Pathless Routes for Shared Layouts
- Auto-formatting
- while typing (phone numbers, credit cards, currency)
- Lesson 515 — Recognizing When Controlled is Still Better
- Automatic `children` prop
- typed as `ReactNode | undefined`, even if you don't need it
- Lesson 2390 — What React.FC Is and Does
- Automatic Critical CSS
- Lesson 1922 — CSS-in-JS Philosophy: Colocation and Dynamic Styles
- Automatic deduplication
- If two components request the same data simultaneously, only one network request fires
- Lesson 596 — Why Libraries Handle This BetterLesson 606 — TanStack Query's Automatic Caching and Deduplication
- Automatic refetching
- on window focus, intervals, or network reconnect
- Lesson 1482 — When 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 596 — Why Libraries Handle This Better
- automatically
- with the DOM node when the element mounts, and with `null` when it unmounts.
- Lesson 720 — The Ref Callback PatternLesson 1887 — File-System Routing Conventions
- Automatically adds common middleware
- (like `redux-thunk` for async actions)
- Lesson 1731 — Creating a Store with configureStore
- Avoid CSS repetition
- by centralizing layout patterns
- Lesson 194 — Layout 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 1398 — Nested Route Splitting Strategies
- Avoid wrapping
- Lesson 1380 — Finding the Right Granularity
- Avoiding context complexity
- You've outgrown Context but don't want Redux boilerplate.
- Lesson 1729 — When Jotai Fits: Bottom-Up State
- Avoiding Prop Explosion
- Lesson 1106 — Why These Libraries Choose Compound Patterns
- Avoiding typos
- Because action types are plain strings, a typo like `"TOGGLE_COMPLET"` would silently fail (hitting your default case).
- Lesson 767 — Naming Action Types: SCREAMING_SNAKE_CASE
- Avoids brittle module mocks
- MSW mocks at the network boundary, not the module level.
- Lesson 2085 — Why MSW Over Manual Mocks
B
- Babel
- is a *transpiler*—it converts modern JavaScript (including JSX) into older JavaScript that all browsers understand.
- Lesson 54 — Webpack from ScratchLesson 79 — The Role of Babel and Modern Transpilers
- Backend sharing
- Use the same schema on server and client
- Lesson 1225 — Schema 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 606 — TanStack Query's Automatic Caching and DeduplicationLesson 1768 — TanStack Query: What Problem Does It Solve?
- Bad test thinking
- Lesson 2108 — Testing State Changes Through Their Effects
- Balance
- Is the size difference between your main bundle and lazy chunks meaningful, or are they all roughly equal?
- Lesson 1418 — Analyzing Code-Split Chunk SizesLesson 1783 — The cacheTime Configuration
- baseline
- , not a prison.
- Lesson 1801 — Global Mutation DefaultsLesson 2230 — Establishing a Performance Baseline
- Baseline first
- Record a profile of the slow interaction
- Lesson 2247 — Profiling to Confirm the Problem
- Basic Auth Check Pattern
- uses a simple wrapper component that sits between your route and the actual content.
- Lesson 1867 — Basic Auth Check Pattern
- Basic pattern
- Lesson 2007 — useGSAP Hook: The Modern React Pattern
- batches
- them for performance.
- Lesson 291 — this.setState(): The Class Update APILesson 343 — State Updates Are AsynchronousLesson 347 — Multiple setState Calls in One EventLesson 418 — Automatic Batching in Event Handlers
- batching
- .
- Lesson 343 — State Updates Are AsynchronousLesson 417 — What is Batching and Why It Matters
- Battery constraints
- where excessive JavaScript execution drains power
- Lesson 33 — Performance-Critical Mobile Web Apps
- Before (Render Props)
- Nest components, pass functions, manage JSX structure.
- Lesson 284 — Render Props vs Hooks: The Modern Tradeoff
- Before (Switch in IIFE)
- Lesson 131 — Object Lookup Patterns for Mapping
- Before (useEffect)
- Lesson 1481 — Migration Path: From useEffect Fetching to use()
- Before adding `useMemo`
- Lesson 893 — Measuring the Impact of useMemo
- Before adding `useTransition`
- Lesson 2310 — Measuring Impact: Profiling Before and After useTransition
- Before and after values
- so you can see if they're referentially different but structurally identical
- Lesson 2234 — Reading the Console Output
- Before destructuring
- Lesson 240 — Destructuring Props in Function Parameters
- 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 932 — Profiling Before and After: Measuring memo's ImpactLesson 2319 — Combining with React.memo for Maximum Effect
- Before recording
- Profile your component's render behavior without memoization.
- Lesson 2282 — Profiling Before and After Memoization
- Before Server Components
- , you'd write an API route, then fetch from it in your component.
- Lesson 1551 — Data Flow: Server Components Have Direct Backend Access
- Before the mutation runs
- save the current cache state as a snapshot
- Lesson 1795 — Optimistic Updates: The Pattern
- Before/after comparisons
- Export a baseline before optimization, then compare it with a post-fix profile
- Lesson 2219 — Exporting and Sharing Profiler Data
- Behavior flags
- `preventScroll`, `closeOnSelect`
- Lesson 1170 — Prop Getter Arguments: Customization Points
- Behind interactions
- Modals, tooltips, or charts that appear on-demand.
- Lesson 1424 — Component-Level Splitting: When It Helps
- Below-the-Fold Content
- Lesson 2289 — Component-Level Splitting Decisions
- Best for
- Small projects (under 20 components), prototypes, or teams just learning React.
- Lesson 59 — Flat 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 2217 — Using the Interactions Tab (Legacy)
- Better autocomplete
- IDEs can provide better suggestions with a stable object
- Lesson 2044 — The screen Object: Your Query Gateway
- Better composition
- One Suspense boundary can coordinate loading states for *multiple* child components automatically.
- Lesson 1343 — Suspense vs Traditional Loading States
- Better deletions
- Delete the folder, and all related code goes with it
- Lesson 209 — Colocating Tests and Styles with Components
- Better DX
- No repetitive null checks in child components
- Lesson 1094 — Type-Safe Context for Compound Components
- Better error messages
- (you can validate that `Tabs.
- Lesson 1079 — Named Children vs Generic ChildrenLesson 1517 — Stricter Hydration Error Reporting
- Better for performance
- No unnecessary re-renders in unrelated components
- Lesson 1680 — The Local-First Principle
- Better mobile experience
- Critical on slower connections
- Lesson 1384 — What Code Splitting Is and Why It Matters
- Better Names
- `useAppState()` is more descriptive than `useContext(AppStateContext)`.
- Lesson 780 — Custom Hooks for Consuming State and Dispatch
- Better performance
- Minimizes unnecessary re-renders
- Lesson 2001 — Installing GSAP and Basic Setup in ReactLesson 2328 — When to Move to External State
- Better readability
- `addTodo('Buy milk')` is clearer than the raw object
- Lesson 765 — Action Creators: Functions That Return ActionsLesson 800 — Replacing Context.Consumer with useContext
- Better security
- Secrets stay server-side automatically
- Lesson 1551 — Data 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 639 — JSON.stringify as a Last Resort
- 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 2036 — The Mental Model: Black Box Testing
- Block specific tab switches
- when validation fails
- Lesson 1181 — Common Use Cases: Preventing Transitions
- Blocked main thread
- means the UI can't respond to user input during the flush
- Lesson 447 — The Performance Cost of flushSync
- Blogs
- Posts don't change after publishing (or change rarely enough that rebuilding is acceptable)
- Lesson 1677 — SSG Trade-offs: Speed vs Freshness
- Boilerplate Sprawl
- Lesson 577 — Why This Pattern is Problematic at Scale
- Boilerplate that feels tedious
- to rewrite each time
- Lesson 997 — The Signal: When Logic is Repeated Across Components
- Boolean flags
- Like `isEmpty = items.
- Lesson 663 — What is Derived State?Lesson 707 — Common Use Case: Counters and Flags
- Boolean logic
- `const isValid = age >= 18 && hasPermission`
- Lesson 906 — When Simple Values Don't Need useMemo
- Booleans
- Lesson 215 — Curly Braces for Non-String ValuesLesson 2340 — ReactNode: The Broadest Children Type
- both
- previous and current props after the render.
- Lesson 307 — The Lifecycle Diagram: Mental ModelLesson 563 — Visual Flicker and Layout Effect Use CasesLesson 691 — Combining Prop and Local State CorrectlyLesson 1178 — Action Types and State Change ObjectsLesson 1344 — What Suspense Doesn't HandleLesson 1391 — Error Boundaries with Lazy ComponentsLesson 1451 — The Debounce AlternativeLesson 1597 — What Server Actions Are: Functions That Run on the Server (+2 more)
- Bottom (Wide)
- Unit tests — many, fast, isolated tests of individual functions and components
- Lesson 2182 — The Testing Pyramid: Unit, Integration, E2E
- brand new function
- on every render.
- Lesson 1050 — Performance Consideration: Inline Function IdentityLesson 2244 — Callback Props with Inline Arrow Functions
- brand new function object
- on every single render.
- Lesson 616 — Functions in Dependencies: The ProblemLesson 869 — Why Functions Need MemoizationLesson 897 — The Callback Reference Problem
- brand new object
- every single render.
- Lesson 848 — Objects Created Inline Cause All Consumers to Re-renderLesson 851 — Solution 1: useMemo the Context ValueLesson 1896 — Performance Cost of Inline StylesLesson 2240 — Identifying Object Creation in Props
- brand new reference
- on every render—even if the contents are identical.
- Lesson 636 — Moving Objects Outside the ComponentLesson 2235 — Detecting New Object/Function References
- Brittle structure
- Changing the component tree means updating multiple prop definitions
- Lesson 266 — What is Prop Drilling?
- Broken imports
- Sometimes relative paths work in dev but fail in production
- Lesson 47 — Previewing the Production Build
- Browser API inconsistencies
- (localStorage behaves differently in private mode)
- Lesson 2187 — E2E for Cross-Browser and Device Testing
- Browser APIs
- (DOM, timers, events)
- Lesson 1527 — No useState, useEffect, or Event HandlersLesson 2075 — Why Module Mocking is Necessary in TestsLesson 2126 — Mock External Dependencies, Not Internal CodeLesson 2135 — The Integration Test Sweet Spot
- Browser DevTools Sources Tab
- Lesson 82 — Inspecting Compiled JSX Output
- Browser-only Web APIs
- `IntersectionObserver`, `ResizeObserver`, `MediaRecorder`
- Lesson 1623 — When You MUST Use Client: Browser APIs
- Bug fixes
- needing the same change in 4+ locations
- Lesson 997 — The Signal: When Logic is Repeated Across Components
- Bug Reproduction
- A user reports a bug but can't explain the steps.
- Lesson 1744 — Time-Travel Debugging and Audit Requirements
- Bugsnag
- all follow similar integration patterns—they plug into your error boundaries via `componentDidCatch` or provide library wrappers.
- Lesson 1333 — Error Tracking with LogRocket and Other Services
- Build custom when
- Lesson 1194 — The Trade-Off: Bundle Size vs Custom HTML
- Build failures
- before deployment if hook rules are broken
- Lesson 1017 — What eslint-plugin-react-hooks Does
- Build Logs
- The compiler can log which components it optimized and which it skipped.
- Lesson 1510 — Debugging Compiler Output
- Build optimization
- Tools know to process only `src/` contents during development
- Lesson 61 — The src Folder Convention
- Build options
- Control how your production bundle is created—output directory, minification settings, and chunk splitting strategies
- Lesson 42 — vite.config.js: Build Configuration
- build time
- before your code ever runs in the browser.
- Lesson 1503 — What the React Compiler Actually DoesLesson 1931 — Performance Tradeoffs: Runtime Style InjectionLesson 1933 — What Zero-Runtime MeansLesson 1950 — The Runtime CSS-in-JS Problem
- Build Tool Complexity
- Lesson 36 — Embedding in Existing Non-React Apps
- Building React itself
- React's internal code doesn't always follow its own public rules because it manages the hook registry directly
- Lesson 1040 — Library Authors: When You Actually Need Overrides
- Built-in accessibility
- `disabled` attribute prevents keyboard submission too
- Lesson 1494 — Building Disabled Submit Buttons
- Built-in error logging
- via `onError` prop
- Lesson 1322 — Installing and Basic Setup of react-error-boundary
- Built-in loading/error states
- No manual `useState` for every fetch
- Lesson 596 — Why Libraries Handle This Better
- Built-in reporters
- Beautiful HTML reports showing exactly what happened
- Lesson 2161 — Why Playwright is the Modern E2E Choice
- Bundle size
- The entire CSS-in-JS library ships to every user (~15-30 KB for styled-components, ~8-15 KB for Emotion).
- Lesson 1931 — Performance Tradeoffs: Runtime Style InjectionLesson 1952 — The Shift to Zero-Runtime Solutions
- Bundle size increase
- (React Window is small, but still adds ~10-15KB)
- Lesson 2301 — When Virtualization Isn't Worth It
- Bundle splitting
- Stores can be lazy-loaded with their features
- Lesson 1717 — Multiple Stores and When to Split
- Button clicks
- trigger synchronous, high-priority updates
- Lesson 1456 — User Input Priority: Clicks, Typing, and Immediate Feedback
- by reference
- , not by value.
- Lesson 624 — Object Dependencies Causing LoopsLesson 635 — The Inline Array Antipattern
- by value
- , not by reference.
- Lesson 540 — Primitive Dependencies: Equality by ValueLesson 855 — Primitive Values Don't Need Memoization
C
- Cache Coordination
- Lesson 1365 — Why Manual fetch() + Suspense is Hard
- Cache lookups
- TanStack Query matches keys to find cached data
- Lesson 1771 — Query Keys: The Cache Identifier
- Cache misses
- When dependencies change, React does the calculation *and* the comparison
- Lesson 872 — The Cost of Memoization Itself
- Caching
- Once fetched, data is reused across your app without refetching
- Lesson 596 — Why Libraries Handle This BetterLesson 1768 — TanStack Query: What Problem Does It Solve?
- Caching by Key
- The first fetch runs, and the response gets cached under that key.
- Lesson 606 — TanStack 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 1276 — What Virtualization Is: Render Only Visible Items
- Calculation: 15
- Lesson 92 — Numbers and Strings: Rendered as Text
- Calendars
- Rows are weeks, columns are days—only visible weeks render.
- Lesson 2299 — Virtualized Grids and Multi-Column Layouts
- Call `mockReturnValue()`
- before each render to set what the hook returns
- Lesson 2080 — Mocking Custom Hooks
- Call external APIs
- (third-party widgets, data fetchers)
- Lesson 1311 — Component-Level Boundaries for Risky Code
- Call location
- Are hooks inside conditionals, loops, or after early returns?
- Lesson 1019 — The rules-of-hooks Rule
- call order
- , not by their names.
- Lesson 138 — The Anti-Pattern of Conditional HooksLesson 973 — Top Level: No Conditionals, No LoopsLesson 974 — Early Returns After Hooks Are ForbiddenLesson 975 — Only React Functions Can Call HooksLesson 979 — Dynamic Hook Counts Break EverythingLesson 1009 — Why Conditional Hooks Break EverythingLesson 1016 — The Performance Win of Order-Based TrackingLesson 1026 — Calling Hooks Inside Loops
- Call Order Invariant
- the sequence of hook calls must never change between renders.
- Lesson 1010 — The Call Order Invariant
- Call that function
- directly from the event handler
- Lesson 662 — Refactoring: From Effect to Direct Call
- Callback functions
- in `useCallback` that have no specific identity requirements
- Lesson 1509 — Migration Strategy: Removing Manual Memoization
- Callbacks
- that reference state but don't depend on it reactively
- Lesson 1713 — Reading State Without Subscribing
- Calling context
- Are hooks called from regular JavaScript functions instead of components or custom hooks?
- Lesson 1019 — The rules-of-hooks Rule
- Calls your component function
- (like `function Counter() { .
- Lesson 406 — What Happens During the Render Phase
- Cancel outdated requests
- when new ones start (no ignore flags needed)
- Lesson 587 — Why Modern Libraries Solve This Automatically
- Canceling in-flight requests
- when users navigate away
- Lesson 1746 — Middleware-Heavy Workflows: Sagas, Observables, Complex Async
- cannot
- use:
- Lesson 56 — CDN Script Tags: React Without Build ToolsLesson 752 — Modeling State MachinesLesson 805 — useContext Cannot Read from Sibling ProvidersLesson 1540 — The Serialization BoundaryLesson 1588 — Functions Cannot Be SerializedLesson 1733 — Immer Integration: Mutating Draft StateLesson 1898 — The Specificity Problem
- cascade
- like any CSS property.
- Lesson 1942 — CSS Variables Basics and Browser SupportLesson 2269 — Reading Profiler Flamegraphs
- Cascading Children
- Lesson 2269 — Reading Profiler Flamegraphs
- Cascading patterns
- A parent component with many wide children suggests a rendering cascade where updates flow through multiple layers unnecessarily.
- Lesson 2223 — Reading the Profiler Flamegraph
- Cascading renders
- Did fewer child components render because their parent was memoized?
- Lesson 2278 — Using 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 1402 — Route-Based Bundle Analysis
- Cause
- Check if dependencies are objects created inline or passed down without memoization themselves.
- Lesson 879 — The Object Dependency Problem
- Centralize configuration
- Set defaults once instead of repeating them
- Lesson 993 — Composing Third-Party Hooks
- change detector
- , not a **regression detector**.
- Lesson 2039 — The Cost of Testing ImplementationLesson 2105 — Why Implementation Tests Are Brittle
- Character counters
- or length restrictions displayed in real-time
- Lesson 515 — Recognizing When Controlled is Still Better
- Check the "why"
- Use the "why did this render" setting to confirm object references changed
- Lesson 2247 — Profiling to Confirm the Problem
- Check the flame graph
- Look for components that rendered but didn't need to
- Lesson 2251 — Measuring Context-Induced Re-renders
- Check the React DevTools
- component tree to see which component rendered that node
- Lesson 1661 — Debugging Hydration Errors
- Check third-party imports
- Libraries using hooks need `'use client'` wrappers
- Lesson 1545 — Debugging Boundary Violations
- Check uniqueness
- Ensure every key is different from its siblings.
- Lesson 161 — Debugging Key-Related IssuesLesson 1274 — Debugging Key-Related Issues
- Child component
- Lesson 232 — Basic Callback Pattern
- children
- (third argument)
- Lesson 75 — The React.createElement SignatureLesson 250 — Children vs Explicit PropsLesson 456 — Controlled TextareasLesson 1078 — The Parent + Children RelationshipLesson 1146 — Three Ways to Inject Content: A ComparisonLesson 1538 — Client Components Can Import Server ComponentsLesson 2378 — Typing Provider Component Props
- Children (`ReactNode`)
- Lesson 1151 — Type Safety Across Patterns
- Children prop
- Pass JSX as `children` to a parent component
- Lesson 954 — Component Composition Over memoLesson 1146 — Three Ways to Inject Content: A Comparison
- Choose CSS Transitions when
- Lesson 2015 — Decision Framework: Performance vs Complexity vs DX
- Choose Framer Motion when
- Lesson 2015 — Decision Framework: Performance vs Complexity vs DX
- Choose GSAP when
- Lesson 2008 — When GSAP Beats Framer Motion: Timeline ComplexityLesson 2015 — Decision Framework: Performance vs Complexity vs DX
- Choose Radix when
- Lesson 1191 — When to Choose Radix vs React Aria
- Choose React Aria when
- Lesson 1191 — When to Choose Radix vs React Aria
- Choose React Spring when
- Lesson 2015 — Decision Framework: Performance vs Complexity vs DX
- Choose react-virtualized when
- Lesson 2296 — React Window vs React Virtualized
- Choose react-window when
- Lesson 2296 — React Window vs React Virtualized
- Chrome/Edge
- Visit the Chrome Web Store and search for "React Developer Tools"
- Lesson 2207 — Installing and Opening the React DevTools Profiler
- Chromium, Firefox, and WebKit
- (Safari's engine).
- Lesson 2161 — Why Playwright is the Modern E2E Choice
- Chunk Sizes
- At the top level, you'll see your main chunks — `main.
- Lesson 1413 — Reading a Bundle Analysis ReportLesson 1418 — Analyzing Code-Split Chunk Sizes
- CI integration
- Some teams record profiles in automated performance tests and store them as artifacts
- Lesson 2219 — Exporting and Sharing Profiler Data
- Circular references break it
- Nested objects cause runtime errors
- Lesson 639 — JSON.stringify as a Last Resort
- Clarity
- Each condition handles one specific edge case
- Lesson 186 — Early Returns for Conditional LogicLesson 817 — Local Context for Component SubtreesLesson 1142 — Multiple Named Content PropsLesson 1691 — Context for Feature-Scoped StateLesson 1750 — State Machines vs Ad-Hoc State
- Class component pattern
- Lesson 320 — From this.setState to State Setters
- Class component syntax
- is the clearest sign:
- Lesson 326 — Documentation and Tutorials: Recognizing Outdated Content
- class components
- mixed with modern hooks-based code—or entire codebases written before 2019 when hooks were introduced.
- Lesson 324 — Legacy Codebases: Reading Old React CodeLesson 325 — Third-Party Libraries with Class APIs
- Class instances
- `new Date()`, custom classes
- Lesson 1552 — Prop Serialization Across the BoundaryLesson 1595 — Complex Objects: Maps, Sets, and Classes
- Class lifecycle mental model
- Lesson 315 — The Mental Model Shift
- Class with updater function
- Lesson 320 — From this.setState to State Setters
- Cleaner components
- Less noise from optimization hooks means easier-to-read code
- Lesson 1513 — Long-Term Impact on React Development
- Cleaner diffs
- Adding queries doesn't change the `render()` line
- Lesson 2044 — The screen Object: Your Query Gateway
- Cleaner URLs
- `/dashboard` is simpler than `/dashboard/home`
- Lesson 1836 — Index Routes: Default Child Content
- cleanup function
- is an optional function you can return from a `useEffect`.
- Lesson 550 — What Cleanup Functions AreLesson 592 — The Complete Abort Pattern in One Example
- Cleanup logic
- (aborting requests, preventing state updates after unmount)
- Lesson 605 — The Problem with Manual useEffect Data FetchingLesson 720 — The Ref Callback Pattern
- Clear boundaries
- Configuration stays separate from application logic
- Lesson 61 — The 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 780 — Custom Hooks for Consuming State and Dispatch
- Clear intent
- (developers reading your code understand the structure)
- Lesson 1079 — Named Children vs Generic Children
- Clear naming
- `header` immediately tells you where content goes
- Lesson 1130 — Props as Slots: The Basic Pattern
- Clearer ownership
- You instantly see what belongs to what
- Lesson 209 — Colocating Tests and Styles with Components
- Click a component
- and examine "Why did this render?
- Lesson 2251 — Measuring Context-Induced Re-renders
- Click the record button
- Lesson 2230 — Establishing a Performance Baseline
- Clicking an element
- triggers `mousedown`, `focus` (if focusable), `mouseup`, `click`—and `blur` on the previously focused element
- Lesson 2072 — Testing Focus Behavior with user-event
- client component
- by default.
- Lesson 1536 — Default is Server: The New Mental ModelLesson 1582 — Async Components Cannot Use Hooks
- Client Component (the button)
- The ordering mechanism needs JavaScript because it responds to your clicks.
- Lesson 1559 — Zero JavaScript for Static Content
- Client Components
- Full component code plus the React runtime to execute them.
- Lesson 1534 — What 'No JS' Really Means: The Nuance
- Client first render (hydration)
- Also sees `width === null`, outputs "Loading width.
- Lesson 1658 — The useEffect Solution Pattern
- Client-only applications
- If you're not doing SSR or using Server Components—think admin panels, electron apps, or SPAs —many downsides disappear.
- Lesson 1955 — When Runtime CSS-in-JS Still Makes Sense
- Client-side
- Use error boundaries for runtime errors after hydration
- Lesson 1291 — What Error Boundaries DON'T Catch: Server-Side RenderingLesson 1820 — Prefetching tRPC Queries on the Server
- Client-Side ID Assignment
- Lesson 168 — Better Alternatives: Generating Stable IDs
- Client-side rendering
- is ordering ingredients delivered to your home—you cook the meal yourself.
- Lesson 1630 — What Server-Side Rendering Actually Means
- closure
- over the current state at that exact moment.
- Lesson 395 — Stale State in setTimeout and setIntervalLesson 883 — Stale Closures in Memoized Functions
- Closure creation
- Even when returning a cached value, JavaScript still creates the wrapper function on each render.
- Lesson 905 — The Cost of Memoization Itself
- Co-locate
- state management with its distribution mechanism
- Lesson 779 — The Provider Component PatternLesson 1003 — Co-locating Related State Before Extracting
- Co-locating
- means keeping multiple components in the same file.
- Lesson 202 — Co-locating Helper Components
- Co-location
- means placing your context provider as close as possible to the subtree that actually needs it.
- Lesson 841 — Co-locating Context with Its Consumers
- Coarse boundaries
- (route-level) mean fewer loading states but longer waits.
- Lesson 1340 — Suspense Boundaries: Where to Place Them
- Code clutter
- Your test file now contains potentially hundreds of lines of HTML strings.
- Lesson 2158 — Inline Snapshots vs External Files
- Code complexity
- You're managing loading/error/success states manually
- Lesson 642 — Client-Side Fetching: The Hidden CostLesson 873 — Memoization is Not FreeLesson 948 — When the Pattern Adds More Cost Than ValueLesson 2301 — When Virtualization Isn't Worth It
- Code generation tools
- that produce valid hook code ESLint can't analyze
- Lesson 1035 — ESLint Override Comments: When and How
- Code organization
- Easier to locate and maintain domain logic
- Lesson 1717 — Multiple Stores and When to Split
- Code reuse
- shared layouts without duplication
- Lesson 1831 — What Nested Routes Are and Why They Matter
- Code reviews easier
- everyone knows what they're looking at
- Lesson 204 — Avoiding Anonymous Function Exports
- Code search is reliable
- (searching for "Button" finds all uses)
- Lesson 199 — Named Exports vs Default Exports
- Code split
- Move non-critical code behind `React.
- Lesson 1421 — Bundle Budget Strategy: Setting Thresholds
- Code splitting
- or optimization
- Lesson 56 — CDN Script Tags: React Without Build ToolsLesson 1347 — Suspense's Future: Universal Async BoundariesLesson 1384 — What Code Splitting Is and Why It Matters
- Codegen
- Record interactions and generate test code automatically
- Lesson 2161 — Why 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 1956 — Migration Strategies from Runtime to Zero-Runtime
- cognitive load
- every time you need simple data.
- Lesson 605 — The Problem with Manual useEffect Data FetchingLesson 745 — The Cognitive Load of Many useState CallsLesson 907 — The Readability Tax
- Cognitive overhead
- Readers must understand *why* something is memoized
- Lesson 2283 — The Trap of Memoizing Everything
- Cognitive overload
- Developers spend more time reading docs than building
- Lesson 1165 — The Problem: Too Many Individual Props
- Collaboration improves
- teammates can work on different components without file conflicts
- Lesson 206 — One Component Per File Convention
- colocation
- related files live together.
- Lesson 63 — The Components Folder: Shared vs Feature-SpecificLesson 66 — When to Refactor: Signs Your Structure Needs AdjustmentLesson 209 — Colocating Tests and Styles with ComponentsLesson 319 — From componentWillUnmount to Effect Cleanup
- color intensity
- (yellow to orange) also reflects render duration, with brighter colors indicating more time spent.
- Lesson 2223 — Reading the Profiler FlamegraphLesson 2269 — Reading Profiler Flamegraphs
- Color-coded flame graphs
- gray means fast, yellow/red means slow
- Lesson 70 — Profiler Tab: Recording Performance Sessions
- Combinations
- Show `banner` when both `isLoggedIn` and `hasBanner` are true
- Lesson 1143 — Conditional Rendering of Prop Content
- Combining multiple variables
- `{`Hello ${firstName} ${lastName}!
- Lesson 87 — Template Literals Inside JSX
- Commit
- You compare your sketch to the current room and buy only the paint you need
- Lesson 348 — The Re-render Lifecycle FlowLesson 433 — The Render-Commit-Effect Timeline VisualizedLesson 561 — Why Effects Run After PaintLesson 2211 — Understanding Commit Information
- Commit duration
- Did the overall update become faster?
- Lesson 2282 — Profiling Before and After Memoization
- Commit Phase
- React takes the calculated changes and applies them to the real browser DOM—this is when pixels actually change on screen.
- Lesson 405 — Rendering vs Committing: The Two-Phase ProcessLesson 406 — What Happens During the Render PhaseLesson 412 — The Commit Phase: Applying Changes to the DOMLesson 429 — Commit Phase: Applying Changes to the DOMLesson 430 — Effects Phase: Running Side Effects After PaintLesson 434 — Why State Updates Don't Appear ImmediatelyLesson 438 — The Render Cycle TimelineLesson 529 — When useEffect Runs: After Commit (+1 more)
- Commit Timing at Top
- Lesson 2269 — Reading Profiler Flamegraphs
- Committing
- Only if something changed does the director actually use the new footage
- Lesson 411 — Render Does Not Mean DOM Update
- Common auth context values
- Lesson 812 — Current User and Auth State in Context
- Common data flows down
- Parent route fetches user data, children display different aspects
- Lesson 1842 — When to Nest vs Flatten Routes
- Common providers
- (theme, data context) for specific sections
- Lesson 1838 — Pathless Routes for Shared Layouts
- Common transformations
- on values before returning them
- Lesson 992 — Extracting Shared Logic from Multiple Custom Hooks
- Common vocabulary
- across the team ("dispatch an action" means the same thing to everyone)
- Lesson 1705 — Team Collaboration and Predictable Patterns
- Common winning scenarios
- Lesson 1436 — When useTransition Actually Helps
- Compare
- every dependency in the array (using `Object.
- Lesson 889 — The Cost-Benefit Analysis of useMemo
- Compare the dependency array
- On every render, React checks if dependencies changed
- Lesson 872 — The Cost of Memoization Itself
- Compares this new tree
- to the previous one to figure out what changed
- Lesson 406 — What Happens During the Render Phase
- Comparing
- The director checks if this take differs from the last one
- Lesson 411 — Render Does Not Mean DOM Update
- Comparison overhead
- React compares every item in your dependency array using `Object.
- Lesson 905 — The Cost of Memoization ItselfLesson 2283 — The Trap of Memoizing Everything
- Comparison work
- On every render, React compares the new dependencies to the old ones
- Lesson 873 — Memoization is Not Free
- Compile-time safety
- TypeScript knows the exact shape of your context
- Lesson 1094 — Type-Safe Context for Compound Components
- complete control
- over JSX layout while Formik handles state management behind the scenes.
- Lesson 1231 — The <Formik> Component and Render PropsLesson 2393 — Typing Props Without React.FC
- Complete state tree visualization
- see your entire application state in a structured, explorable tree
- Lesson 1703 — Developer Experience: DevTools and Time Travel
- Complex
- Heavy logic or third-party integrations that might fail
- Lesson 1310 — Feature-Level Boundaries
- Complex algorithms
- Lesson 885 — Identifying Expensive Computations in Render
- Complex animations
- expose progress, phase, or interpolated values
- Lesson 1063 — Render Props for Complex InteractionsLesson 2019 — will-change CSS Property
- Complex Boolean Expressions
- When your condition itself requires multiple checks:
- Lesson 125 — When Simple Conditionals Break Down
- Complex child hierarchies
- Deep nesting means more measurements
- Lesson 1987 — Layout Animation Performance
- Complex conditions
- where nested ternaries become unreadable
- Lesson 129 — Immediately Invoked Function Expressions (IIFEs) in JSX
- Complex data visualization
- Updating a chart with thousands of data points while the user adjusts slider controls.
- Lesson 1461 — Priority in Practice: When You Feel the Difference
- Complex data-fetching hooks
- with intricate retry logic, authentication, or caching
- Lesson 2133 — Mocking Custom Hooks: When It's Justified
- Complex dependencies
- that are slow or unpredictable
- Lesson 2075 — Why Module Mocking is Necessary in Tests
- Complex middleware needs
- Logging, persistence, time-travel debugging
- Lesson 816 — Context vs State Management Libraries
- Complex object shapes
- You want to enforce a specific structure
- Lesson 2381 — Typing useState: Explicit Type Arguments
- Complex relational data
- that benefits from Apollo's normalized cache (updating one entity updates it everywhere)
- Lesson 1830 — When Apollo Fits vs TanStack Query
- Complex rules
- Cross-field validation becomes trivial in Zod
- Lesson 1225 — Schema Validation with Zod Resolver
- Complex search params
- Built-in validation and parsing beats manual `useSearchParams` parsing
- Lesson 1885 — When TanStack Router Fits vs React Router
- Complex State Logic Everywhere
- Lesson 1699 — Signs Your State is Outgrowing Local + Context
- Complex UI
- where multiple similar elements exist but differ only by position or context
- Lesson 2064 — getByTestId: The Escape Hatch
- Complex UI updates
- Each keystroke animates visualizations, filters large lists, or triggers layout recalculations.
- Lesson 1197 — Performance Implications: Re-renders on Every Keystroke
- Complexity
- How much code and configuration does it require?
- Lesson 2015 — Decision Framework: Performance vs Complexity vs DXLesson 2217 — Using the Interactions Tab (Legacy)
- Compliance Auditing
- For financial, healthcare, or legal applications, you may need to prove *exactly* what happened and when.
- Lesson 1744 — Time-Travel Debugging and Audit Requirements
- Component begins rendering
- and realizes it needs data that isn't available yet
- Lesson 1339 — How Suspense Detects 'Not Ready'
- component composition
- , and it's the fundamental pattern for building React applications.
- Lesson 182 — Components Can Call Other ComponentsLesson 248 — What is the Children Prop?Lesson 825 — Context as the Escape Hatch for Deep TreesLesson 826 — Comparing Solutions: Props vs Composition vs Context
- Component Details
- panel displays render count for each component
- Lesson 2270 — Measuring Render Count vs Render Time
- Component name
- The actual function or class name from your code
- Lesson 68 — Components Tab: Inspecting the Component TreeLesson 213 — Basic Prop Syntax: Passing ValuesLesson 2234 — Reading the Console Output
- Component re-renders
- React executes your component function again with the new state value
- Lesson 467 — The setState → Re-render → DOM Update FlowLesson 1737 — Dispatching Actions with useDispatch
- Component state
- Show `errorMessage` prop only when `hasError` is true
- Lesson 1143 — Conditional Rendering of Prop Content
- Component testing
- Test React components in isolation (bridging unit and E2E testing)
- Lesson 2161 — Why Playwright is the Modern E2E Choice
- Component tries again
- if ready, renders normally; if not, throws again
- Lesson 1339 — How Suspense Detects 'Not Ready'
- component-based architecture
- , **unidirectional data flow**, and **declarative UI**?
- Lesson 14 — Learn Once, Write AnywhereLesson 15 — Composition Over InheritanceLesson 18 — Progressive Adoption and Escape Hatches
- Component-level
- is for truly independent widgets that don't distract when loading separately.
- Lesson 1383 — Suspense Boundary Placement Patterns
- Component-level boundaries
- caught a widget failure.
- Lesson 1316 — Contextual Error Messages by LocationLesson 1340 — Suspense Boundaries: Where to Place Them
- Component-level boundary
- Wraps a comment widget → shows "Comments unavailable" inline
- Lesson 1321 — Nested Boundary Fallback Strategies
- Component-specific state orchestration
- that doesn't repeat elsewhere should stay put.
- Lesson 1000 — When Single-Component Logic Should Stay Inline
- Components should be reusable
- props make components portable and testable
- Lesson 808 — Context vs Props: Choosing the Right Tool
- Components using useContext re-render
- when the Provider's value changes
- Lesson 799 — useContext Hook Syntax
- compose
- components by nesting and combining them like building blocks.
- Lesson 15 — Composition Over InheritanceLesson 188 — What is Component Composition?Lesson 190 — Nesting Components: The Basic Pattern
- Compose complex layouts
- from simple, reusable pieces
- Lesson 194 — Layout Components: Composing Structure
- Composite
- The browser layers painted elements and sends them to the GPU.
- Lesson 2016 — The Browser's Rendering PipelineLesson 2017 — Compositor-Only Properties: transform and opacity
- composite key
- combines the parent's identifier with the child's identifier to guarantee uniqueness across the entire nested structure.
- Lesson 1249 — Composite Keys for Nested ListsLesson 1261 — Composite Keys for Nested Lists
- Composite Keys from Data
- Lesson 168 — Better Alternatives: Generating Stable IDs
- composition
- , where you build complex components by combining simpler ones, rather than creating parent- child class hierarchies.
- Lesson 189 — Composition Over Inheritance in ReactLesson 193 — Wrapper Components for Shared BehaviorLesson 274 — Preview of Solutions: CompositionLesson 1915 — Composing Utilities for Complex StylesLesson 2316 — Composition to Avoid Prop Drilling
- Compositor activity
- Green blocks show GPU work on `transform`/`opacity`—these are good!
- Lesson 2021 — Measuring Frame Rate with DevTools
- compositor-only properties
- .
- Lesson 1960 — Common Transition Properties: opacity, transformLesson 2019 — will-change CSS Property
- compound components
- solve the same fundamental problem: allowing flexible composition of multiple content areas.
- Lesson 1128 — Slots vs Compound Components: Design TradeoffsLesson 1153 — What is Inversion of Control in React?
- Compute during render instead
- React is designed to handle this:
- Lesson 693 — When Computation Happens: Render vs Effect Timing
- Concrete costs
- Lesson 447 — The Performance Cost of flushSync
- Concurrent Features
- React 18's architecture changes made the interaction-tracking model obsolete
- Lesson 2217 — Using the Interactions Tab (Legacy)
- Conditional context reading
- You only need context in certain branches
- Lesson 1476 — use() with Context: An Alternative to useContext
- Conditional Features
- Lesson 2289 — Component-Level Splitting Decisions
- Conditional logic
- Only render `<Navigate>` after you're certain auth has resolved
- Lesson 1874 — Common Pitfalls: Redirect Loops and FlashLesson 2293 — Dynamic Imports Without Suspense
- Conditional rendering
- Don't render the element at all using `&&`, ternaries, or early returns
- Lesson 139 — Style-Based Hiding vs Conditional RenderingLesson 363 — Unmounting 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 2184 — Unit Tests for Component Logic
- Conditional routing
- Based on user permissions or data, route to different destinations
- Lesson 1856 — Programmatic Navigation with useNavigate
- Conditional UI changes
- based on input values (show/hide fields, enable/disable buttons)
- Lesson 515 — Recognizing When Controlled is Still Better
- Conditional UI feedback
- Lesson 1486 — The Pending State
- Conditionally rendered
- A rich text editor loaded only when the user clicks "Edit.
- Lesson 1424 — Component-Level Splitting: When It Helps
- Conditionals might skip hooks
- breaking the call order invariant
- Lesson 1014 — Top-Level Only: Function Scope Requirements
- Confidence
- Passing tests mean users can accomplish their goals
- Lesson 2103 — The Core Principle: Test User-Facing BehaviorLesson 2135 — The Integration Test Sweet Spot
- Configure a `codegen.yml` file
- Point it at your schema and operation files
- Lesson 1829 — Apollo Client with TypeScript
- Confusion about defaults
- When users ask "what's the recommended way?
- Lesson 1163 — When Inversion Becomes Over-Engineering
- Cons
- Related functionality is scattered across folders
- Lesson 60 — Feature-Based vs Layer-Based OrganizationLesson 1207 — The Single State Object PatternLesson 1213 — Multi-Step Forms with Shared State
- Consider native browser APIs
- Modern browsers support many features (like date formatting with `Intl`) that previously required libraries
- Lesson 1417 — Finding Unexpectedly Large Dependencies
- Consistency
- All state updates appear together in the next render, preventing intermediate "half-updated" UI states that users might briefly see.
- Lesson 417 — What is Batching and Why It MattersLesson 1476 — use() with Context: An Alternative to useContextLesson 1508 — Compiler vs Manual: Performance ComparisonLesson 2044 — The screen Object: Your Query GatewayLesson 2199 — Page Objects in CI: Keeping Tests DRY
- Consistent checks
- Use the same auth source everywhere (don't mix server state with stale client state)
- Lesson 1874 — Common 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 161 — Debugging Key-Related IssuesLesson 1274 — Debugging Key-Related Issues
- Consumer
- is how components originally accessed that value (before hooks).
- Lesson 789 — The Context Object Structure
- Consumes the context
- using your custom hook (the one that enforces context usage)
- Lesson 1112 — Creating Named Child Components
- Contain complex business logic
- (calculations, data transformations, state machines)
- Lesson 2102 — When to Test Hooks vs Components
- container
- is like the chef who handles all the recipe logic, ingredient prep, and cooking decisions.
- Lesson 191 — Container and Presentational ComponentsLesson 1376 — What Suspense Boundaries ContainLesson 2043 — The render Function from RTL
- Content existence
- Display `footer` only if it was actually passed
- Lesson 1143 — Conditional Rendering of Prop Content
- Content flashing
- occurs when protected content briefly appears before the auth check completes and redirects the user away.
- Lesson 1874 — Common Pitfalls: Redirect Loops and Flash
- Content needs parent callbacks
- Injected UI needs to trigger parent actions
- Lesson 1149 — When Render Props Win: Dynamic Behavior
- Context
- teleports both `state` and `dispatch` to any component that needs them—no drilling
- Lesson 777 — The Global State Problem That useReducer + Context SolvesLesson 826 — Comparing Solutions: Props vs Composition vs ContextLesson 1081 — Implicit Communication Without PropsLesson 1084 — Flexible Component OrderLesson 1103 — Headless UI's Render Prop AlternativeLesson 1183 — What 'Headless' Means: Logic Without StylingLesson 1693 — Context + useReducer for Complex Local StateLesson 1754 — Context: Extended State in Machines (+2 more)
- Context + useReducer
- (which you've already learned) provides 80% of what Redux offers without external dependencies.
- Lesson 816 — Context vs State Management Libraries
- Context helps
- but struggles at scale—updating context re-renders all consumers, even if they only need part of the state.
- Lesson 1700 — The Problem of Shared State Across Distant Components
- Context provider
- wrapping `children` to share state downward
- Lesson 1109 — Creating the Parent Component Shell
- Context Re-render Cascades
- Lesson 1699 — Signs Your State is Outgrowing Local + Context
- Context-aware animations
- Scopes animations to components properly
- Lesson 2001 — Installing 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 1718 — Zustand vs Context vs Redux: The Tradeoffs
- Contextual state
- parent routes can provide context to all children
- Lesson 1831 — What Nested Routes Are and Why They Matter
- Control the entire sequence
- as one unit (pause, reverse, seek to 50%)
- Lesson 2012 — GSAP for Complex Timeline Animations
- controlled
- React owns the value and requires `onChange` to update it.
- Lesson 501 — Using defaultValue for Text InputsLesson 1157 — The Controlled vs Uncontrolled Pattern Generalized
- Controlled (parent owns state)
- Lesson 689 — Controlled vs Uncontrolled: Let Parent Own State
- Controlled approach
- 5 full form re-renders × 20 fields = 100+ component renders
- Lesson 1227 — Performance Comparison: RHF vs Controlled
- controlled component
- .
- Lesson 340 — String State for Text InputLesson 450 — What Makes a Component 'Controlled'Lesson 451 — The value Prop on InputsLesson 500 — defaultValue vs value: The Key DifferenceLesson 689 — Controlled vs Uncontrolled: Let Parent Own StateLesson 1229 — Formik's Core API: useFormik Hook
- controlled components
- , React state is the single source of truth—every keystroke updates state, which updates the input.
- Lesson 490 — What Are Uncontrolled Components?Lesson 515 — Recognizing When Controlled is Still BetterLesson 1157 — The Controlled vs Uncontrolled Pattern Generalized
- Controlled components everywhere
- Write class components with tons of `this.
- Lesson 1228 — Why 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 1156 — Exposing Internal State via Controlled Props
- Convention as communication
- It signals "this is an action type constant" to other developers.
- Lesson 767 — Naming 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 1956 — Migration Strategies from Runtime to Zero-Runtime
- Core business transactions
- Checkout, payment, order confirmation
- Lesson 2191 — Balance: Enough E2E Coverage Without Fragility
- Core functionality
- The main feature your app is built around (e.
- Lesson 2183 — E2E Tests Cover Critical User Journeys
- Core Web Vitals
- are three standardized metrics that capture the moments users care about most:
- Lesson 2258 — Core Web Vitals: LCP, FID, CLS
- correct
- .
- Lesson 874 — The Mental Model: Cache InvalidationLesson 881 — When Empty Dependencies Are Valid
- Counters
- Click counts, step numbers in a wizard
- Lesson 1685 — Temporary State: Counters, Timers, Animations
- Coupling
- Middle components become tightly coupled to the needs of distant children
- Lesson 266 — What is Prop Drilling?
- CPU usage
- (no hydration work for static content)
- Lesson 1650 — Islands 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 54 — Webpack 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 1956 — Migration Strategies from Runtime to Zero-Runtime
- Create domain language
- `useCurrentUser()` is clearer than raw query logic
- Lesson 993 — Composing Third-Party Hooks
- Create React App
- was React's official starter toolkit.
- Lesson 49 — Create React App: The Legacy Standard
- Create separate contexts
- One for fast-changing data, another for slow-changing data
- Lesson 2253 — Splitting Context by Update Frequency
- Creating alternating styles
- Lesson 144 — Using Array Index as a Second Parameter
- Creating base styles
- for elements you don't control (like markdown content)
- Lesson 1919 — The @apply Directive: When and Why
- Creating dev tools
- Testing utilities that inspect or mock hook behavior need to break rules in controlled environments
- Lesson 1040 — Library Authors: When You Actually Need Overrides
- Critical
- Generate the ID when you *create* the data item, not every time you render.
- Lesson 168 — Better Alternatives: Generating Stable IDs
- Critical for first render
- anything blocking initial content
- Lesson 1358 — Lazy 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 1316 — Contextual Error Messages by Location
- Critical rules
- Lesson 1660 — suppressHydrationWarning Prop
- critical user journeys
- the complete workflows that represent your application's core value.
- Lesson 2183 — E2E Tests Cover Critical User JourneysLesson 2191 — Balance: Enough E2E Coverage Without Fragility
- Critical vs Non-Critical
- Don't wrap critical UI (navigation, layout) in the same boundary as experimental features.
- Lesson 1307 — Error Boundary Placement Strategy
- Cross-Feature State Dependencies
- Lesson 1699 — Signs Your State is Outgrowing Local + Context
- Cross-Site Scripting (XSS)
- attacks, where malicious scripts steal data or hijack user sessions.
- Lesson 100 — dangerouslySetInnerHTML: XSS Protection by Design
- CSR
- You cook from scratch (slower start, but then you control every ingredient instantly)
- Lesson 1673 — CSR Trade-offs: Interactivity vs Initial LoadLesson 1679 — Decision Matrix: Choosing the Right Rendering Strategy
- CSS layouts
- where extra wrappers break your grid or flexbox
- Lesson 107 — When Fragments Need the key Prop
- CSS Modules
- are regular CSS files with a twist: the build tool (Webpack, Vite, etc.
- Lesson 1900 — What CSS Modules AreLesson 1907 — CSS Modules vs Plain CSSLesson 1932 — Migration Path: When to Consider AlternativesLesson 1958 — Adding transition Property to React Components
- CSS Transitions
- Great for simple hover states, but no physics, hard to interrupt
- Lesson 2011 — React Spring for Natural, Physics-Based MotionLesson 2014 — Combining Approaches: CSS for Performance, JS for Logic
- 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 1897 — What You Can't Do with Inline StylesLesson 1946 — CSS Variables vs CSS-in-JS for Theming
- CSS variables win at
- Lesson 1946 — CSS 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 1921 — Tailwind vs CSS-in-JS TradeoffsLesson 1946 — CSS Variables vs CSS-in-JS for Theming
- CSS-in-JS wins at
- Lesson 1946 — CSS Variables vs CSS-in-JS for Theming
- CSS-sensitive designs
- Layouts that break with empty elements
- Lesson 1133 — Optional Slots with Conditional Rendering
- Cumulative Layout Shift (CLS)
- Content pops in after the skeleton, causing the page to jump around.
- Lesson 647 — The SEO and Performance ImpactLesson 2258 — Core Web Vitals: LCP, FID, CLS
- current state
- at the moment it runs.
- Lesson 678 — When Events Need State: Reading Current StateLesson 744 — State Transitions That Depend on Previous State
- Current user profile
- User data often appears in headers, sidebars, and main content simultaneously
- Lesson 810 — Context for Truly Global State
- Custom conditions
- Lesson 2167 — Assertions with expect()
- Custom fetching
- requires you to build a Suspense-compatible wrapper yourself
- Lesson 1346 — The Suspense-Ready Ecosystem
- custom hook
- is just a JavaScript function with two distinguishing characteristics:
- Lesson 958 — What Makes a Custom HookLesson 960 — Your First Custom Hook: useToggle
- custom hooks
- plain JavaScript functions that use built-in hooks internally.
- Lesson 313 — Hooks Enable Logic ExtractionLesson 970 — Custom Hooks vs Utility FunctionsLesson 2190 — Unit Tests for Pure Functions and Hooks
- Customization Without Limits
- Lesson 1106 — Why These Libraries Choose Compound Patterns
- Customization without permission
- You don't need the library author to add a `customTrigger` prop—just put whatever you want inside `Menu.
- Lesson 1086 — Advantages Over Monolithic Components
D
- Dashboard updates
- Refreshing analytics widgets while the user navigates tabs.
- Lesson 1461 — Priority in Practice: When You Feel the Difference
- data
- changes.
- Lesson 166 — Performance Implications of Bad KeysLesson 1271 — Index-as-Key Reordering BugLesson 2280 — Measuring Expensive Computations
- Data attributes
- (`data-*`) are a web standard for storing custom information on HTML elements.
- Lesson 99 — data-* and aria-* Attributes: The kebab-case ExceptionsLesson 1187 — Data Attributes for Styling State
- Data dependencies
- Reset when critical data IDs change, like viewing a different product or document.
- Lesson 1327 — resetKeys for Automatic Recovery
- Data fetching
- API calls that populate your component
- Lesson 297 — componentDidMount: Side Effects After First RenderLesson 1347 — Suspense's Future: Universal Async BoundariesLesson 1886 — Next.js App Router vs React Router Philosophy
- Data fetching hooks
- `useFetch` vs `useData` vs `useQuery`—standardize
- Lesson 987 — Consistency Across Your Codebase
- Data tables
- Each cell displays a specific field from row data indexed by `rowIndex` and `columnIndex`.
- Lesson 2299 — Virtualized Grids and Multi-Column Layouts
- Date stamps matter
- Posts from 2018 or earlier are almost certainly pre-hooks.
- Lesson 326 — Documentation and Tutorials: Recognizing Outdated Content
- Dead code elimination
- Tools can't easily determine which lifecycle methods you actually need
- Lesson 311 — Classes Confuse Both People and Machines
- Debounced state
- updates only after the user stops typing for X milliseconds
- Lesson 477 — Mitigating Cost: Debouncing State Updates
- Debouncing
- means waiting until the user *stops typing* for a brief moment (say, 300ms) before actually updating state.
- Lesson 477 — Mitigating Cost: Debouncing State UpdatesLesson 1437 — useTransition vs debouncingLesson 1451 — The Debounce AlternativeLesson 2305 — Deferring vs Debouncing: When Each Fits
- Debouncing/throttling
- user input before firing API calls
- Lesson 1746 — Middleware-Heavy Workflows: Sagas, Observables, Complex Async
- Debug info
- Stack traces, component names, etc.
- Lesson 769 — Meta Fields: Adding Timestamps, IDs, or Metadata
- Debugging
- Easier to console.
- Lesson 124 — Extracting Ternaries to Variables for ClarityLesson 230 — Props Read-Only Rule and Pure ComponentsLesson 769 — Meta Fields: Adding Timestamps, IDs, or MetadataLesson 1507 — The 'use memo' Directive (Opt-Out)
- Debugging becomes easier
- If the UI looks wrong, check the state.
- Lesson 17 — UI 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 1312 — Avoiding Boundary Overuse
- Debugging is Painful
- Lesson 1699 — Signs Your State is Outgrowing Local + Context
- Debugging Nightmare
- Lesson 263 — The Indiscriminate Spread Antipattern
- Debugging Nightmares
- Lesson 1041 — The Cost of Disabling: Maintenance and Debugging
- Decide
- whether to return the cached value or recompute
- Lesson 889 — The Cost-Benefit Analysis of useMemo
- declarative
- "This component represents *this specific item*.
- Lesson 686 — When Key Prop Solves the Problem BetterLesson 1119 — What Slots Are: Named Placeholders for ContentLesson 1187 — Data Attributes for Styling StateLesson 1478 — Error Handling: use() with Error BoundariesLesson 1868 — Using Navigate for Redirects
- Declarative (What)
- You sit at a table and say: "I'd like an omelet.
- Lesson 9 — Declarative UI: What vs How
- Declarative orchestration
- Parent component state triggers coordinated child animations through variants
- Lesson 2010 — Framer 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 12 — The Virtual DOM ConceptLesson 13 — Reconciliation: React's Diffing AlgorithmLesson 14 — Learn Once, Write AnywhereLesson 18 — Progressive Adoption and Escape Hatches
- Declare
- a state variable that persists between renders
- Lesson 329 — What 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 587 — Why Modern Libraries Solve This Automatically
- Deduplicate requests
- (two components requesting the same user?
- Lesson 1738 — RTK Query: Declarative Data Fetching
- Deduplicates
- scripts with matching `src` attributes across your entire component tree
- Lesson 1519 — Async Scripts with Direct Support
- Deduplication
- Lesson 1365 — Why Manual fetch() + Suspense is HardLesson 1768 — TanStack Query: What Problem Does It Solve?
- Deep nesting (6+ levels)
- Children or slots preferred; render props become unwieldy
- Lesson 1150 — Composability Comparison: Nesting and Flexibility
- Deep stacks
- heavily nested components that might benefit from restructuring
- Lesson 71 — Reading Profiler Flamegraphs
- Deep vertical stacks
- where many components render in sequence
- Lesson 2216 — Identifying Cascading Renders in the Flame Graph
- Deeply nested descendants
- that call `useContext` (even 10+ levels down)
- Lesson 828 — The Scope of Consumer Re-renders
- Default behavior
- `cacheTime` defaults to **5 minutes** (300,000 milliseconds).
- Lesson 1783 — The cacheTime Configuration
- Default Export
- (one per file):
- Lesson 199 — Named Exports vs Default ExportsLesson 1349 — Basic React.lazy() SyntaxLesson 1389 — Named Exports Don't Work with React.lazy
- Default export mock
- Lesson 2077 — Mocking Default vs Named Exports
- Default exports
- offer flexibility—you can rename on import.
- Lesson 199 — Named Exports vs Default Exports
- Default imports break tree-shaking
- When you write:
- Lesson 1419 — Tree-Shaking Failures and How to Fix Them
- default value
- .
- Lesson 788 — Creating a Context with createContextLesson 793 — Default Values vs Provider Values
- Default values
- Destructuring lets you set defaults inline: `{ name = 'Guest' }`.
- Lesson 244 — Destructuring vs Direct Access Tradeoffs
- Defer validation
- to submit time or use blur events
- Lesson 1203 — Migration Strategy: Converting Between Approaches
- Deferred script tags
- JavaScript that will "wake up" the page on the client
- Lesson 1639 — Server-Side HTML Structure and Scripts
- Deferred update renders next
- React schedules a lower-priority render with the updated deferred value
- Lesson 1445 — When Deferred Values Update
- Deferred value
- The query used for filtering (updates when React has time)
- Lesson 1448 — Deferring Expensive List Filters
- Degraded UI
- Keep working parts visible, show minimal fallback for the broken piece
- Lesson 1319 — Degraded UI vs Full Failure
- Delegate
- Call your default reducer and return its result
- Lesson 1179 — Combining Consumer and Default Reducers
- Delete the effect
- and any state variables that were only triggering it
- Lesson 662 — Refactoring: From Effect to Direct Call
- Deliberately throwing errors
- from a child component during render
- Lesson 2136 — Why Error Boundaries Need Special Testing
- Dependencies of dependencies
- (transitive deps) you didn't even know you installed
- Lesson 1417 — Finding Unexpectedly Large Dependencies
- dependency array
- is the optional second argument to `useEffect`:
- Lesson 536 — What is the Dependency Array?Lesson 697 — The Dependency Array for Computation
- Dependency comparison
- React runs a shallow equality check on your array every render
- Lesson 872 — The Cost of Memoization ItselfLesson 2279 — The Cost of useMemo Itself
- Dependency Injection
- Lesson 24 — Angular (2+): TypeScript-First Architecture
- Dependency suggestions
- when your effect references variables not in the array
- Lesson 1017 — What eslint-plugin-react-hooks Does
- Dependency tracking
- (avoiding stale closures)
- Lesson 605 — The Problem with Manual useEffect Data FetchingLesson 1502 — The Manual Memoization Problem
- Depth harms clarity
- `/app/workspace/project/settings/billing/history` is exhausting
- Lesson 1842 — When to Nest vs Flatten Routes
- derived
- state
- Lesson 650 — The Symptom: Stale Derived ValuesLesson 663 — What is Derived State?Lesson 684 — Derived State: Compute During Render Instead
- derived data
- compute it directly during render:
- Lesson 667 — Example: Filtering a ListLesson 668 — Example: Calculating Totals and Aggregates
- Derived state
- Other components react instantly to input changes
- Lesson 462 — Why Controlled Components Re-render on Every ChangeLesson 535 — Why Effects are Often OverusedLesson 651 — Example: Filtering Props in an EffectLesson 663 — What is Derived State?Lesson 1452 — Common Pitfalls: Deferring Primitives
- Deriving state
- Compute during render, not in an effect
- Lesson 683 — The Props-Change-Triggers-Effect Antipattern
- Destroy the old component
- Run cleanup, discard internal state, remove DOM nodes
- Lesson 172 — Performance Cost of Unstable Keys
- Destructure or extract
- the specific properties outside the hook
- Lesson 880 — Extracting Primitive Values from Objects
- Destructuring
- Multiple properties, cleaner JSX, less repetition.
- Lesson 143 — Accessing Item Data in .map()
- Destructuring defaults
- apply when a prop is `undefined` (not passed at all).
- Lesson 245 — Default Values vs Nullish Coalescing
- Destructuring in the Parameter
- Lesson 143 — Accessing Item Data in .map()
- Detect reduced motion preference
- Lesson 2023 — Trade-offs: Fidelity vs Performance
- Developer errors
- with duplicate names would be harder to detect than call order violations
- Lesson 1012 — Why Hooks Can't Use Names or IDs
- Developer Experience (DX)
- How intuitive is it to write and modify?
- Lesson 2015 — Decision Framework: Performance vs Complexity vs DX
- Developer friction
- every new piece of shared state requires architectural decisions
- Lesson 2328 — When to Move to External State
- development
- , you'll see **two console logs per render**.
- Lesson 414 — Console Logs and Render CountingLesson 2207 — Installing and Opening the React DevTools Profiler
- Device-based scaling
- On lower-end devices, reduce animation complexity—fewer particles, simpler easing, shorter durations.
- Lesson 2023 — Trade-offs: Fidelity vs Performance
- DevTools
- Use React DevTools Profiler to see if components re-render unexpectedly when you thought they were optimized.
- Lesson 879 — The Object Dependency Problem
- DevTools for debugging
- cache state and query lifecycles
- Lesson 1482 — When 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 1743 — Large-Scale Apps with Many Interconnected Features
- Did render time decrease
- Look at the "Render duration" for your component
- Lesson 893 — Measuring the Impact of useMemo
- Different mental model
- You're no longer imperatively controlling flow.
- Lesson 1343 — Suspense vs Traditional Loading States
- Different Mental Models Collide
- Lesson 36 — Embedding in Existing Non-React Apps
- Direct children
- that call `useContext`
- Lesson 828 — The Scope of Consumer Re-rendersLesson 1979 — AnimatePresence for Enter/Exit AnimationsLesson 2013 — AnimatePresence for Enter/Exit Transitions
- Direct data access
- fetch from databases, read files, call APIs without extra layers
- Lesson 1621 — The Default: Start with Server Components
- Direct update
- "Set count to 5" *(what if count changed since you decided on 5?
- Lesson 442 — Using Functional Updates to Avoid Staleness
- Disable certain toggle states
- based on business rules
- Lesson 1181 — Common Use Cases: Preventing Transitions
- Disable the trigger
- temporarily (button becomes disabled, hover becomes non-interactive)
- Lesson 1411 — Handling Loading States in Interaction-Based Splits
- Discoverability
- When importing from your context module, you see `addTodo`, `toggleTodo`, `deleteTodo`—the available operations are immediately clear.
- Lesson 782 — Action Creators for Better Developer ExperienceLesson 1142 — Multiple 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 762 — TypeScript: Discriminated Unions for ActionsLesson 2335 — Union Types for Variant PropsLesson 2385 — Typing useReducer: State and Action Types
- DispatchContext
- is the ordering counter—it never moves.
- Lesson 778 — Creating the Context Pair: State and DispatchLesson 2324 — Separating State and Dispatch Contexts
- Displaying position numbers
- Lesson 144 — Using Array Index as a Second Parameter
- Disproportionately large rectangles
- representing single libraries
- Lesson 1417 — Finding Unexpectedly Large Dependencies
- do
- render, including zero:
- Lesson 91 — null, undefined, true, false: Rendered as NothingLesson 2107 — The 'Does the User Care?' Litmus Test
- Do they update together
- (If A *always* changes with B, they're one domain)
- Lesson 839 — Identifying Independent State Domains
- Document it
- Whatever you choose, write it down in your style guide
- Lesson 2396 — Team Conventions: Picking a Style
- Document the approach
- – Team wiki or README explaining "when to use what"
- Lesson 327 — When Teams Haven't Migrated Yet
- Document what you see
- Lesson 2230 — Establishing a Performance Baseline
- Documentation
- Docs update with releases, not constantly
- Lesson 1677 — SSG Trade-offs: Speed vs FreshnessLesson 2095 — Why Testing Hooks in Isolation Matters
- Documentation overload
- When your component needs extensive examples for simple use cases, the API is fighting against common usage.
- Lesson 1163 — When Inversion Becomes Over-Engineering
- doesn't
- depend on the old value, direct updates are fine:
- Lesson 370 — Functional Update SyntaxLesson 1344 — What Suspense Doesn't HandleLesson 2267 — The Cost of React.memo Itself
- DOM bloat
- extra elements that serve no purpose except satisfying React's single-parent requirement.
- Lesson 108 — Fragments vs Wrapper Divs: Performance and Semantics
- DOM itself
- holds the current value, not your React state.
- Lesson 1196 — Uncontrolled Forms: Letting the DOM Manage State
- DOM manipulation
- Integrating with third-party libraries that need real DOM nodes
- Lesson 297 — componentDidMount: Side Effects After First Render
- DOM references
- Input focus, scroll position, animations stay intact
- Lesson 151 — Keys Preserve Component Identity
- DOM Refs
- When you attach a ref to a JSX element to access the DOM node
- Lesson 2383 — Typing 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 467 — The setState → Re-render → DOM Update Flow
- DOM updates happen
- Lesson 307 — The Lifecycle Diagram: Mental Model
- Domain knowledge
- You know a complex calculation is stable based on business logic the compiler can't understand
- Lesson 1508 — Compiler vs Manual: Performance Comparison
- Don't
- add the ref to dependencies (refs never trigger re-runs)
- Lesson 632 — Using useRef to Break the LoopLesson 728 — Forwarding Refs to Nested ComponentsLesson 731 — When NOT to Forward RefsLesson 1838 — Pathless Routes for Shared Layouts
- Don't bother extracting if
- Lesson 1899 — Extracting Style Objects
- Don't do that
- it violates the rules of hooks.
- Lesson 977 — Conditional Logic Around Hook Results, Not Calls
- Don't export the context
- keep it module-private
- Lesson 1090 — Creating a Private Context for Compound Components
- Don't forward refs when
- Lesson 731 — When NOT to Forward Refs
- Don't mock internal code
- Lesson 2131 — The React Testing Library Philosophy on Mocking
- Don't optimize prematurely
- Most calculations are fast enough.
- Lesson 654 — When Computation is Expensive: useMemoLesson 834 — When Context Re-renders Don't Matter
- Dot Notation
- Lesson 143 — Accessing Item Data in .map()
- Double rendering
- Effect runs *after* render, causing a second render cycle
- Lesson 683 — The Props-Change-Triggers-Effect AntipatternLesson 694 — The Effect Antipattern: Computing Derived Values
- Doubled event listeners
- firing twice per interaction
- Lesson 601 — Why React Does This: Finding Missing Cleanup
- Download
- all the pieces (the JavaScript bundle)
- Lesson 1556 — The Traditional SPA Performance ProblemLesson 1647 — The Cost of Hydration: CPU and Time to Interactive
- Download time
- Waiting for hundreds of kilobytes to megabytes of JavaScript
- Lesson 1556 — The Traditional SPA Performance Problem
- Download Time (Network)
- Lesson 1412 — Why Bundle Size Matters: Performance Impact
- Draft state
- Unsaved changes, toggles, intermediate selections
- Lesson 1683 — Form State: Almost Always Local
- Drilling
- is like telling each person in a chain *exactly* what's inside so they can repack it.
- Lesson 274 — Preview of Solutions: Composition
- DRY
- (Don't Repeat Yourself) and makes changes easier.
- Lesson 195 — Specialization Through CompositionLesson 1832 — The Route Tree: Parent and Child Routes
- Duplicate listeners
- (accidentally attaching the same handler twice)
- Lesson 6 — Event Listener Spaghetti CodeLesson 558 — What 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 1413 — Reading a Bundle Analysis Report
- During rendering
- (when JSX is being converted to elements)
- Lesson 1287 — What Error Boundaries Are: Catching Render ErrorsLesson 1291 — What Error Boundaries DON'T Catch: Server-Side Rendering
- Dynamic Component Selection
- Lesson 1073 — Hooks Can't Replace All Render Props Use Cases
- Dynamic field arrays
- (add/remove items from a list)
- Lesson 515 — Recognizing When Controlled is Still Better
- Dynamic logic
- You can perform different actions based on the node's properties or run side effects that depend on the element existing.
- Lesson 720 — The Ref Callback Pattern
- Dynamic routes
- Per-page or per-entity state
- Lesson 1726 — Atom Families for Dynamic CollectionsLesson 1888 — Dynamic Routes and Route Parameters
- Dynamic state needs
- Atom families let you create state on-the-fly for items in lists or tabs without pre-declaring them.
- Lesson 1729 — When Jotai Fits: Bottom-Up State
- Dynamic Styling with JavaScript
- Lesson 1922 — CSS-in-JS Philosophy: Colocation and Dynamic Styles
- Dynamic, not static
- The content can't be predetermined at the call site
- Lesson 1149 — When Render Props Win: Dynamic Behavior
E
- Eager loading
- (bundling everything together) and **lazy loading** (splitting with `React.
- Lesson 1358 — Lazy 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 1410 — The Prefetch/Import Timing Tradeoff
- Early return example
- Lesson 127 — Using if/else Before Return
- easier debugging
- (check variable values instead of dissecting nested operators), and **testable logic** you can verify independently.
- Lesson 126 — Extract Logic to Variables Before JSXLesson 823 — When Prop Drilling is Actually Fine
- Easier implementation
- (no need to inspect or filter children)
- Lesson 1079 — Named Children vs Generic Children
- Easier refactoring
- Change the action structure once, not everywhere
- Lesson 765 — Action Creators: Functions That Return Actions
- Easier state management
- Toggle between animation states by just changing the string you pass to `animate`.
- Lesson 1973 — Variants: Named Animation States
- Easier to debug
- The value is right there where you can see it
- Lesson 653 — The Fix: Compute During Render
- Easier to maintain
- You can modify one effect without touching others
- Lesson 532 — Multiple Effects in One Component
- Easier to reason about
- The data lives next to the logic that uses it
- Lesson 1680 — The Local-First Principle
- Easier to refactor
- Moving or deleting a component takes its state with it
- Lesson 1680 — The Local-First Principle
- Easier updates
- Change the component, update its test, adjust its styles—all in one place
- Lesson 209 — Colocating Tests and Styles with Components
- Easy optionality
- Missing props naturally render nothing
- Lesson 1130 — Props as Slots: The Basic Pattern
- Easy resets
- Just update state, input follows automatically
- Lesson 1195 — Controlled Forms: Single Source of Truth Principle
- Edge cases
- Simulate errors, timeouts, or rare conditions easily
- Lesson 2075 — Why Module Mocking is Necessary in TestsLesson 2190 — Unit Tests for Pure Functions and HooksLesson 2301 — When Virtualization Isn't Worth It
- Edit mode
- Auto-select existing text so users can quickly replace it
- Lesson 497 — Imperatively 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 1024 — Integration with Modern Tooling (Vite, Next.js)
- effect
- Lesson 533 — Effects vs Event HandlersLesson 550 — What Cleanup Functions AreLesson 561 — Why Effects Run After PaintLesson 562 — useLayoutEffect: The Synchronous AlternativeLesson 657 — Events vs Effects: The Fundamental Distinction
- Effect cleanup runs
- (even though the component didn't actually unmount)
- Lesson 598 — Why Your Effect Runs Twice on Mount
- Effect phase
- `useEffect` callbacks run
- Lesson 529 — When useEffect Runs: After CommitLesson 560 — The Render-Commit-Paint-Effect SequenceLesson 693 — When Computation Happens: Render vs Effect Timing
- Effect re-runs
- triggered by changing dependencies
- Lesson 1197 — Performance Implications: Re-renders on Every Keystroke
- Effect runs
- Detects props changed, calculates new value, calls `setState`
- Lesson 652 — Why It's Wrong: Double RenderingLesson 700 — Avoiding the useEffect Computation Trap
- Effect runs again
- Lesson 598 — Why Your Effect Runs Twice on Mount
- Effect timing
- Make the bread, serve it, *then* go back to the kitchen to add toppings, serve again
- Lesson 693 — When Computation Happens: Render vs Effect Timing
- Effect-based approach
- Lesson 672 — Testing Render vs Effect Approaches
- Effects
- = shipped to customer
- Lesson 433 — The Render-Commit-Effect Timeline VisualizedLesson 533 — Effects vs Event HandlersLesson 675 — Why useEffect is Wrong for Click HandlersLesson 1915 — Composing Utilities for Complex Styles
- Effects Phase
- .
- Lesson 430 — Effects Phase: Running Side Effects After PaintLesson 431 — Why Effects Can't Run During RenderLesson 434 — Why State Updates Don't Appear ImmediatelyLesson 528 — The useEffect Hook Signature
- Eliminate flash
- Lesson 1948 — Persisting Theme Choice in localStorage
- Embedded widgets
- When your React component lives inside someone else's page
- Lesson 28 — Preact: React's Lightweight Alternative
- Empty array `[]`
- Effect runs only once, after the initial render
- Lesson 536 — What is the Dependency Array?
- Empty results
- Lesson 2089 — Returning Different Responses per Test
- Enable easy refactoring
- Change the underlying library without touching every component
- Lesson 993 — Composing 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 1417 — Finding Unexpectedly Large Dependencies
- encapsulation
- the principle that a component should hide its implementation details.
- Lesson 731 — When NOT to Forward RefsLesson 780 — Custom Hooks for Consuming State and DispatchLesson 782 — Action Creators for Better Developer ExperienceLesson 1074 — Combining Both: Hooks for Logic, Render Props for UILesson 1099 — Radix UI's Compound Component Architecture
- Enforcement
- The custom hook throws an error if used outside the parent, ensuring proper nesting
- Lesson 1101 — Context-Based State Sharing in Radix
- Enhance
- Call your default reducer, then modify the result before returning
- Lesson 1179 — Combining Consumer and Default Reducers
- Enhanced build tools
- Lesson 1954 — CSS Modules Resurging in Popularity
- Enter/exit transitions
- Components animate in when they mount and out when they unmount (using `AnimatePresence`)
- Lesson 2010 — Framer Motion for Component-Driven UI Animations
- Enzyme
- "Test that your code is structured correctly.
- Lesson 2040 — RTL vs Enzyme: Philosophy Differences
- error boundaries
- .
- Lesson 323 — Error Boundaries: The Only Class-Exclusive FeatureLesson 1344 — What Suspense Doesn't HandleLesson 1838 — Pathless Routes for Shared Layouts
- Error Boundaries Integration
- Lesson 1365 — Why Manual fetch() + Suspense is Hard
- Error Boundary
- around your lazy route components (or the `<Suspense>` boundary wrapping them).
- Lesson 1401 — Error Boundaries for Route ChunksLesson 1478 — Error Handling: use() with Error Boundaries
- Error handling
- distinguishes AbortError from real failures
- Lesson 592 — The Complete Abort Pattern in One ExampleLesson 734 — Imperative Focus in Event Handlers
- Error messages clearer
- stack traces show meaningful names
- Lesson 204 — Avoiding Anonymous Function Exports
- Error or success messages
- Lesson 2056 — getByText for Non-Interactive Content
- Error state
- clears when retrying
- Lesson 592 — The Complete Abort Pattern in One ExampleLesson 1483 — What useActionState Replaces
- Error-prone
- Easy to forget required props, causing subtle bugs
- Lesson 1165 — The Problem: Too Many Individual Props
- ES module versions
- of libraries (`lodash-es` vs `lodash`)
- Lesson 1419 — Tree-Shaking Failures and How to Fix Them
- ES6 Proxies
- JavaScript objects that intercept operations like property reads and writes.
- Lesson 1760 — Proxy-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 1510 — Debugging Compiler Output
- estimateSize
- – A function that returns each item's approximate height
- Lesson 1279 — useVirtualizer Hook BasicsLesson 1281 — Dynamic Item Heights
- event
- is code that runs *because the user did something specific*.
- Lesson 657 — Events vs Effects: The Fundamental DistinctionLesson 660 — Form Submission: Event Handler, Not Effect
- Event handler behavior
- When a user clicks a button, does the `onClick` handler fire?
- Lesson 2184 — Unit Tests for Component Logic
- Event handler runs
- Your `onClick` or other handler executes immediately
- Lesson 438 — The Render Cycle Timeline
- Event handlers
- in loops or maps can all capture the same initial value
- Lesson 369 — The Closure Trap with Direct UpdatesLesson 533 — Effects vs Event HandlersLesson 535 — Why Effects are Often OverusedLesson 658 — The 'Handle Event in Effect' AntipatternLesson 675 — Why useEffect is Wrong for Click HandlersLesson 715 — Accessing current After MountLesson 1622 — When You MUST Use Client: InteractivityLesson 1713 — Reading State Without Subscribing
- Event listener hooks
- `useClickOutside` vs `useOutsideClick`—consistency matters
- Lesson 987 — Consistency Across Your Codebase
- Event-driven features
- Export functions, PDF generators, advanced form validation
- Lesson 2293 — Dynamic Imports Without Suspense
- Events
- Lesson 96 — camelCase Attributes: style, onClick, onChangeLesson 659 — Moving onClick Logic Out of EffectsLesson 1751 — XState Core Concepts: States, Events, Transitions
- every
- part of your UI needs to know instantly.
- Lesson 811 — Theme and Localization: Perfect Context Use CasesLesson 1790 — Global vs Per-Query ConfigurationLesson 1801 — Global Mutation DefaultsLesson 2252 — The Object-Value Reference Trap in Providers
- 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 831 — Multiple Consumers, Multiple Re-rendersLesson 839 — Identifying Independent State Domains
- Every component needs interactivity
- Your entire page is buttons, charts, drag-and-drop interfaces, and real-time updates
- Lesson 1652 — When to Skip SSR: SPAs and Hydration-Heavy Apps
- every single render
- , even though the initial value only matters the very first time.
- Lesson 358 — Reading from localStorage at InitializationLesson 538 — No Array: Run on Every RenderLesson 879 — The Object Dependency ProblemLesson 887 — useMemo for Heavy Array Operations
- every single time
- Lesson 605 — The Problem with Manual useEffect Data FetchingLesson 1674 — Server-Side Rendering (SSR): HTML on Every Request
- everything
- upfront, even code for routes they'll never visit or features they'll never use.
- Lesson 1384 — What Code Splitting Is and Why It MattersLesson 1668 — The onShellReady and onAllReady Callbacks
- Everything that file imports
- also becomes client code
- Lesson 1537 — The Module Boundary, Not Component Boundary
- exact same order
- on every render.
- Lesson 1014 — Top-Level Only: Function Scope RequirementsLesson 1037 — The Early Return Problem and Workarounds
- Exact string match
- `'Submit'` finds only "Submit"
- Lesson 2062 — TextMatch: String, Regex, and Function
- Exact strings
- are strict by default—whitespace and case must match perfectly.
- Lesson 2062 — TextMatch: String, Regex, and Function
- exactly
- the same output.
- Lesson 101 — suppressHydrationWarning: The Escape HatchLesson 762 — TypeScript: Discriminated Unions for Actions
- Example pattern
- Lesson 1075 — Migration Pattern: Render Props to Hooks
- Example scenario
- A button that brightens on hover.
- Lesson 1978 — When Framer Motion is OverkillLesson 2108 — Testing State Changes Through Their Effects
- Example strategy
- Lesson 1321 — Nested Boundary Fallback Strategies
- Execute
- every component's code to rebuild the virtual DOM tree
- Lesson 1647 — The Cost of Hydration: CPU and Time to Interactive
- Executes all your JSX
- and any hooks like `useState` or `useRef`
- Lesson 406 — What Happens During the Render Phase
- Execution order
- `onSuccess` OR `onError` runs first, then `onSettled` always runs last—like a `finally` block.
- Lesson 1793 — Mutation Callbacks: onSuccess, onError, onSettled
- Execution time
- React builds the component tree, runs effects, and renders everything
- Lesson 1556 — The Traditional SPA Performance Problem
- Execution Time (Runtime)
- Lesson 1412 — Why Bundle Size Matters: Performance Impact
- Exhaustiveness
- TypeScript warns if you forget to handle an action type
- Lesson 762 — TypeScript: 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 1747 — Team Familiarity and Existing Codebase Investment
- Existing patterns
- Match what's already there unless you're doing a deliberate migration
- Lesson 2396 — Team Conventions: Picking a Style
- Exit animations run automatically
- When the condition becomes `false`, the exit animation plays, *then* React unmounts
- Lesson 1979 — AnimatePresence for Enter/Exit Animations
- Expanding cards
- Click to expand, and both size and sibling positions animate
- Lesson 1984 — Layout Animations with layout Prop
- expensive
- to render
- Lesson 281 — Performance Considerations with Render PropsLesson 1987 — Layout Animation PerformanceLesson 2186 — Don't E2E-Test Every Edge Case
- Expensive child components
- remounting unnecessarily
- Lesson 176 — Profiling Key-Related Performance Issues
- Expensive computations
- You're running heavy calculations on every render without `useMemo`.
- Lesson 1197 — Performance Implications: Re-renders on Every Keystroke
- Expensive render logic
- that should be memoized but isn't
- Lesson 1197 — Performance Implications: Re-renders on Every KeystrokeLesson 2266 — When React.memo Actually Matters
- experimental
- and not available in stable React yet.
- Lesson 619 — The useEffectEvent Proposal (React Labs)Lesson 1512 — Compiler Adoption Timeline and Stability
- Explicit Props
- shine when data travels 1-2 levels deep.
- Lesson 826 — Comparing Solutions: Props vs Composition vs Context
- Explicitness
- Props interfaces show exactly what's accepted, including children
- Lesson 2396 — Team Conventions: Picking a Style
- Export sessions
- Save the entire action log as JSON for later analysis or bug reports
- Lesson 1744 — Time-Travel Debugging and Audit Requirements
- extend
- the existing component using the `styled(Component)` syntax.
- Lesson 1925 — Extending and Composing Styled ComponentsLesson 2026 — Configuring vitest.config.ts
- External Event Listeners
- Lesson 424 — When Batching Doesn't Apply
- External services
- (analytics, payment processors)
- Lesson 2075 — Why Module Mocking is Necessary in Tests
- External snapshots
- (the default) get written to separate `__snapshots__/*.
- Lesson 2158 — Inline Snapshots vs External Files
- External sync
- Then `useEffect` *is* appropriate (but rare)
- Lesson 683 — The Props-Change-Triggers-Effect Antipattern
- Extra render cycles
- the component renders once with stale derived data, then the effect runs and triggers a second render
- Lesson 684 — Derived State: Compute During Render Instead
- Extra state
- You're storing data that could be calculated on-the-fly
- Lesson 651 — Example: Filtering Props in an Effect
- Extract and memoize
- the render function if the child component is expensive to render:
- Lesson 1060 — Performance Considerations
- Extract outside the component
- when your computation is **pure and independent** — it doesn't need any props or state:
- Lesson 699 — When to Extract vs Inline with useMemo
- Extract ref reads
- and replace with state references
- Lesson 1203 — Migration Strategy: Converting Between Approaches
- Extreme performance critical paths
- Occasionally, manual control over exact memo boundaries matters
- Lesson 1508 — Compiler vs Manual: Performance Comparison
F
- Fade in from above
- Lesson 1971 — Animating on Mount and Unmount
- Fallback
- Only if there's NO Provider at all does React fall back to the default value from `createContext`.
- Lesson 793 — Default Values vs Provider ValuesLesson 802 — No Provider: Default Context Value
- False test results
- from leftover elements interfering with queries
- Lesson 2050 — Cleanup Between Tests
- Falsy left side
- (`false`, `0`, `null`, `undefined`, `""`, `NaN`): The gatekeeper stops you.
- Lesson 111 — Why && Works: Truthy/Falsy Evaluation
- Familiar API
- Vitest intentionally mirrors Jest's API (`describe`, `it`, `expect`), so migration is straightforward.
- Lesson 2024 — Why Vitest Over Jest for Modern React
- Familiar utilities
- (like date/time, validation, or formatting libraries) that seem huge
- Lesson 1417 — Finding Unexpectedly Large Dependencies
- Fast
- Because React already calculated the minimal changes, it's not wastefully re-rendering everything
- Lesson 412 — The Commit Phase: Applying Changes to the DOM
- Fast and focused
- Only the specific DOM nodes that changed get updated—not the entire tree
- Lesson 429 — Commit Phase: Applying Changes to the DOM
- Fast APIs
- If your data fetches return in 100ms, transitions won't make them faster.
- Lesson 1469 — When Concurrent Features Don't Help
- Fast-changing data
- (live scores): `staleTime: 0` (default)
- Lesson 1774 — Cache Staleness: staleTime Explained
- Faster Execution
- Vitest leverages Vite's lightning-fast Hot Module Replacement (HMR).
- Lesson 2024 — Why Vitest Over Jest for Modern React
- Faster feedback
- No need to render complex component trees just to verify hook behavior
- Lesson 2095 — Why Testing Hooks in Isolation Matters
- Faster iteration
- Prototype without performance anxiety, refactor without re-optimizing
- Lesson 1513 — Long-Term Impact on React Development
- Faster parsing
- The browser processes less code upfront
- Lesson 1384 — What Code Splitting Is and Why It Matters
- Feature-Based Structure
- groups files by *what feature they belong to*:
- Lesson 208 — Folder Structure: Feature-Based vs Type-Based
- Feature-level
- balances progressive loading with user experience—it's often the sweet spot.
- Lesson 1383 — Suspense Boundary Placement Patterns
- Feature-Level Boundaries
- Wrap independent features (sidebar, chat widget, notification panel) separately.
- Lesson 1307 — Error Boundary Placement Strategy
- Feature-level boundary
- Wraps the entire feed section → shows "Feed temporarily unavailable"
- Lesson 1321 — Nested 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 63 — The Components Folder: Shared vs Feature-Specific
- Fetched defaults
- Pre-filling from a server (but even this can be props!
- Lesson 1683 — Form 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 1811 — Migration Considerations: SWR to TanStack Query
- Fetching data
- Do it in the parent, or use Server Components
- Lesson 683 — The Props-Change-Triggers-Effect Antipattern
- Few props (1-4)
- Destructuring makes code cleaner and more readable.
- Lesson 244 — Destructuring vs Direct Access Tradeoffs
- Fewer props, clearer intent
- Instead of memorizing 20 props, you compose familiar building blocks.
- Lesson 1086 — Advantages Over Monolithic Components
- Fewer reconciliation cycles
- = less time comparing virtual DOM trees
- Lesson 425 — The Performance Win from Batching
- Fewer render passes
- = less time spent calling component functions
- Lesson 425 — The Performance Win from Batching
- Fewer typos
- Your editor autocompletes the function name
- Lesson 765 — Action 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 1013 — The Fiber Tree and Hook Chains
- 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 2265 — Field Data vs Lab Data
- Field-level
- makes sense when errors are always shown inline next to their inputs.
- Lesson 1209 — Field-Level vs Form-Level Validation State
- file uploads
- , and **performance-sensitive inputs**.
- Lesson 1199 — When Uncontrolled is Right: Simple Forms and File InputsLesson 2185 — E2E Tests for Integration Points
- Filtered lists
- You have an array in state and a search term—the filtered results are derived
- Lesson 663 — What is Derived State?
- filters
- when your component tree is overwhelming
- Lesson 73 — DevTools Settings and Display OptionsLesson 1861 — Updating Search Params Without Full Navigation
- Finally
- JavaScript executes and fetches data from your API (network round-trip)
- Lesson 1558 — The Waterfall Problem in Data Fetching
- Find shared dependencies
- The analyzer reveals that three route chunks all include `lodash`.
- Lesson 1402 — Route-Based Bundle Analysis
- Fine boundaries
- (component-level) show more of the UI faster but create visual noise with multiple spinners.
- Lesson 1340 — Suspense Boundaries: Where to Place Them
- Firefox
- Visit Firefox Add-ons and search for "React Developer Tools"
- Lesson 2207 — Installing and Opening the React DevTools Profiler
- First
- React calls your cleanup function, unsubscribing from `"user-1"`
- Lesson 552 — When Cleanup Runs: Before Re-runLesson 1470 — Concurrent Features vs Other OptimizationsLesson 1558 — The Waterfall Problem in Data FetchingLesson 1775 — Cache Garbage Collection: cacheTime / gcTime
- First `!` (negation)
- Converts the value to boolean and flips it
- Lesson 113 — Safe 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 793 — Default Values vs Provider Values
- First Contentful Paint
- Did route splitting improve initial load?
- Lesson 2291 — Measuring Split Effectiveness
- First Input Delay (FID)
- Measures the delay between a user's first interaction (click, tap) and when the browser can actually respond.
- Lesson 2258 — Core Web Vitals: LCP, FID, CLS
- First pass
- Re-render immediately with the **old** deferred value (keeping the UI responsive)
- Lesson 1443 — The Basic useDeferredValue Pattern
- first render
- .
- Lesson 360 — When Props Change: Initial State Doesn't UpdateLesson 652 — Why It's Wrong: Double RenderingLesson 700 — Avoiding the useEffect Computation TrapLesson 1033 — Dynamic Hook Calls Based on PropsLesson 1781 — Stale-While-Revalidate Explained
- First render (logged in)
- Lesson 1009 — Why Conditional Hooks Break Everything
- First-Come-First-Served
- model: sequential, predictable, but inflexible.
- Lesson 1460 — The Mental Model: Traffic Lights vs First-Come-First-Served
- Fix
- Initialize with an empty string: `useState("")`
- Lesson 506 — Common Mistakes: Switching Between Controlled and UncontrolledLesson 2370 — Common Ref Type Errors and Fixes
- Flame graphs
- Visual bars showing which components rendered and their parent-child relationships
- Lesson 416 — Visualizing Renders with React DevTools ProfilerLesson 844 — Measuring Impact with React DevTools Profiler
- Flamegraph width
- Is the memoized component missing from commits where its parent rendered but props didn't change?
- Lesson 2273 — Profiling After Adding memo
- flexibility
- from render props (consumers decide exactly what to render).
- Lesson 1074 — Combining Both: Hooks for Logic, Render Props for UILesson 1099 — Radix UI's Compound Component ArchitectureLesson 1106 — Why These Libraries Choose Compound PatternsLesson 1142 — Multiple Named Content PropsLesson 2396 — Team Conventions: Picking a Style
- Flexible layouts
- Components that adapt to available content
- Lesson 1133 — Optional Slots with Conditional Rendering
- flexible ordering
- decided by the consumer
- Lesson 1128 — Slots vs Compound Components: Design TradeoffsLesson 1130 — Props as Slots: The Basic Pattern
- FLIP technique
- when you use the `layout` or `layoutId` props:
- Lesson 1987 — Layout Animation Performance
- Focus Management
- When items mount/unmount during scrolling, preserve focus context so keyboard users don't lose their place.
- Lesson 1285 — Accessibility Considerations
- Focus on real bottlenecks
- You immediately see which interactions caused slow renders.
- Lesson 2213 — Filtering Commits by Duration Threshold
- Focus/blur events
- respond instantly
- Lesson 1456 — User Input Priority: Clicks, Typing, and Immediate Feedback
- Follow the stack trace
- in the console to navigate from child to parent until you find where the conditional logic lives
- Lesson 1661 — Debugging Hydration Errors
- Font rendering differences
- that break precise layouts
- Lesson 2187 — E2E 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 1394 — Webpack Magic Comments for Chunk Naming
- For cache invalidation
- Named chunks have predictable filenames, making it easier to reason about caching strategies.
- Lesson 1394 — Webpack Magic Comments for Chunk Naming
- For data fetching
- Server routes let you fetch data *before* rendering, avoiding waterfalls.
- Lesson 1892 — Server 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 1394 — Webpack Magic Comments for Chunk Naming
- For interactive user-facing pages
- Use `onShellReady` to start streaming immediately.
- Lesson 1636 — The onShellReady and onAllReady Callbacks
- For learning
- Absolutely — experimenting now prepares you for the future and helps you write compiler- friendly code patterns today.
- Lesson 1512 — Compiler Adoption Timeline and Stability
- For reusability
- You have the same logic in multiple components (the three-strike rule).
- Lesson 1001 — Extracting for Testability vs Reusability
- For testability
- You have complex logic in a single component that's hard to test.
- Lesson 1001 — Extracting for Testability vs Reusability
- For user experience
- Server routing shows loading states during transitions but keeps HTML fast.
- Lesson 1892 — Server vs Client Routing Boundaries
- Force remount
- by changing the component's `key` (rare, usually overkill)
- Lesson 503 — When Default Props Don't Update
- Form components
- Reset form fields when editing different items
- Lesson 692 — Refactoring Effect-Based Syncing to Key Prop
- Form data
- – the `FormData` object from the form submission
- Lesson 1485 — Action Functions and State Updates
- Form libraries
- like React Hook Form or Formik provide hooks for form state, validation, and submission.
- Lesson 1004 — When Framework Libraries Obviate Custom Hooks
- Formatting
- Transform values as users type
- Lesson 462 — Why Controlled Components Re-render on Every Change
- FormData object
- and passes it as the first argument to your server action function.
- Lesson 1612 — FormData in Server Actions
- Fragments
- `<Suspense fallback={<><Spinner /><p>Please wait</p></>}>`
- Lesson 1369 — What the fallback Prop AcceptsLesson 2340 — ReactNode: The Broadest Children Type
- Framer Motion
- or **React Transition Group** that handle this delay logic for you.
- Lesson 1965 — Limitations: No Mount/Unmount AnimationsLesson 2011 — React Spring for Natural, Physics-Based Motion
- Frames timeline
- Red corners mark dropped frames—your animation skipped a beat
- Lesson 2021 — Measuring Frame Rate with DevTools
- Framework
- – select "React"
- Lesson 38 — Creating a Vite + React ProjectLesson 50 — Next.js: The Full-Stack Framework
- Framework flexibility
- it works seamlessly with any backend pattern
- Lesson 1830 — When Apollo Fits vs TanStack Query
- Framework support
- React Router and other routers make this trivial
- Lesson 1423 — Route-Level Splitting: The Sweet Spot
- Frequent prop usage
- If you reference `name` ten times, writing `name` beats `props.
- Lesson 244 — Destructuring vs Direct Access Tradeoffs
- Frequent renders
- Components rendering dozens of times during a single interaction suggest unnecessary re-renders —possible candidates for `React.
- Lesson 2223 — Reading the Profiler Flamegraph
- Frequent user paths
- Common workflows that most users experience
- Lesson 2183 — E2E Tests Cover Critical User Journeys
- frequently
- Lesson 281 — Performance Considerations with Render PropsLesson 2268 — Profiling Before Adding memo
- Frequently changing data
- News sites, stock tickers, social feeds — when data freshness matters and you're hitting your database anyway.
- Lesson 1675 — SSR Trade-offs: Server Cost vs Time-to-Content
- Frequently-changing dependencies
- Cache always invalidates, negating the cache's purpose
- Lesson 2284 — Dependency Array Performance Impact
- Fresh
- implement this pattern.
- Lesson 1650 — Islands Architecture: Partial HydrationLesson 1774 — Cache Staleness: staleTime ExplainedLesson 1782 — The staleTime Configuration
- Friction
- (default: 26): How much resistance slows the spring.
- Lesson 1993 — Spring Configuration: Tension, Friction, Mass
- Full components
- `<Suspense fallback={<SkeletonLayout />}>`
- Lesson 1369 — What the fallback Prop Accepts
- Full Failure
- Replace the entire section with an error screen
- Lesson 1319 — Degraded UI vs Full Failure
- function
- as a prop, you're giving the child component a way to "call back" to the parent.
- Lesson 231 — Why Pass Functions as PropsLesson 291 — this.setState(): The Class Update APILesson 356 — When Initial State is Expensive to ComputeLesson 357 — Lazy Initial State with a FunctionLesson 387 — What is Lazy Initialization?Lesson 528 — The useEffect Hook SignatureLesson 720 — The Ref Callback PatternLesson 870 — useMemo vs useCallback: The Relationship (+6 more)
- Function Children
- The consumer decides how to transform data into UI
- Lesson 1153 — What is Inversion of Control in React?
- Functional
- "Increase the current temperature by 5°"
- Lesson 376 — Performance: Functional Updates Are Not Slower
- functional update
- pattern with the **spread operator** to preserve existing fields:
- Lesson 374 — Functional Updates with ObjectsLesson 442 — Using Functional Updates to Avoid Staleness
- functions
- alongside state values:
- Lesson 1095 — Passing Actions Through ContextLesson 1552 — Prop Serialization Across the BoundaryLesson 2062 — TextMatch: String, Regex, and Function
- Future-proof
- React's own documentation moved away from `React.
- Lesson 2396 — Team Conventions: Picking a Style
G
- Garbage collected
- After being inactive for `cacheTime` (default: 5 minutes), the data is removed
- Lesson 1773 — Automatic Caching: How TanStack Query Stores Data
- Gestural interfaces
- Draggable cards, swipeable panels, anything users manipulate directly
- Lesson 2011 — React Spring for Natural, Physics-Based Motion
- Gestures
- expose `velocity`, `direction`, `distance`
- Lesson 1063 — Render Props for Complex Interactions
- getByRole
- buttons, links, headings, form controls
- Lesson 2117 — Query by Role, Not Test IDsLesson 2164 — Locators: Finding Elements the Right Way
- getByTestId
- only when semantic queries aren't possible
- Lesson 2117 — Query by Role, Not Test IDsLesson 2164 — Locators: Finding Elements the Right Way
- getByText
- non-interactive content users read
- Lesson 2117 — Query by Role, Not Test IDsLesson 2164 — Locators: Finding Elements the Right Way
- Global state pollution
- Every dropdown might attach event listeners to the document, creating conflicts.
- Lesson 8 — Component Reusability Before React
- Good
- Database IDs, unique product SKUs, usernames—values tied to the data itself
- Lesson 153 — Keys Must Be Stable Across Renders
- Good examples
- Lesson 983 — The useX Naming Pattern
- Good naming (purpose-focused)
- Lesson 205 — Component Naming for Clarity
- Good news
- React 18's automatic batching covers these cases, so this workaround is rarely needed anymore.
- Lesson 424 — When Batching Doesn't Apply
- Good test thinking
- Lesson 2108 — Testing State Changes Through Their Effects
- Granular subscriptions
- When different components need different slices of state (Context re-renders all consumers on any change)
- Lesson 816 — Context vs State Management LibrariesLesson 2328 — When to Move to External State
- Granular, composable requirements
- You want individual pieces of state that can be mixed and matched without ceremony.
- Lesson 1729 — When Jotai Fits: Bottom-Up State
- Granularity
- The compiler can memoize at a finer level than you'd reasonably do by hand.
- Lesson 1508 — Compiler vs Manual: Performance Comparison
- GraphQL
- as its data layer.
- Lesson 52 — Gatsby: Static Site GenerationLesson 1821 — When tRPC Fits vs GraphQL or REST
- GraphQL Code Generator
- (commonly called `codegen`) reads your GraphQL schema and operations (queries/mutations), then automatically generates TypeScript types that match perfectly.
- Lesson 1829 — Apollo Client with TypeScript
- GraphQL subscriptions
- , libraries like TanStack Query don't handle these out of the box.
- Lesson 611 — When useEffect Data Fetching Still Makes Sense
- Gray "did not render"
- labels in the Flamegraph for commits where the parent re-rendered
- Lesson 2273 — Profiling After Adding memo
- Grid reordering
- Items shuffle positions when filtered or sorted
- Lesson 1984 — Layout Animations with layout Prop
- group
- only one can be selected at a time.
- Lesson 459 — Controlled Radio ButtonsLesson 1353 — Multiple Lazy Components Under One Boundary
- Guesses
- initial heights using `estimateSize` (doesn't need to be perfect)
- Lesson 1281 — Dynamic Item Heights
H
- Handle race conditions
- by ensuring the latest request always wins
- Lesson 587 — Why 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 1104 — Accessibility Built Into Compound Components
- Hard to test
- Mocking timings, race conditions, and cleanup in tests is painful.
- Lesson 605 — The Problem with Manual useEffect Data Fetching
- Have intricate edge cases
- that are hard to trigger through component UI (error recovery, race conditions)
- Lesson 2102 — When to Test Hooks vs Components
- Headings and titles
- (when you're not testing ARIA hierarchy)
- Lesson 2056 — getByText for Non-Interactive Content
- Headless
- is the philosophy that ties these patterns together—maximum logic reuse, zero style opinions.
- Lesson 1183 — What 'Headless' Means: Logic Without Styling
- Headless UI
- leans toward implicit coordination with fewer exposed components, favoring simplicity over flexibility.
- Lesson 1107 — Comparing API Styles: Radix vs Headless UI
- heavy component trees
- .
- Lesson 1452 — Common Pitfalls: Deferring PrimitivesLesson 2266 — When React.memo Actually Matters
- Heavy components used conditionally
- modals, admin panels, editor interfaces
- Lesson 1358 — Lazy vs Eager: When Each is Right
- Heavy computation hooks
- that slow down your test suite
- Lesson 2133 — Mocking Custom Hooks: When It's Justified
- Heavy filtering or search
- You're typing in a search box that filters 10,000 items.
- Lesson 1461 — Priority 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 1652 — When to Skip SSR: SPAs and Hydration-Heavy Apps
- Heavy Library Dependencies
- Lesson 2289 — Component-Level Splitting Decisions
- Heavy transformations
- Lesson 885 — Identifying Expensive Computations in Render
- Heavy utilities
- Date formatting libraries, validation schemas, chart renderers
- Lesson 2293 — Dynamic Imports Without Suspense
- Here's the catch
- Nested destructuring can quickly become cryptic.
- Lesson 243 — Nested Destructuring for Prop Objects
- Hides the real problem
- You're working around unstable references instead of fixing them
- Lesson 639 — JSON.stringify as a Last Resort
- High quantity
- The more items, the bigger the savings
- Lesson 934 — List 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 936 — memo with Pure Presentational Components
- High-frequency cascades
- A parent component re-renders 10+ times per second, triggering expensive child tree updates
- Lesson 2237 — Tracking vs Fixing: When to Act
- High-frequency updates
- Real-time data, animations, or rapid user interactions
- Lesson 816 — Context vs State Management LibrariesLesson 2257 — Comparing Context Overhead to AlternativesLesson 2266 — When React.memo Actually Matters
- High-risk areas
- Authentication, data submission, critical integrations
- Lesson 2183 — E2E Tests Cover Critical User Journeys
- High-risk features
- Admin actions, data deletion, permissions
- Lesson 2191 — Balance: Enough E2E Coverage Without Fragility
- Higher-Order Components (HOCs)
- functions that take a component and return a wrapped, enhanced version:
- Lesson 309 — Wrapper Hell and HOCsLesson 313 — Hooks Enable Logic ExtractionLesson 1070 — The Historical Context: Why Render Props Existed
- 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 1955 — When Runtime CSS-in-JS Still Makes Sense
- Highly Interactive Apps
- Think Figma, code editors, or complex dashboards.
- Lesson 1673 — CSR Trade-offs: Interactivity vs Initial Load
- Hiring and Collaboration
- React developers are abundant.
- Lesson 30 — Ecosystem Size as a Decision Factor
- HOCs (Higher-Order Components)
- wrap your component in another component, adding props automatically.
- Lesson 1049 — Render Props vs HOCs for Logic Sharing
- HOCs work well when
- Lesson 1049 — Render Props vs HOCs for Logic Sharing
- Hoisting
- Function declarations are hoisted, meaning you can call them before they're defined in the file.
- Lesson 183 — Arrow Functions vs Function Declarations
- Honestly? Usually not much
- Modern React is fast, and creating small objects is cheap.
- Lesson 1899 — Extracting Style Objects
- Hook Names
- SWR's `useSWR` becomes `useQuery`.
- Lesson 1811 — Migration Considerations: SWR to TanStack Query
- Hook order or presence
- Whether `useState` or `useReducer` is used
- Lesson 2115 — What Are Implementation Details?
- Hooks
- Values and dependencies if using hooks (covered much later)
- Lesson 68 — Components Tab: Inspecting the Component TreeLesson 994 — Hook Composition vs Function Composition
- Hooks = logic extraction
- Get values, use them however you want.
- Lesson 1067 — Render Props vs Hooks for Stateful Logic
- Hooks changes
- Which hook values changed (context, reducers, etc.
- Lesson 2225 — Comparing 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 1052 — When Render Props Add Value
- Hooks equivalent
- Lesson 320 — From this.setState to State Setters
- Hooks folder
- If it uses `useState`, `useEffect`, or other hooks and is needed by 2+ features.
- Lesson 64 — Common Top-Level Folders: hooks, utils, types
- Hooks mental model
- Lesson 315 — The Mental Model Shift
- Hooks with updater function
- Lesson 320 — From this.setState to State Setters
- Hot reloading
- Class methods are harder to hot-swap during development without losing state
- Lesson 311 — Classes Confuse Both People and Machines
- Hover and focus effects
- (button grows slightly, background changes)
- Lesson 1957 — When CSS Transitions Are Enough
- Hover indicators
- Boolean flags for `onMouseEnter`/`onMouseLeave`
- Lesson 1685 — Temporary State: Counters, Timers, Animations
- How
- they're wrapped (in a div, a section, etc.
- Lesson 192 — Composition with Multiple ChildrenLesson 1044 — Sharing Stateful Logic with Render Props
- How it works
- If `username` exists (truthy), React renders the `<p>` tag.
- Lesson 89 — Short-Circuit Evaluation: && and ||Lesson 706 — Common Use Case: Storing Previous ValuesLesson 1355 — Error Handling with Error BoundariesLesson 1820 — Prefetching tRPC Queries on the ServerLesson 1964 — onTransitionEnd for Cleanup Logic
- How long
- it took (in ms)
- Lesson 1462 — Identifying Heavy Renders with ProfilerLesson 2268 — Profiling Before Adding memo
- How many levels
- (1-2 → props, 3+ → consider alternatives)
- Lesson 826 — Comparing Solutions: Props vs Composition vs Context
- How to use it
- Lesson 473 — Measuring the Actual Performance Impact
- HTTP requests
- (MSW handles this beautifully)
- Lesson 2126 — Mock External Dependencies, Not Internal Code
- HTTP/1.0 connections
- don't support chunked encoding
- Lesson 1671 — Streaming SSR Browser Support and Fallbacks
- hydration
- it attaches event listeners, initializes state, and "wakes up" the interactive parts of your application.
- Lesson 1640 — Bootstrapping the Client After SSRLesson 1651 — Resumability: Qwik's Alternative to Hydration
I
- Identify culprits
- Look at the flame graph for components rendering frequently or slowly
- Lesson 2247 — Profiling to Confirm the Problem
- Identify the logic
- currently living in your effect
- Lesson 662 — Refactoring: From Effect to Direct Call
- Identify unexpected dependencies
- You split `AdminDashboard` expecting a small chunk, but the analyzer shows it's 800KB.
- Lesson 1402 — Route-Based Bundle Analysis
- Identify update patterns
- Which values change frequently?
- Lesson 2253 — Splitting Context by Update Frequency
- If data fetch fails
- Error Boundary catches the error
- Lesson 1381 — Suspense Boundaries and Error Boundaries Together
- If it fails
- restore the snapshot you saved—as if nothing happened
- Lesson 1795 — Optimistic Updates: The Pattern
- If successful
- the server response confirms everything (or you can use it to refine the UI)
- Lesson 1795 — Optimistic Updates: The Pattern
- If they still pass
- , they were testing behavior — exactly what the user experiences didn't change.
- Lesson 2122 — Refactoring Should Not Break Tests
- If your tests break
- , they were testing implementation.
- Lesson 2122 — Refactoring Should Not Break Tests
- ignore flag pattern
- solves this by marking responses as "stale" when the effect re-runs or the component unmounts.
- Lesson 581 — The Ignore Flag PatternLesson 593 — When AbortController Isn't EnoughLesson 594 — The Ignore Flag Pattern as Fallback
- IIFEs
- immediately invoked function expressions—which let you run statement-based logic and return a value inline.
- Lesson 130 — Switch Statements in IIFEs
- Image galleries
- Each cell renders a thumbnail from a two-dimensional array or a flattened list mapped to grid coordinates.
- Lesson 2299 — Virtualized Grids and Multi-Column Layouts
- immediate feedback
- .
- Lesson 675 — Why useEffect is Wrong for Click HandlersLesson 1198 — When Controlled is Right: Validation and Dynamic BehaviorLesson 1320 — Loading-to-Error Transition DesignLesson 1451 — The Debounce Alternative
- Immediate local state
- updates instantly on every keystroke (keeps the input responsive)
- Lesson 477 — Mitigating Cost: Debouncing State Updates
- Immediate red flags
- Lesson 1932 — Migration Path: When to Consider Alternatives
- immediately
- rather than letting them hide until production.
- Lesson 597 — What StrictMode Does: Intentional Double-MountingLesson 607 — Background Refetching and Stale-While-RevalidateLesson 1370 — Fallback Renders Immediately on SuspendLesson 1774 — Cache Staleness: staleTime ExplainedLesson 2369 — Callback Refs with TypeScript
- Immediately flushes
- all the HTML it's rendered so far
- Lesson 1665 — Suspense Boundaries Enable Streaming
- Immediately Invoked Function Expression
- lets you wrap statements inside a function, then call it immediately.
- Lesson 129 — Immediately Invoked Function Expressions (IIFEs) in JSX
- Immediately sends
- the HTML for everything *outside* that boundary
- Lesson 1367 — The Streaming SSR Connection
- Immediately update the cache
- manually modify what users see
- Lesson 1795 — Optimistic Updates: The Pattern
- Immediately visible on load
- navigation, headers, hero sections
- Lesson 1358 — Lazy vs Eager: When Each is Right
- Imperative (How)
- You walk into the kitchen and tell the chef: "First, chop the onions.
- Lesson 9 — Declarative UI: What vs How
- imperative control
- without triggering re-renders
- Lesson 722 — When to Use Refs vs State for DOM InteractionLesson 2000 — Why GSAP for React: Imperative Animation Power
- 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 2115 — What Are Implementation Details?Lesson 2120 — Wrapper Components as Implementation Details
- Import and use
- Your hooks become fully typed automatically
- Lesson 1829 — Apollo Client with TypeScript
- Import React and ReactDOM
- You're bringing in the React library itself
- Lesson 41 — main.jsx: The React Bootstrap
- Import resolution
- Modern bundlers treat `src/` as the starting point for module imports
- Lesson 61 — The src Folder Convention
- Import statements become self-documenting
- When you see `import UserProfile from '.
- Lesson 201 — One Component Per File (Usually)
- Import your root component
- Usually an `App` component that contains your entire application
- Lesson 41 — main.jsx: The React Bootstrap
- Important quirk
- This function is backwards from typical comparisons!
- Lesson 920 — The Custom Comparison Function: arePropsEqual
- Improved Time to Interactive
- Users can interact sooner
- Lesson 1384 — What Code Splitting Is and Why It Matters
- Impure reducer (broken)
- Lesson 758 — Pure Function Requirements
- In `Button/index.js`
- Lesson 210 — Index Files for Cleaner Imports
- In `components/index.js`
- Lesson 210 — Index Files for Cleaner Imports
- In a component
- Lesson 1872 — Loading States During Auth Checks
- In a controlled form
- Every keystroke updates state, causing the entire form component and all its input children to re- render.
- Lesson 1227 — Performance Comparison: RHF vs Controlled
- In any child route
- Lesson 1839 — useOutletContext: Sharing Data with Children
- In attributes
- Lesson 93 — Interpolation in Attributes vs Children
- In Client Components
- , you must use the `useParams` hook from `next/navigation`:
- Lesson 1888 — Dynamic Routes and Route Parameters
- In lifecycle methods
- (like `componentDidMount`)
- Lesson 1287 — What Error Boundaries Are: Catching Render Errors
- in order
- , passing the output of one as the input to the next.
- Lesson 371 — Guaranteeing Sequential UpdatesLesson 1008 — What 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 1564 — The Composability Win
- In production
- Only if you're comfortable with experimental features and can handle potential breaking changes.
- Lesson 1512 — Compiler Adoption Timeline and Stability
- In Server Components
- (the default), params are passed as props:
- Lesson 1888 — Dynamic Routes and Route Parameters
- In strict mode
- (which most modern React apps use), attempting to mutate props triggers a runtime error:
- Lesson 226 — The Error When You Try to Mutate Props
- in the browser
- it builds your UI after JavaScript loads and executes.
- Lesson 34 — SEO-First Content Without SSR InfrastructureLesson 1539 — Server Components Cannot Import Client Components DirectlyLesson 1951 — Server Components Break Runtime CSS-in-JS
- In the cleanup function
- Remove that exact same listener
- Lesson 554 — Cleanup for Event ListenersLesson 582 — Implementing the Ignore Flag Pattern
- In this lesson
- You'll understand why writing `{ key: value }` directly in a dependency array triggers infinite re- renders.
- Lesson 634 — The Inline Object AntipatternLesson 697 — The Dependency Array for ComputationLesson 1577 — No Loading States in the Component
- inactive
- state.
- Lesson 1773 — Automatic Caching: How TanStack Query Stores DataLesson 1775 — Cache Garbage Collection: cacheTime / gcTime
- Inconsistent error handling
- (did you remember `finally` everywhere?
- Lesson 1336 — The Imperative Loading Problem
- Incremental adoption
- Easier to drop into existing projects without rewrites
- Lesson 1885 — When TanStack Router Fits vs React Router
- Incremental adoption matters
- Add routing to existing React apps without restructuring your entire project
- Lesson 1893 — When Next.js Routing Fits vs React Router
- Incrementally inject
- the finished HTML for each async component as it resolves
- Lesson 1583 — Streaming and Incremental Rendering
- Independence
- Separate states don't force unrelated re-checks
- Lesson 384 — Performance: Object vs Multiple Variables
- independent
- .
- Lesson 289 — this.state: The Class Component State ObjectLesson 940 — Real-World Example: Dashboard WidgetsLesson 1392 — Multiple Lazy Components in One Suspense
- independently
- .
- Lesson 532 — Multiple Effects in One ComponentLesson 1398 — Nested Route Splitting Strategies
- index file
- (commonly called a "barrel file") acts like a central export hub for a folder.
- Lesson 210 — Index Files for Cleaner ImportsLesson 796 — Organizing 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 1252 — Debugging Key Stability Issues
- Indicate progress
- with visual cues like opacity or spinners
- Lesson 1471 — User Perception: Immediate Feedback Matters Most
- indirection
- the component no longer behaves exactly as written.
- Lesson 927 — Cognitive Load and Code ComplexityLesson 1688 — Avoiding Premature Abstraction
- Individual Item Semantics
- Each virtual item needs proper ARIA attributes:
- Lesson 1285 — Accessibility Considerations
- infinite loop
- (update → componentDidUpdate → setState → update → componentDidUpdate → .
- Lesson 298 — componentDidUpdate: Responding to Props or State ChangesLesson 568 — Why Fetch Happens in useEffectLesson 623 — The Classic Infinite Loop: setState in Effect BodyLesson 624 — Object Dependencies Causing LoopsLesson 627 — Derived Values as DependenciesLesson 634 — The Inline Object Antipattern
- 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 549 — When 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 1023 — Auto-Fix Behavior and Pitfalls
- Infinite scroll or pagination
- Loading the next page of results as users scroll is a client-side concern.
- Lesson 1573 — Client-Side Data Fetching Still Exists
- Infrequent updates
- Theme switching, locale selection, current user data
- Lesson 816 — Context vs State Management LibrariesLesson 1690 — Context for Simple App-Wide StateLesson 2249 — When Context Causes Every Consumer to Re-renderLesson 2328 — When to Move to External State
- infrequently
- or **independently**
- Lesson 1398 — Nested Route Splitting StrategiesLesson 1690 — Context for Simple App-Wide StateLesson 2267 — The Cost of React.memo Itself
- Initial bundle size
- Has it decreased significantly after lazy loading routes or components?
- Lesson 1418 — Analyzing Code-Split Chunk Sizes
- Initial client render (hydration)
- `width` is still `null`, renders "Loading width.
- Lesson 1659 — The Two-Pass Render Pattern
- initial load
- improved by 300KB.
- Lesson 1357 — Bundle Size Impact of Code SplittingLesson 1427 — Measuring Real-World Impact
- Initial render time
- Creating thousands of DOM nodes is computationally expensive.
- Lesson 1275 — The Performance Problem with Long ListsLesson 2295 — The Problem Virtualization Solves
- Initial state
- `loading` starts `true` because fetching begins immediately
- Lesson 569 — Managing Loading States
- Initial value
- The argument to `useState(initialValue)` replaces what you assigned in the constructor
- Lesson 316 — From constructor State to useStateLesson 491 — Creating a Ref with useRefLesson 691 — Combining Prop and Local State Correctly
- Initializes state
- and context
- Lesson 1642 — What Hydration Is: Attaching Event Listeners to Server HTML
- Injection overhead
- Creating and inserting `<style>` tags blocks the main thread.
- Lesson 1931 — Performance Tradeoffs: Runtime Style Injection
- Inline arrow function
- Lesson 234 — Inline Arrow Functions vs Stable References
- Inline arrow functions
- are convenient when you need to pass arguments: `() => handleClick(id)`
- Lesson 234 — Inline Arrow Functions vs Stable References
- Inline data scripts
- serialized props and state needed for hydration
- Lesson 1639 — Server-Side HTML Structure and Scripts
- Inline Function Props
- Lesson 2231 — What why-did-you-render Detects
- Inline mapping
- keeps everything in the return statement:
- Lesson 146 — Inline vs Extracted Mapping Functions
- Inline object types
- define the shape directly in the component signature:
- Lesson 2332 — Inline Props Types vs Named Interfaces
- Inline snapshots
- embed the expected output directly in your test file as a string literal using `toMatchInlineSnapshot()`.
- Lesson 2158 — Inline Snapshots vs External Files
- Inline styles
- Useful when duration/easing needs to be dynamic (passed as props)
- Lesson 1958 — Adding transition Property to React Components
- Inlines
- a small `<script>` tag that tells the browser where to insert it
- Lesson 1367 — The Streaming SSR Connection
- Input values
- `username`, `email`, `password` while typing
- Lesson 1683 — Form State: Almost Always Local
- inside
- the class using the `static` keyword:
- Lesson 294 — Static Properties: defaultProps and propTypesLesson 640 — Arrays from .map and .filterLesson 1381 — Suspense Boundaries and Error Boundaries TogetherLesson 1988 — Combining Exit and Layout Animations
- Inside attributes
- (like `src={}` or `className={}`)
- Lesson 93 — Interpolation in Attributes vs Children
- Inside the effect
- Declare `let ignore = false` at the very top, then check `if (!
- Lesson 582 — Implementing the Ignore Flag Pattern
- Inspect the element
- using DevTools to see its attributes and content
- Lesson 1661 — Debugging Hydration Errors
- Install dependencies
- `react`, `react-dom`, `webpack`, `webpack-cli`, `babel-loader`, `@babel/preset-react`
- Lesson 54 — Webpack from Scratch
- Install the tools
- `@graphql-codegen/cli` and relevant plugins
- Lesson 1829 — Apollo Client with TypeScript
- Instant Recognition
- When someone reads `setCount(5)`, they immediately know this updates the `count` state variable.
- Lesson 335 — Naming Convention: [thing, setThing]
- Instant server starts
- Instead of bundling everything upfront, Vite serves your source files directly using native ES modules.
- Lesson 37 — Why Vite Replaced Create React App
- instantly
- as the user types.
- Lesson 469 — Benefits: Conditional Rendering Based on InputLesson 1853 — Optimistic UI with useFetcherLesson 1942 — CSS Variables Basics and Browser Support
- Instead of
- forcing state to update synchronously with `flushSync`, let React update naturally and measure in `useLayoutEffect`.
- Lesson 449 — Alternatives to flushSync: Effect-Based Solutions
- intentional
- .
- Lesson 832 — Context Re-renders Are UnavoidableLesson 900 — Stabilizing Effect Dependencies
- Intentional one-time effects
- where you genuinely want to ignore updates to certain values
- Lesson 1022 — When 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 549 — When to Disable the ESLint Rule
- interact
- with methods like `click()`, and **assert** with `expect()`.
- Lesson 2163 — Your First Playwright TestLesson 2208 — Recording a Profile: Start, Interact, Stop
- Interact with your app
- (click buttons, type in forms, navigate pages)
- Lesson 70 — Profiler Tab: Recording Performance Sessions
- Interaction-based splits
- Does hovering/clicking trigger small, focused downloads?
- Lesson 1427 — Measuring 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 2217 — Using the Interactions Tab (Legacy)
- Interactivity
- that Server Components don't provide
- Lesson 1527 — No useState, useEffect, or Event HandlersLesson 1622 — When You MUST Use Client: Interactivity
- Intercepting routes
- let you "hijack" navigation to show content in a modal while keeping the URL intact for sharing.
- Lesson 1891 — Parallel Routes and Intercepting Routes
- Intermediate components become cluttered
- with pass-through props they don't care about
- Lesson 808 — Context vs Props: Choosing the Right Tool
- Internal helper functions
- Private utilities not exposed to users
- Lesson 2115 — What Are Implementation Details?
- Internal knowledge required
- Users shouldn't need to understand your state management or rendering logic to customize appearance.
- Lesson 1163 — When Inversion Becomes Over-Engineering
- interrupt
- the transition work to handle urgent updates
- Lesson 1440 — Transitions Don't Make Code FasterLesson 1453 — React's Priority Queue: High vs Low Priority Updates
- Interruptible
- React can pause them mid-render
- Lesson 1457 — Transition Priority: Background Updates That Can WaitLesson 1463 — The 50ms Threshold: When Renders Become Noticeable
- Interruption handling
- Imagine a modal sliding in with a 300ms duration animation.
- Lesson 1990 — Why Physics-Based Animation vs Keyframe/Duration
- Interruptions
- User changes direction mid-animation (springs naturally reverse; duration-based animations often snap)
- Lesson 2011 — React Spring for Natural, Physics-Based Motion
- IntersectionObserver API
- with a ref to the DOM node.
- Lesson 740 — Detecting Visibility with IntersectionObserver
- into
- the Provider component itself.
- Lesson 797 — Creating a Custom Provider ComponentLesson 1218 — handleSubmit: Type-Safe Form Submission
- Invalidation
- You can invalidate `['todos']` to clear all todo-related queries
- Lesson 1771 — Query 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 1188 — React Aria: Adobe's Hooks-Based ApproachLesson 1231 — The <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 1153 — What is Inversion of Control in React?
- Invisible elements
- need testing (analytics trackers, hidden metadata)
- Lesson 2064 — getByTestId: The Escape Hatch
- Islands Architecture
- treats interactive components as isolated "islands" of interactivity in a sea of static HTML.
- Lesson 1650 — Islands Architecture: Partial Hydration
- Isn't obscured
- by another element (like a modal overlay)
- Lesson 2165 — Auto-Waiting and Actionability Checks
- Isolate boundaries
- – New feature areas can use Hooks while old areas stay class-based
- Lesson 327 — When Teams Haven't Migrated Yet
- Isolation
- State changes in one subtree don't risk affecting unrelated parts of your app
- Lesson 817 — Local Context for Component SubtreesLesson 1691 — Context for Feature-Scoped StateLesson 2075 — Why Module Mocking is Necessary in Tests
- ISR
- Meal-prep service—refresh batches periodically, serve from cache between updates
- Lesson 1679 — Decision Matrix: Choosing the Right Rendering Strategy
- It compiles to
- Lesson 74 — JSX Compiles to Function Calls
- It doesn't
- Your expensive filtering, sorting, or rendering logic takes exactly the same amount of time to execute.
- Lesson 1440 — Transitions Don't Make Code Faster
- It suggests missing cleanup
- you should cancel in-flight operations
- Lesson 575 — Setting State After Unmount Warning
- It won't work
- Your `TextInput` component won't receive `ref` as a prop.
- Lesson 724 — The Ref Forwarding Problem
- It's infrequent
- A component that re-renders once on route change doesn't need memoization
- Lesson 2237 — Tracking 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 1573 — Client-Side Data Fetching Still Exists
- It's wasteful
- you're trying to update something that doesn't exist
- Lesson 575 — Setting State After Unmount Warning
J
- JavaScript Execution
- Zero until interaction
- Lesson 1651 — Resumability: Qwik's Alternative to Hydration
- JavaScript object
- Lesson 97 — The style Prop: Objects Instead of StringsLesson 1895 — The style Prop: Object Syntax
- JavaScript objects
- , you create a single source of truth that's easier to maintain, refactor, and type-check.
- Lesson 1945 — Organizing Theme Tokens in JavaScript
- Jotai
- take a different path: they don't use context at all.
- Lesson 863 — Alternatives: Zustand and JotaiLesson 2257 — Comparing Context Overhead to Alternatives
- jsdom
- simulates a browser environment in Node.
- Lesson 2025 — Installing Vitest and Testing DependenciesLesson 2027 — Setting Up the jsdom Environment
- JSON-serializable
- convertible to plain text and back again.
- Lesson 1552 — Prop Serialization Across the Boundary
- JSX elements
- `<Button />` or `<div>Hello</div>`
- Lesson 251 — Children Types: Elements, Strings, NumbersLesson 1369 — What the fallback Prop AcceptsLesson 2340 — ReactNode: The Broadest Children Type
- JSX is just sugar
- There's no magic, just function calls
- Lesson 76 — JSX Without a Transpiler: The Raw API
- JSX.Element
- Use when your component always returns exactly one JSX element.
- Lesson 2338 — Typing Component Return Values
K
- Keep it local
- Lesson 1682 — The Lift-State-Up Threshold
- Keep on client
- Data triggered by clicks, real-time updates, form submissions
- Lesson 648 — Migration Strategy: Moving Fetches Server-Side
- Keep other fields uncontrolled
- until needed (partial migration is valid)
- Lesson 1203 — Migration Strategy: Converting Between Approaches
- Keep state lifted
- where both can access it (accept some re-renders)
- Lesson 2315 — When Lifting Down Breaks Communication
- Key areas to examine
- Lesson 2021 — Measuring Frame Rate with DevTools
- Key differences
- Lesson 518 — Using FormData API with Uncontrolled Forms
- Key disappears
- → React destroys that component instance entirely.
- Lesson 151 — Keys Preserve Component Identity
- Key order matters
- `{a:1, b:2}` and `{b:2, a:1}` produce different strings
- Lesson 639 — JSON.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 1016 — The Performance Win of Order-Based Tracking
- Keyboard Navigation
- Ensure users can Tab through focusable elements and use Arrow keys to scroll.
- Lesson 1285 — Accessibility Considerations
- Keyframe animations
- require `@keyframes` definitions that live outside any single element's styles.
- Lesson 1897 — What 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 2265 — Field Data vs Lab Data
- Labels
- (`getByLabelText`) - form accessibility
- Lesson 2033 — The Guiding Principle: Accessibility First
- Language clues
- include phrases like:
- Lesson 326 — Documentation and Tutorials: Recognizing Outdated Content
- Language/locale
- Internationalization touches text everywhere
- Lesson 810 — Context for Truly Global State
- Large and self-contained
- A PDF viewer, video player, or complex form wizard.
- Lesson 1424 — Component-Level Splitting: When It Helps
- Large array operations
- Lesson 885 — Identifying Expensive Computations in Render
- Large component trees
- Your form component renders hundreds of child components that don't use `memo`.
- Lesson 1197 — Performance Implications: Re-renders on Every Keystroke
- Large consumer trees
- When you have dozens of components consuming context, the re-render cost multiplies.
- Lesson 2257 — Comparing Context Overhead to Alternatives
- Large Dependencies
- Drill into chunks to see individual libraries.
- Lesson 1413 — Reading a Bundle Analysis Report
- Large form validation
- Running expensive validation logic across multiple fields.
- Lesson 1461 — Priority in Practice: When You Feel the Difference
- Large teams
- Standardized patterns and predictable state flow
- Lesson 816 — Context vs State Management Libraries
- Large third-party libraries
- charting, video players, rich text editors
- Lesson 1358 — Lazy 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 647 — The SEO and Performance ImpactLesson 1427 — Measuring Real-World ImpactLesson 2258 — Core Web Vitals: LCP, FID, CLS
- Layout (Reflow)
- Calculates where elements sit on the page—their size, position, and relationship to other elements.
- Lesson 2016 — The Browser's Rendering Pipeline
- layout animations
- .
- Lesson 1982 — The mode Prop: wait, sync, and popLayoutLesson 2010 — Framer Motion for Component- Driven UI Animations
- layout components
- that wrap their children (like a sidebar or navigation), while child routes render the specific content inside that layout.
- Lesson 1832 — The Route Tree: Parent and Child RoutesLesson 1838 — Pathless Routes for Shared Layouts
- layout thrashing
- where components pop in one at a time, causing jarring visual shifts.
- Lesson 1353 — Multiple Lazy Components Under One BoundaryLesson 1960 — Common Transition Properties: opacity, transformLesson 2018 — Triggering Layout ThrashingLesson 2021 — Measuring Frame Rate with DevTools
- Lazy import
- You wait until the exact moment the component is needed (like when a modal opens).
- Lesson 1410 — The Prefetch/Import Timing Tradeoff
- Lazy init
- is choosing expensive materials only once when you build the foundation (mount)
- Lesson 393 — Lazy Init vs useMemo: Different Tools
- Lazy initialization
- runs your function **once, during component mount**, to calculate the *initial* state value.
- Lesson 393 — Lazy Init vs useMemo: Different Tools
- Leaf components first
- – Migrate simple presentational components before complex stateful ones
- Lesson 327 — When Teams Haven't Migrated Yet
- Legacy migration
- during a refactor (temporarily, with a TODO comment)
- Lesson 1035 — ESLint Override Comments: When and How
- LEGO blocks
- precise, granular, infinitely arrangeable.
- Lesson 1107 — Comparing API Styles: Radix vs Headless UI
- less boilerplate
- and fewer action creators
- Lesson 768 — When to Use Multiple Action Types vs Single with PayloadLesson 1343 — Suspense vs Traditional Loading StatesLesson 2044 — The screen Object: Your Query Gateway
- Less critical
- → SSR is acceptable
- Lesson 1679 — Decision Matrix: Choosing the Right Rendering Strategy
- Less JavaScript to parse
- → faster TTI, because the main thread isn't busy compiling unused code
- Lesson 2287 — Performance Impact of Code Splitting
- Less nesting
- No wrapper components cluttering your JSX
- Lesson 800 — Replacing Context.Consumer with useContext
- Let components opt-in
- Each component imports only the context it needs
- Lesson 2253 — Splitting Context by Update Frequency
- Library authors
- use default values to make their context work without a Provider in simple cases
- Lesson 793 — Default Values vs Provider Values
- Library defaults
- where the Context works standalone but can be customized
- Lesson 795 — Context Without a Provider
- Lifecycle
- Mounting/unmounting hooks only run when identity actually changes
- Lesson 151 — Keys Preserve Component Identity
- lifecycle methods
- Lesson 325 — Third-Party Libraries with Class APIsLesson 1294 — Lifecycle and Constructor Errors (Class Components)Lesson 1298 — Error Boundaries Must Be Class Components
- Lifecycle Mismatches
- Lesson 36 — Embedding in Existing Non-React Apps
- Lift the state up
- so the parent controls it
- Lesson 302 — getDerivedStateFromProps: Syncing State to PropsLesson 367 — Sibling Components Don't Share State
- 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 957 — Combining 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 1700 — The Problem of Shared State Across Distant Components
- Likelihood of use
- High-traffic features deserve prefetch.
- Lesson 1410 — The Prefetch/Import Timing Tradeoff
- Limitation
- When you need multiple insertion points or want to rearrange structure without changing JSX order, children becomes awkward.
- Lesson 1150 — Composability Comparison: Nesting and Flexibility
- Limited memory
- that struggles with large runtime overhead
- Lesson 33 — Performance-Critical Mobile Web Apps
- Linaria
- , **vanilla-extract**, and **Panda CSS** shift style extraction to **build time**.
- Lesson 1931 — Performance Tradeoffs: Runtime Style Injection
- Lingering subscriptions
- never getting canceled
- Lesson 601 — Why React Does This: Finding Missing Cleanup
- List animations
- Items move naturally when others are added/removed
- Lesson 1984 — Layout Animations with layout Prop
- List only those primitives
- in the dependency array
- Lesson 880 — Extracting Primitive Values from Objects
- Lists with IDs
- Todos, users, posts — anything with unique identifiers
- Lesson 1726 — Atom Families for Dynamic Collections
- Lists without user interaction
- (no reordering, no deletions)
- Lesson 162 — The Index-as-Key Pattern and Why It's Common
- Live validation feedback
- (showing errors as users type)
- Lesson 515 — Recognizing When Controlled is Still Better
- Loader-level checks first
- Use loaders to check auth *before* rendering
- Lesson 1874 — Common Pitfalls: Redirect Loops and Flash
- Loading and error states
- Every component reinvents the wheel with its own loading flags and error handling
- Lesson 1768 — TanStack Query: What Problem Does It Solve?
- Loading Phase
- Component suspends → Suspense boundary shows loading fallback
- Lesson 1320 — Loading-to-Error Transition Design
- Loading spinners
- Local `isLoading` during a single fetch
- Lesson 1685 — Temporary State: Counters, Timers, Animations
- Loading state
- resets when a new fetch starts
- Lesson 592 — The Complete Abort Pattern in One ExampleLesson 1872 — Loading States During Auth Checks
- Loading state bugs
- (forgot to set loading back to false in one code path?
- Lesson 1336 — The Imperative Loading Problem
- Loading states
- (`isLoading`, `setIsLoading`)
- Lesson 605 — The Problem with Manual useEffect Data FetchingLesson 1874 — Common Pitfalls: Redirect Loops and Flash
- Loads your JavaScript bundle
- in the browser
- Lesson 1642 — What Hydration Is: Attaching Event Listeners to Server HTML
- Local context
- means wrapping only a specific subtree of components with a provider, rather than your entire application.
- Lesson 817 — Local Context for Component Subtrees
- Localization + Feature Flags
- Translating UI while conditionally showing features
- Lesson 804 — Multiple Contexts in One Component
- Logging priority
- – Page errors are high-priority, widget errors are informational
- Lesson 1316 — Contextual Error Messages by Location
- Logic Appears Only Once
- Lesson 969 — When NOT to Extract
- Logical OR (`||`)
- also catches falsy values like `0`, `""`, or `false`.
- Lesson 245 — Default 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 2189 — E2E for Authentication and Authorization Flows
- Logout Flow
- Ensure logout clears session state and redirects to a public page.
- Lesson 2189 — E2E 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 1333 — Error Tracking with LogRocket and Other Services
- Long tasks
- (>50ms): JavaScript blocking the main thread
- Lesson 2021 — Measuring Frame Rate with DevTools
- Long-Term Stability
- Companies invest heavily in React.
- Lesson 30 — Ecosystem Size as a Decision Factor
- Look for lighter alternatives
- Search for "lightweight alternative to [library]" or check bundlephobia.
- Lesson 1417 — Finding Unexpectedly Large Dependencies
- Loop repeats forever
- Lesson 626 — State Updates Based on State Without Functional Form
- Lost component state
- (inputs clearing, scroll positions resetting)
- Lesson 176 — Profiling Key-Related Performance IssuesLesson 1245 — Why Keys Must Be Stable Across Renders
- Lost optimization opportunities
- for sibling components that could've updated together
- Lesson 447 — The Performance Cost of flushSync
- Lost state
- Form inputs lose their values when the list re-orders, or checkboxes toggle the wrong items.
- Lesson 161 — Debugging Key-Related Issues
- Low adoption
- Few developers used it, and the API required manual instrumentation
- Lesson 2217 — Using the Interactions Tab (Legacy)
- Low comparison cost
- Checking a few stable props is cheap
- Lesson 936 — memo with Pure Presentational Components
- Low-frequency reads
- Configuration, feature flags, or authentication status
- Lesson 816 — Context vs State Management Libraries
- Low-priority
- Features below the fold or in secondary tabs.
- Lesson 1424 — Component-Level Splitting: When It Helps
- Low-priority features
- settings panels, help documentation
- Lesson 1358 — Lazy vs Eager: When Each is Right
- Lower onboarding friction
- New developers learn React's core concepts first, not performance workarounds
- Lesson 1513 — Long-Term Impact on React Development
- Lower priority
- They yield to user input and other urgent updates
- Lesson 1457 — Transition Priority: Background Updates That Can Wait
M
- main thread
- during the **render phase** — exactly when React needs maximum performance.
- Lesson 1950 — The Runtime CSS-in-JS ProblemLesson 2017 — Compositor-Only Properties: transform and opacity
- Main thread activity
- Long yellow blocks are JavaScript execution.
- Lesson 2021 — Measuring 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 1276 — What Virtualization Is: Render Only Visible Items
- Maintainability
- Easy to add new checks without nesting deeper
- Lesson 186 — Early Returns for Conditional LogicLesson 2103 — The Core Principle: Test User-Facing Behavior
- Maintainable
- Changes have predictable scope
- Lesson 1002 — The Cohesion Test: Does the Hook Have a Clear Purpose?
- Maintainable tests
- Fewer false failures from harmless refactors
- Lesson 2038 — Avoiding Direct State and Props Assertions
- Maintaining semantic HTML
- (like keeping list items direct children of `<ul>`)
- Lesson 107 — When Fragments Need the key Prop
- Maintenance
- Refactoring is straightforward—just follow the chain
- Lesson 269 — When Drilling Isn't a ProblemLesson 2199 — Page Objects in CI: Keeping Tests DRY
- Maintenance burden
- It's unclear which components actually *use* the data vs just pass it through
- Lesson 266 — What is Prop Drilling?Lesson 820 — The Component Tree Depth ProblemLesson 1312 — Avoiding Boundary Overuse
- Maintenance nightmare
- Component updates require changing every usage site
- Lesson 1165 — The Problem: Too Many Individual Props
- Make targeted fixes
- Only optimize components that show measurable render cost
- Lesson 2247 — Profiling to Confirm the Problem
- Makes the app interactive
- without replacing the HTML
- Lesson 1642 — What Hydration Is: Attaching Event Listeners to Server HTML
- Manage the cache
- React maintains internal bookkeeping for each memoized value
- Lesson 872 — The Cost of Memoization Itself
- Manageable granularity
- Not too many chunks, not too few
- Lesson 1423 — Route-Level Splitting: The Sweet Spot
- Manages focus programmatically
- When you press arrow keys, focus moves between tab triggers automatically.
- Lesson 1104 — Accessibility Built Into Compound Components
- Manual cache sync
- – after success, you must manually refetch or update your local state to show the change
- Lesson 609 — Optimistic Updates and Mutations Made Simple
- Many layout elements
- Animating 50+ elements simultaneously can still overwhelm the system
- Lesson 1987 — Layout Animation Performance
- Many props (5+)
- Destructuring parameters with 10 props creates a cluttered function signature.
- Lesson 244 — Destructuring vs Direct Access Tradeoffs
- Maps and Sets
- have no standard JSON representation.
- Lesson 1595 — Complex 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 1677 — SSG Trade-offs: Speed vs Freshness
- Masking design flaws
- Sometimes the warning signals that your logic needs restructuring, not just more dependencies
- Lesson 1023 — Auto-Fix Behavior and Pitfalls
- Mass
- (default: 1): How heavy the object is.
- Lesson 1993 — Spring Configuration: Tension, Friction, Mass
- Match
- the virtual tree against the real DOM
- Lesson 1647 — The Cost of Hydration: CPU and Time to Interactive
- Meaningful
- for debugging (you can trace them back to your database)
- Lesson 1255 — Stable IDs: The Gold Standard for Keys
- Measurable benefit scenarios
- Lesson 2266 — When React.memo Actually Matters
- Measurable performance impact
- The Profiler shows a commit taking >16ms (causing dropped frames)
- Lesson 2237 — Tracking vs Fixing: When to Act
- Measure DOM nodes
- (scroll position, element dimensions) and immediately update state based on those measurements
- Lesson 432 — useLayoutEffect: Pre-Paint Synchronous Effects
- Measure the impact
- Use the Profiler to verify fewer components re-render
- Lesson 2253 — Splitting Context by Update Frequency
- Measuring DOM elements
- Lesson 562 — useLayoutEffect: The Synchronous Alternative
- Medium nesting (3-5 levels)
- Slots maintain clarity; children still readable; render props get nested
- Lesson 1150 — Composability 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 864 — What is Memoization?
- Memoization becomes invisible
- No more debates about when to wrap functions or whether a component "deserves" memo
- Lesson 1513 — Long-Term Impact on React Development
- Memoization bookkeeping
- `useCallback` stores functions and checks dependencies
- Lesson 948 — When 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 1470 — Concurrent Features vs Other Optimizations
- Memoize event handlers
- passed to each item using `useCallback`
- Lesson 946 — Memoizing Component Lists with Map Callbacks
- Memoize the mapping callback
- if you create items inline
- Lesson 946 — Memoizing Component Lists with Map Callbacks
- Memory allocation
- Each cached value sits in memory until the component unmounts
- Lesson 872 — The Cost of Memoization Itself
- Memory consumption
- Each DOM node has overhead; thousands add up to significant RAM usage
- Lesson 2295 — The Problem Virtualization Solves
- memory leaks
- or **stale behavior**.
- Lesson 550 — What Cleanup Functions AreLesson 554 — Cleanup for Event ListenersLesson 556 — Cleanup for SubscriptionsLesson 558 — What Happens Without CleanupLesson 2050 — Cleanup Between Tests
- Memory management
- – cache grows indefinitely
- Lesson 1345 — Suspense Without a Data LibraryLesson 1783 — The cacheTime Configuration
- Memory overhead
- React must store the previous value and dependency array
- Lesson 873 — Memoization is Not FreeLesson 1275 — The Performance Problem with Long ListsLesson 2283 — The Trap of Memoizing Everything
- Merge (default)
- Most updates—changing individual properties while preserving others
- Lesson 1712 — The set Function: Merging and Replacing
- Merge conflicts decrease
- Multiple developers can work on different components without editing the same file.
- Lesson 201 — One Component Per File (Usually)
- Message tone
- – Apologetic for app crashes, matter-of-fact for widgets
- Lesson 1316 — Contextual Error Messages by Location
- Meta's internal tools
- Production-ready and actively used
- Lesson 1512 — Compiler Adoption Timeline and Stability
- Middle
- Integration tests — moderate number of tests checking how components work together
- Lesson 2182 — The Testing Pyramid: Unit, Integration, E2E
- Migrate gradually
- remove manual `memo()` and `useCallback()` over weeks or months, not days
- Lesson 1521 — Migration Strategy: Incremental Adoption
- Migration paths
- Lesson 1932 — Migration Path: When to Consider Alternatives
- Minification
- Class methods can't be reliably minified because their names might be reflected or dynamically accessed
- Lesson 311 — Classes Confuse Both People and Machines
- Minifies
- your JavaScript (removes whitespace, shortens variable names)
- Lesson 46 — Building for Production
- Minimal abstraction layers
- Direct DOM manipulation where React adds indirection
- Lesson 28 — Preact: React's Lightweight Alternative
- Minimal rendering
- the parent usually just renders its children without adding extra markup
- Lesson 1109 — Creating the Parent Component Shell
- Mirrors production patterns
- Your component still calls `fetch()` or `axios.
- Lesson 2085 — Why MSW Over Manual Mocks
- Missing assets
- Images or files that didn't copy correctly to `dist`
- Lesson 47 — Previewing the Production Build
- Missing cleanup functions
- (event listeners that pile up, timers that keep running)
- Lesson 597 — What StrictMode Does: Intentional Double-Mounting
- Missing dependencies
- cause stale results:
- Lesson 697 — The Dependency Array for ComputationLesson 1021 — Reading and Understanding Exhaustive-Deps WarningsLesson 2236 — Finding Hook Dependency Issues
- 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 1252 — Debugging Key Stability Issues
- Missing the point
- If props should trigger actions, that logic belongs in the parent or in direct render logic
- Lesson 683 — The Props-Change-Triggers-Effect Antipattern
- Mobile 3G
- Aim for <170KB gzipped (parses in ~1 second)
- Lesson 1421 — Bundle Budget Strategy: Setting Thresholds
- Mobile networks
- sometimes force buffering for optimization
- Lesson 1671 — Streaming SSR Browser Support and Fallbacks
- Mobile performance matters
- Every kilobyte affects load time on slow networks
- Lesson 28 — Preact: React's Lightweight Alternative
- Mock external boundaries
- Lesson 2131 — The React Testing Library Philosophy on Mocking
- Modal content
- Reset when showing different modal contexts
- Lesson 692 — Refactoring Effect-Based Syncing to Key Prop
- Modal dialogs
- focus the first field when a modal opens via button click
- Lesson 734 — Imperative Focus in Event Handlers
- Model-View-Controller
- architecture to the browser, giving developers a way to organize their code.
- Lesson 20 — Backbone.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 785 — When This Pattern Beats External State Libraries
- Moderate updates
- (user profile): `staleTime: 1-5 minutes`
- Lesson 1774 — Cache Staleness: staleTime Explained
- module boundary
- the point where your code transitions from server execution to client execution.
- Lesson 1535 — What 'use client' Actually DeclaresLesson 1537 — The Module Boundary, Not Component Boundary
- Module mocking
- lets you replace these dependencies with controlled, predictable substitutes:
- Lesson 2075 — Why Module Mocking is Necessary in Tests
- Monolithic components
- Cram everything into one massive component with limited customization
- Lesson 1077 — What Are Compound Components?
- Most Components Are Simple
- Lesson 415 — Why Renders Are Usually Fast
- Most of the time
- , if ESLint complains, you have a real violation:
- Lesson 1035 — ESLint Override Comments: When and How
- Mount
- happens when a component first appears on the screen.
- Lesson 296 — The Three Lifecycle Phases: Mount, Update, Unmount
- Mount Phase (component appears)
- Lesson 307 — The Lifecycle Diagram: Mental Model
- mounts
- a fresh component instance with the new key (runs initialization, creates new state)
- Lesson 157 — Keys and Component StateLesson 366 — The Key Prop Resets State by Changing IdentityLesson 494 — When Refs Become AvailableLesson 504 — Resetting Uncontrolled Inputs with keyLesson 1267 — Animation and Transition Breaks
- Move to server
- Initial page data, user profiles, product lists
- Lesson 648 — Migration 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 957 — Combining Techniques: State Down + Content UpLesson 2313 — Moving 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 2091 — Testing Components That Fetch on Mount
- Multi-step flows
- move focus to the next input after completing one
- Lesson 734 — Imperative Focus in Event Handlers
- Multi-step forms
- where earlier answers affect later questions
- Lesson 515 — Recognizing When Controlled is Still BetterLesson 733 — Auto-focusing Inputs on Mount
- Multi-step logic
- where you need intermediate calculations
- Lesson 129 — Immediately Invoked Function Expressions (IIFEs) in JSX
- Multi-step wizards
- Move to the next step programmatically after validation passes
- Lesson 1856 — Programmatic Navigation with useNavigate
- Multiple Branches
- When you have three or more possible outcomes, chained ternaries become cryptic:
- Lesson 125 — When Simple Conditionals Break Down
- Multiple calls
- Each state value gets its own `useState` line
- Lesson 316 — From constructor State to useState
- Multiple components
- use the same hooks — React would need component-specific namespaces
- Lesson 1012 — Why Hooks Can't Use Names or IDs
- Multiple consumers
- scattered throughout different branches of the tree
- Lesson 828 — The Scope of Consumer Re-renders
- Multiple contexts are cleaner
- Just call `useContext` multiple times instead of nesting Consumers
- Lesson 800 — Replacing Context.Consumer with useContext
- Multiple DOM commits
- trigger additional browser layout/paint cycles
- Lesson 447 — The Performance Cost of flushSync
- Multiple mismatches
- listed together (not just the first one)
- Lesson 1517 — Stricter Hydration Error Reporting
- Multiple named areas
- (header, sidebar, footer, toolbar)
- Lesson 1148 — When Slots Win: Multiple Named Insertions
- Multiple props
- are being drilled together
- Lesson 809 — The Prop Drilling ThresholdLesson 1120 — The Problem Slots Solve: Multiple Content AreasLesson 1686 — The Prop Drilling Pain Threshold
- must
- close: `<img />` or `<input />`
- Lesson 78 — JSX is Not HTML: Key DifferencesLesson 81 — Why React Must Be In Scope (Classic Transform)Lesson 199 — Named Exports vs Default ExportsLesson 286 — Class Component Structure: extends React.ComponentLesson 447 — The Performance Cost of flushSyncLesson 919 — memo Doesn't Stop Internal State ChangesLesson 976 — The Custom Hook Naming Convention: useXLesson 984 — What Happens Without the 'use' Prefix (+8 more)
- Mutable Values
- When you need a "box" to hold a value that persists across renders without causing re-renders
- Lesson 2383 — Typing useRef: Mutable Values vs DOM Refs
- Mutate the DOM directly
- to prevent flicker (like positioning a tooltip)
- Lesson 432 — useLayoutEffect: Pre-Paint Synchronous Effects
- Mutation-triggered
- Server Actions or API routes that modify data
- Lesson 1571 — Server 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 1811 — Migration Considerations: SWR to TanStack Query
N
- N elements
- from a single hook call, where each element gets its own independent spring animation.
- Lesson 1995 — useSprings: Animating Multiple Elements
- name
- or **index** without needing individual refs for each field.
- Lesson 519 — Reading Values with event.target.elementsLesson 1732 — Slices: State + Reducers + Actions Together
- Name-based tracking
- would require a hash map lookup on every Hook call.
- Lesson 1016 — The Performance Win of Order-Based Tracking
- Named Export
- (multiple per file):
- Lesson 199 — Named Exports vs Default ExportsLesson 341 — Importing useState from React
- Named export mock
- Lesson 2077 — Mocking Default vs Named Exports
- Named exports
- enforce consistency.
- Lesson 199 — Named Exports vs Default ExportsLesson 203 — Export Patterns for Multiple Components
- Named functions work differently
- When you extract a handler into a separate function, TypeScript no longer has that contextual connection.
- Lesson 2351 — Inline Event Handlers vs Named Functions
- Named imports enable tree-shaking
- Lesson 1419 — Tree-Shaking Failures and How to Fix Them
- Naming convention
- Does the calling function start with `use` or is it a PascalCase component?
- Lesson 1019 — The rules-of-hooks Rule
- Native ESM Support
- Vitest runs modern JavaScript code the way browsers actually execute it—no transform layer needed.
- Lesson 2024 — Why Vitest Over Jest for Modern React
- Natural composition
- Adding icons, badges, or complex layouts inside menu items becomes trivial—they're just children.
- Lesson 1086 — Advantages Over Monolithic Components
- Natural deceleration
- Real-world objects don't move in linear or even ease curves—they have mass and momentum.
- Lesson 1990 — Why Physics-Based Animation vs Keyframe/Duration
- Natural defaults
- Every parent with children can have a sensible starting point
- Lesson 1836 — Index Routes: Default Child Content
- Navigating between routes
- When you leave a page, its components unmount and lose state.
- Lesson 363 — Unmounting Destroys State
- Navigation changes
- Reset when the URL path changes so errors don't persist across pages.
- Lesson 1327 — resetKeys for Automatic Recovery
- Necessary renders
- Lesson 2220 — What Constitutes an 'Unnecessary' Render
- Nest timelines
- within timelines for modular animation logic
- Lesson 2012 — GSAP for Complex Timeline Animations
- Nested Boundaries
- Use multiple layers.
- Lesson 1307 — Error Boundary Placement StrategyLesson 1376 — What Suspense Boundaries ContainLesson 1377 — Multiple Suspense Boundaries: Nested vs Sibling
- Nested combinations
- `{ users: [{ id: 1 }, { id: 2 }] }`
- Lesson 1552 — Prop Serialization Across the Boundary
- Nested Logic
- When you nest ternaries or mix `&&` with ternaries, you create a mental maze:
- Lesson 125 — When 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 1831 — What Nested Routes Are and Why They Matter
- Network failure
- Lesson 2089 — Returning Different Responses per Test
- Network is unreliable
- High failure rates make optimistic updates frustrating
- Lesson 1802 — Pessimistic vs Optimistic: When to Choose
- Network negotiation overhead
- (DNS lookup, connection, headers)
- Lesson 1426 — The Cost of Over-Splitting
- Never
- pass unsanitized user input to `dangerouslySetInnerHTML`.
- Lesson 100 — dangerouslySetInnerHTML: XSS Protection by DesignLesson 853 — The useState Setter Stability GuaranteeLesson 971 — The Two Cardinal Rules of HooksLesson 1308 — App-Level Boundary: The Safety NetLesson 1334 — Source Maps for Readable Stack Traces
- Never modifies external variables
- during rendering
- Lesson 179 — Components are Pure Functions of Props
- new
- state value
- Lesson 344 — Reading State After setStateLesson 624 — Object Dependencies Causing LoopsLesson 650 — The Symptom: Stale Derived ValuesLesson 1443 — The Basic useDeferredValue Pattern
- New codebase
- Start with plain functions—it's the direction React is heading
- Lesson 2396 — Team Conventions: Picking a Style
- New key appears
- → React creates a fresh component instance from scratch.
- Lesson 151 — Keys Preserve Component Identity
- new object
- each render, causing an infinite loop if `fetchData` triggers a state update.
- Lesson 628 — Missing Memoization on Complex DependenciesLesson 1096 — Context Memoization in Compound Components
- new reference
- in memory.
- Lesson 633 — Why Objects in Dependencies Cause Re-runsLesson 898 — useCallback for Stable Function ReferencesLesson 2252 — The Object-Value Reference Trap in Providers
- new references
- on every parent render, even if their content is identical.
- Lesson 901 — Stabilizing Props to Memoized ComponentsLesson 2274 — memo + Stable Props Pattern
- Next.js
- , you export `getServerSideProps` from a page component:
- Lesson 645 — SSR with Loaders: Next.js and Remix PatternsLesson 1024 — Integration with Modern Tooling (Vite, Next.js)Lesson 1345 — Suspense Without a Data LibraryLesson 1512 — Compiler Adoption Timeline and Stability
- Next.js/Remix loaders
- Use `getServerSideProps`, `getStaticProps`, or Remix loaders for route-level data
- Lesson 648 — Migration Strategy: Moving Fetches Server-Side
- no
- .
- Lesson 471 — Tradeoff: Extra Re-rendersLesson 513 — Forms with Minimal State RequirementsLesson 666 — Performance: Render Computation is FastLesson 1447 — useDeferredValue vs useTransitionLesson 1679 — Decision Matrix: Choosing the Right Rendering StrategyLesson 2107 — The 'Does the User Care?' Litmus Test
- No Action Logs
- There's no automatic record of what caused state changes.
- Lesson 1696 — Context Limitations: No DevTools
- No awkward redirects
- Instead of redirecting `/dashboard` to `/dashboard/home`, serve content directly
- Lesson 1836 — Index Routes: Default Child Content
- No background refetching
- Data goes stale, but you'd never know.
- Lesson 605 — The Problem with Manual useEffect Data Fetching
- No cache invalidation strategy
- – stale data lives forever
- Lesson 1345 — Suspense Without a Data Library
- No Caching
- Lesson 577 — Why This Pattern is Problematic at ScaleLesson 605 — The Problem with Manual useEffect Data Fetching
- No complex logic needed
- You're not transforming, filtering, or manipulating what's passed in
- Lesson 1147 — When 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 828 — The Scope of Consumer Re-renders
- No constructor needed
- No `bind()` calls needed.
- Lesson 293 — Class Fields Syntax: Public PropertiesLesson 316 — From constructor State to useState
- No data flow pattern
- How do you pass different options to each dropdown instance?
- Lesson 8 — Component Reusability Before React
- No Deduplication
- Lesson 577 — Why This Pattern is Problematic at ScaleLesson 605 — The Problem with Manual useEffect Data Fetching
- No Dispatch Tracking
- If multiple components update the same context, you can't easily trace who did what when.
- Lesson 1696 — Context Limitations: No DevTools
- No encapsulation
- Your dropdown's HTML, CSS, and JavaScript lived in separate files.
- Lesson 8 — Component Reusability Before React
- No exposed endpoints
- Your database queries never become public APIs
- Lesson 1551 — Data Flow: Server Components Have Direct Backend Access
- No hidden complexity
- No side effects, context subscriptions, or timers to worry about
- Lesson 936 — memo with Pure Presentational Components
- No magic
- No hidden subscriptions or re-render surprises
- Lesson 823 — When Prop Drilling is Actually Fine
- No mount/unmount animations needed
- The element stays in the DOM, just changing styles (hover states, focus rings, color shifts).
- Lesson 1978 — When Framer Motion is Overkill
- No mutations
- Don't modify `this.
- Lesson 287 — The render() Method: Class Components' ReturnLesson 758 — Pure Function Requirements
- No naming debates
- ("Do we call this `PrimaryButton` or `MainButton` when importing?
- Lesson 199 — Named Exports vs Default Exports
- No performance concern
- Re-renders on change are acceptable because changes are rare
- Lesson 1690 — Context for Simple App-Wide State
- No Provider
- Atoms are global, shared across the whole app
- Lesson 1727 — The Provider Component (When Needed)
- No request deduplication
- – multiple components trigger duplicate fetches
- Lesson 1345 — Suspense Without a Data Library
- No runtime at all
- Tailwind generates static CSS at build time.
- Lesson 1953 — Tailwind'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 2301 — When Virtualization Isn't Worth It
- No serialization concerns
- You're not converting between formats multiple times
- Lesson 1551 — Data Flow: Server Components Have Direct Backend Access
- No shared UI exists
- Each page has completely different layouts
- Lesson 1842 — When to Nest vs Flatten Routes
- no side effects
- during render—it doesn't modify external variables, make API calls, or change its props.
- Lesson 230 — Props Read-Only Rule and Pure ComponentsLesson 287 — The render() Method: Class Components' ReturnLesson 428 — Render Phase: Pure CalculationLesson 525 — Pure Functions vs Side EffectsLesson 758 — Pure Function Requirements
- No State Inspector
- You can't see the current value of your contexts in a dedicated panel.
- Lesson 1696 — Context Limitations: No DevTools
- No static optimization
- Because styles are in JavaScript, build tools can't extract, deduplicate, or preload them as separate `.
- Lesson 1931 — Performance Tradeoffs: Runtime Style Injection
- No surprises
- Just calculate and return JSX based on current props and state
- Lesson 428 — Render Phase: Pure Calculation
- No synthetic event system
- Uses native browser events directly
- Lesson 28 — Preact: 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 1696 — Context Limitations: No DevTools
- No user impact
- If users can't perceive the slowness, your time is better spent elsewhere
- Lesson 2237 — Tracking vs Fixing: When to Act
- Noise
- 80% of these components don't *care* about `userImage`
- Lesson 820 — The Component Tree Depth Problem
- Non-blocking
- They won't freeze the UI while computing
- Lesson 1457 — Transition Priority: Background Updates That Can Wait
- Non-critical
- The app remains useful even if this feature is temporarily down
- Lesson 1310 — Feature-Level Boundaries
- Non-render code
- Anything that doesn't directly return JSX
- Lesson 2293 — Dynamic Imports Without Suspense
- non-urgent
- , allowing React to keep the UI responsive while the server processes your action.
- Lesson 1607 — Server Actions in Non-Form Contexts: startTransitionLesson 2304 — Basic useTransition Pattern: Search Input Example
- Non-urgent updates (transitions)
- Secondary effects like filtering results, updating charts, or changing views
- Lesson 2302 — What useTransition Does: Marking Updates as Non-Urgent
- not
- `process.
- Lesson 44 — Environment Variables with import.meta.envLesson 656 — Exception: External System SynchronizationLesson 802 — No Provider: Default Context ValueLesson 810 — Context for Truly Global StateLesson 869 — Why Functions Need MemoizationLesson 879 — The Object Dependency ProblemLesson 2050 — Cleanup Between TestsLesson 2115 — What Are Implementation Details? (+2 more)
- Not serializable (breaks)
- Lesson 1540 — The Serialization Boundary
- Not side effects
- Lesson 524 — What is a Side Effect?
- Notifications
- changes very frequently, read only by notification bell
- Lesson 839 — Identifying Independent State Domains
- Now your imports become
- Lesson 210 — Index Files for Cleaner Imports
- Nullish coalescing (`??`)
- applies when the prop is `undefined` *or* `null`.
- Lesson 245 — Default Values vs Nullish Coalescing
O
- Objects and arrays
- compared by reference, not contents
- Lesson 914 — Shallow 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 896 — Why Dependencies Care About References
- Observable
- This is when you'd actually see changes appear in the browser
- Lesson 412 — The 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 624 — Object Dependencies Causing LoopsLesson 1443 — The Basic useDeferredValue Pattern
- Older browsers
- may not handle streamed responses properly
- Lesson 1671 — Streaming SSR Browser Support and Fallbacks
- On first render
- , the wrapper executes your import function, which returns a **Promise**
- Lesson 1348 — What React.lazy() Does Under the Hood
- On interval
- You can configure periodic polling (disabled by default, but easy to enable).
- Lesson 1807 — Automatic Revalidation Strategies
- On the client
- during hydration to attach event handlers and make the page interactive
- Lesson 1524 — Server Components Run Once, Not TwiceLesson 1655 — Common Cause: Browser-Only APIs
- On the server
- to generate initial HTML
- Lesson 1524 — Server Components Run Once, Not TwiceLesson 1613 — Server-Side ValidationLesson 1625 — Server for Data Fetching Without WaterfallsLesson 1655 — Common Cause: Browser-Only APIsLesson 1657 — Common Cause: Conditional Rendering Based on State
- On-demand revalidation
- "Regenerate this specific page right now" (triggered by webhooks, CMS updates, or Server Actions via `revalidatePath`/`revalidateTag`).
- Lesson 1678 — Incremental Static Regeneration (ISR): Hybrid Freshness
- On/Off Switches
- Lesson 339 — Boolean State for Toggles
- Onboarding Friction
- Lesson 1041 — The Cost of Disabling: Maintenance and Debugging
- once
- , immediately after your component finishes its first render and appears in the DOM.
- Lesson 297 — componentDidMount: Side Effects After First RenderLesson 346 — Setting the Same Value Doesn't Re-renderLesson 355 — Complex Initial State ValuesLesson 422 — Observing Batching with Console LogsLesson 851 — Solution 1: useMemo the Context ValueLesson 1524 — Server Components Run Once, Not TwiceLesson 1565 — From Client useEffect to Server async/await
- one
- truth: the state variable
- Lesson 463 — What 'Single Source of Truth' MeansLesson 552 — When Cleanup Runs: Before Re-runLesson 1047 — Naming Conventions: render vs Named PropsLesson 1519 — Async Scripts with Direct SupportLesson 1776 — Automatic Request Deduplication
- one component
- and feed it different data.
- Lesson 223 — Props Enable Component ReusabilityLesson 814 — When NOT to Use Context: Single Consumer
- One level deep maximum
- Lesson 122 — Nesting Ternaries: When It's Acceptable
- one line
- in the Page Object, not fifty scattered test files.
- Lesson 2192 — What the Page Object Pattern SolvesLesson 2199 — Page Objects in CI: Keeping Tests DRY
- one re-render
- at the end.
- Lesson 347 — Multiple setState Calls in One EventLesson 418 — Automatic Batching in Event Handlers
- one render
- for all of them combined.
- Lesson 425 — The Performance Win from BatchingLesson 653 — The Fix: Compute During Render
- Online Babel REPL
- Lesson 82 — Inspecting Compiled JSX Output
- only
- feature that currently *requires* a class component.
- Lesson 295 — When You'll See Classes: Legacy Codebases and Error BoundariesLesson 564 — The Performance Cost of useLayoutEffectLesson 764 — String Literal Types for Action TypesLesson 789 — The Context Object StructureLesson 814 — When NOT to Use Context: Single ConsumerLesson 1371 — Fallback Scope: What Gets ReplacedLesson 2063 — Query Options: exact, normalizer, hidden
- only on the server
- , rendering to a serialized format before any JavaScript reaches the browser.
- Lesson 1527 — No useState, useEffect, or Event HandlersLesson 1576 — Fetching Data Directly in ComponentsLesson 1951 — Server Components Break Runtime CSS-in-JS
- only once
- during the initial mount:
- Lesson 357 — Lazy Initial State with a FunctionLesson 358 — Reading from localStorage at InitializationLesson 420 — Batching Example: Multiple setState CallsLesson 503 — When Default Props Don't UpdateLesson 571 — The Empty Dependency Array PatternLesson 772 — The init Function ParameterLesson 775 — Comparing useState Lazy Init vs useReducer
- Only then
- switch to `useLayoutEffect`
- Lesson 566 — Choosing Between useEffect and useLayoutEffectLesson 2268 — Profiling Before Adding memo
- Only use `useMemo` when
- Lesson 696 — useMemo for Expensive Computations
- Only use this for
- Lesson 1660 — suppressHydrationWarning Prop
- Open/Close Modals
- Lesson 339 — Boolean State for Toggles
- Opt-in children
- means you only install doors where they belong, making the architecture's intent obvious at a glance.
- Lesson 2394 — Children: Opt-In vs Implicit
- Optimistic updates
- instantly update the UI as if the server will succeed, then roll back if it fails.
- Lesson 1802 — Pessimistic vs Optimistic: When to Choose
- Optimistic updates and mutations
- with rollback logic
- Lesson 1482 — When use() Fits vs TanStack Query or Loaders
- Optimize dependencies
- Replace large libraries with lighter alternatives
- Lesson 1421 — Bundle Budget Strategy: Setting Thresholds
- Option 1
- Add a condition inside the effect:
- Lesson 623 — The Classic Infinite Loop: setState in Effect BodyLesson 943 — The Dependency Array Challenge in useCallback
- Option 2
- Use an empty dependency array if you only want it once:
- Lesson 623 — The Classic Infinite Loop: setState in Effect BodyLesson 943 — The Dependency Array Challenge in useCallback
- Option 2: After ejecting
- (if you've run `npm run eject`):
- Lesson 1414 — Setting Up webpack-bundle-analyzer
- Option 2: Inline re-export
- Lesson 1352 — Named Exports with React.lazy()
- Option A: Granular Actions
- Lesson 768 — When to Use Multiple Action Types vs Single with Payload
- Option B: Generic Actions
- Lesson 768 — When to Use Multiple Action Types vs Single with Payload
- Optional override props
- – Test values or partial overrides of the context state
- Lesson 2378 — Typing Provider Component Props
- Order becomes unpredictable
- React doesn't guarantee the order components render in, and it might pause and resume rendering.
- Lesson 527 — Why Side Effects Can't Run During Render
- Organic feel
- Menus that bounce slightly, elements that settle with subtle oscillation
- Lesson 2011 — React Spring for Natural, Physics-Based Motion
- 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 1669 — Out-of-Order Streaming
- Outdated tooling
- as the project became harder to maintain
- Lesson 49 — Create React App: The Legacy Standard
- outside
- the component (if it's static) or **memoize it** with `useMemo` (if it depends on props/state):
- Lesson 634 — The Inline Object AntipatternLesson 996 — Testing Composed Custom HooksLesson 1668 — The onShellReady and onAllReady Callbacks
- outside React's control
- Lesson 656 — Exception: External System SynchronizationLesson 1265 — Form Input Values Resetting
- Overhead reduction
- Paradoxically, the compiler often generates *fewer* memoization wrappers than defensive manual code.
- Lesson 1508 — Compiler vs Manual: Performance Comparison
- override
- just the field(s) you want to change
- Lesson 374 — Functional Updates with ObjectsLesson 1179 — Combining Consumer and Default Reducers
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 2170 — Page Object Model Pattern
- Paint
- = product packaged
- Lesson 433 — The Render-Commit-Effect Timeline VisualizedLesson 529 — When useEffect Runs: After CommitLesson 561 — Why Effects Run After PaintLesson 562 — useLayoutEffect: The Synchronous AlternativeLesson 2016 — The Browser's Rendering PipelineLesson 2017 — Compositor-Only Properties: transform and opacity
- Paint storms
- Excessive paint operations (green blocks)
- Lesson 2021 — Measuring Frame Rate with DevTools
- Panda CSS
- shift style extraction to **build time**.
- Lesson 1931 — Performance Tradeoffs: Runtime Style Injection
- Paragraphs and descriptions
- Lesson 2056 — getByText for Non-Interactive Content
- Parallel
- (Promise.
- Lesson 1568 — Sequential vs Parallel Fetching PatternsLesson 1579 — Sequential vs Parallel Data Fetching
- Parallel data fetching
- for nested routes before rendering
- Lesson 1482 — When use() Fits vs TanStack Query or LoadersLesson 1592 — Promises as Props (React 19+)
- Parallel fetching
- happens when you start all fetches simultaneously:
- Lesson 1579 — Sequential vs Parallel Data Fetching
- Parameter annotation
- Tell TypeScript the destructured props match that interface
- Lesson 2329 — Basic 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 1793 — Mutation Callbacks: onSuccess, onError, onSettled
- parent component
- .
- Lesson 228 — Props vs State: Who Owns the DataLesson 232 — Basic Callback PatternLesson 1078 — The Parent + Children Relationship
- Parent creates provider
- `<Dialog>` renders a context provider with state like `open`, `setOpen`, `triggerId`
- Lesson 1101 — Context-Based State Sharing in Radix
- Parent provides
- the root component (`Tabs`) wraps children with `Provider`
- Lesson 1090 — Creating a Private Context for Compound Components
- Parent rendered
- Whether this was just a cascade from a parent re-rendering
- Lesson 2225 — Comparing Renders: Why Did This Update Happen?
- Parse time
- The browser must read and understand all that code
- Lesson 1556 — The Traditional SPA Performance Problem
- Parse Time (CPU)
- Lesson 1412 — Why Bundle Size Matters: Performance Impact
- Parsing cost
- JavaScript must parse your style definitions at runtime.
- Lesson 1931 — Performance 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 200 — File Naming Conventions
- Pass 1 (Server)
- Generates static HTML that's sent to the browser immediately
- Lesson 1643 — The 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 1643 — The Two-Pass Process: Server Render, Then Client Hydrate
- Pass to client
- Send the dehydrated state as props to your page component
- Lesson 1820 — Prefetching tRPC Queries on the Server
- Passing arguments
- You can't directly pass arguments in `onClick={func}` syntax
- Lesson 235 — The onClick={() => func()} Pattern
- Passing props through
- If you're spreading remaining props (`{.
- Lesson 244 — Destructuring vs Direct Access Tradeoffs
- Pattern 2: Interface Extends
- Lesson 2336 — Extending Native HTML Element Props
- Pause
- work if something more important comes up (like user input)
- Lesson 409 — Fiber: React's Internal Reconciliation EngineLesson 1455 — The Interruptible Render: What Makes Concurrent Mode Different
- Payment processing
- Does clicking "Pay" trigger the right API call, process through Stripe, update your database, and show confirmation?
- Lesson 2185 — E2E Tests for Integration Points
- Per-chunk targets
- Route chunks over 75KB trigger investigation.
- Lesson 1421 — Bundle Budget Strategy: Setting Thresholds
- perceived performance
- .
- Lesson 1634 — Introduction to renderToPipeableStreamLesson 1669 — Out-of-Order Streaming
- perfect
- React keys because they're stable, unique, and persistent.
- Lesson 173 — UUIDs and Database IDs as Ideal KeysLesson 1247 — Stable Keys from Server Data: Using IDsLesson 1677 — SSG Trade-offs: Speed vs FreshnessLesson 1777 — Request Deduplication Window
- Perfect for
- Medium-sized apps, teams wanting productivity without complexity, projects that outgrew Context but don't need Redux's ceremony.
- Lesson 1718 — Zustand vs Context vs Redux: The Tradeoffs
- Perform complex transformations
- (heavy calculations, data parsing)
- Lesson 1311 — Component-Level Boundaries for Risky Code
- Performance
- Reusing instances is faster than destroying and recreating
- Lesson 151 — Keys Preserve Component IdentityLesson 230 — Props Read-Only Rule and Pure ComponentsLesson 417 — What is Batching and Why It MattersLesson 583 — When Ignore Flags Aren't EnoughLesson 642 — Client-Side Fetching: The Hidden CostLesson 817 — Local Context for Component SubtreesLesson 1133 — Optional Slots with Conditional RenderingLesson 1691 — Context for Feature- Scoped State (+4 more)
- Performance compromises
- where you can't share state without triggering unwanted updates
- Lesson 2328 — When to Move to External State
- Performance cost
- Stringifying large objects on every render is expensive
- Lesson 639 — JSON.stringify as a Last ResortLesson 1012 — Why Hooks Can't Use Names or IDs
- Performance critical apps
- Fine-grained control over re-renders
- Lesson 816 — Context vs State Management Libraries
- Performance optimization
- Use `useMemo` and `useCallback`
- Lesson 328 — Should You Write New Class Components?Lesson 447 — The Performance Cost of flushSync
- Performance profiling
- Measuring actual impact by comparing optimized vs unoptimized
- Lesson 1507 — The 'use memo' Directive (Opt-Out)
- Performance suffers
- (changes trigger unnecessary re-renders in unrelated parts of the tree)
- Lesson 1681 — Colocation: 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 1941 — When vanilla-extract Fits Best
- Performance-critical scenarios
- Mobile devices, high-frequency updates, or animations running constantly.
- Lesson 1978 — When Framer Motion is Overkill
- Persistent UI
- parent elements stay mounted while children swap
- Lesson 1831 — What 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 1674 — Server-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 1675 — SSR Trade-offs: Server Cost vs Time-to-Content
- Pessimistic updates
- wait for the server to confirm success before updating the UI.
- Lesson 1802 — Pessimistic vs Optimistic: When to Choose
- Plain `.map()`
- Every item should render, no filtering or flattening needed
- Lesson 149 — Alternatives to .map(): .filter() and .flatMap()
- Plain CSS with BEM
- Lesson 1907 — CSS Modules vs Plain CSS
- Playback controls
- Pause, reverse, restart, or seek anywhere
- Lesson 2000 — Why GSAP for React: Imperative Animation Power
- Plugin not in dependencies
- Check `package.
- Lesson 1024 — Integration with Modern Tooling (Vite, Next.js)
- Plugins
- Extensions that add functionality (like JSX transformation)
- Lesson 42 — vite.config.js: Build Configuration
- plus
- animation props that Framer Motion provides.
- Lesson 1966 — Installing Framer Motion and Basic SetupLesson 2082 — Resetting and Restoring MocksLesson 2336 — Extending Native HTML Element Props
- Polling
- that stops/starts based on app state
- Lesson 1746 — Middleware-Heavy Workflows: Sagas, Observables, Complex Async
- Poor examples
- Lesson 983 — The useX Naming Pattern
- Poor naming (implementation-focused)
- Lesson 205 — Component Naming for Clarity
- position
- in the tree structure, not by variable names or references—same spot means same state, different spot means fresh state.
- Lesson 365 — Position in the Tree Determines State IdentityLesson 978 — Multiple Hooks of the Same Type Are FineLesson 1010 — The Call Order InvariantLesson 1258 — The Sorting Problem with Index KeysLesson 1271 — Index-as-Key Reordering Bug
- Position with transforms
- Use CSS positioning to place visible items at their correct scroll position
- Lesson 1276 — What Virtualization Is: Render Only Visible Items
- Post-submission redirects
- After creating a resource, send users to the new item's detail page
- Lesson 1856 — Programmatic Navigation with useNavigate
- Pre-compiler codebases
- Legacy optimizations that worked around old React limitations might outperform compiler output until refactored
- Lesson 1508 — Compiler vs Manual: Performance Comparison
- Precise failure diagnosis
- When a hook test fails, you know the problem is in the hook itself
- Lesson 2095 — Why Testing Hooks in Isolation Matters
- Predictability
- If children could modify props, the parent wouldn't know what values it passed
- Lesson 224 — Props Are Immutable in ReactLesson 230 — Props Read-Only Rule and Pure ComponentsLesson 1750 — State Machines vs Ad-Hoc StateLesson 2075 — Why Module Mocking is Necessary in Tests
- predictable
- and **testable**.
- Lesson 179 — Components are Pure Functions of PropsLesson 1249 — Composite Keys for Nested Lists
- Predictable chunks
- One route = one chunk = easy mental model
- Lesson 1423 — Route-Level Splitting: The Sweet Spot
- Predictable output
- Same props always produce the same UI
- Lesson 936 — memo with Pure Presentational Components
- Predictable state
- Always know what's in the input by checking state
- Lesson 1195 — Controlled Forms: Single Source of Truth Principle
- Predictable state transitions
- based on action types
- Lesson 751 — When You'd Reach for Redux but It's Overkill
- Predictable structure
- URL paths mirror component nesting
- Lesson 1831 — What Nested Routes Are and Why They Matter
- Predictable Updates
- One `dispatch(action)` flows through all reducers.
- Lesson 1743 — Large-Scale Apps with Many Interconnected Features
- Prefetching
- means loading chunks *in advance* during idle time.
- Lesson 2290 — Prefetching Split Chunks
- Preload
- the lazy component when the user *hovers* over the button or link, but before they click.
- Lesson 1356 — Preloading Lazy Components on Hover
- Presentation is unpredictable
- You're building reusable logic but have no idea how consumers will display the data.
- Lesson 1052 — When Render Props Add Value
- Preserve component state
- (useState, focus, scroll position)
- Lesson 1254 — Keys and React's Reconciliation Algorithm
- Preserve context during transitions
- If your loading fallback shows "Loading user profile.
- Lesson 1320 — Loading-to-Error Transition Design
- Preserved Layouts
- The most sophisticated approach maintains the overall page structure.
- Lesson 1342 — The fallback Prop: Spinners and Skeletons
- Preserving return-to URLs
- means remembering their original destination and completing their interrupted trip.
- Lesson 1870 — Preserving Return-To URLs
- Prevent it entirely
- by returning the current state unchanged
- Lesson 1181 — Common Use Cases: Preventing Transitions
- Preventing immediate execution
- Writing `onClick={func()}` calls the function right away during render, not when clicked
- Lesson 235 — The onClick={() => func()} Pattern
- Preventing stale data bugs
- without manual refetch logic
- Lesson 1807 — Automatic Revalidation Strategies
- Prevents
- re-insertion if the same script is rendered by different components
- Lesson 1519 — Async Scripts with Direct Support
- Prevents the silent bugs
- from hook call order misalignment before they reach production
- Lesson 1017 — What eslint-plugin-react-hooks Does
- previous state
- (`prev`)
- Lesson 374 — Functional Updates with ObjectsLesson 1485 — Action Functions and State UpdatesLesson 1616 — useFormState for Server Responses
- primitives
- (numbers, strings, booleans) versus **references** (objects, arrays, functions).
- Lesson 878 — Primitive vs Reference DependenciesLesson 896 — Why Dependencies Care About ReferencesLesson 914 — Shallow Equality Explained: Object.is on PropsLesson 1552 — Prop Serialization Across the Boundary
- Primitives compare by value
- Lesson 878 — Primitive vs Reference Dependencies
- Prioritize
- urgent updates over less critical ones
- Lesson 409 — Fiber: React's Internal Reconciliation EngineLesson 1367 — The Streaming SSR Connection
- Prioritize optimizations
- You know exactly where your effort will have impact.
- Lesson 2213 — Filtering Commits by Duration Threshold
- Privacy policy sections
- (numbered clauses that never reorder)
- Lesson 1257 — Index Keys in Read-Only Lists
- Process user-uploaded data
- (parsing files, handling complex input)
- Lesson 1311 — Component-Level Boundaries for Risky Code
- Product details section
- (image, title, price) — loads together
- Lesson 1380 — Finding the Right Granularity
- Product pages
- Individual product details that are stable
- Lesson 1677 — SSG Trade-offs: Speed vs Freshness
- production
- , you'll see **one log per render**—the real count.
- Lesson 414 — Console Logs and Render CountingLesson 2207 — Installing and Opening the React DevTools Profiler
- Production complaints
- Real users report sluggishness in specific workflows
- Lesson 2237 — Tracking vs Fixing: When to Act
- Production optimization
- Manually configure minification, code splitting, and bundling strategies
- Lesson 54 — Webpack from Scratch
- Profile again
- Repeat the same interaction.
- Lesson 930 — Profiling Before and After memoLesson 2247 — Profiling to Confirm the ProblemLesson 2277 — When to Profile Before Optimizing
- Profile first, optimize later
- Lesson 695 — Expensive Computation Without Memoization
- Profile without `memo`
- Record a typical user interaction.
- Lesson 930 — Profiling Before and After memo
- Profile/detail views
- Clear data when switching between users/products
- Lesson 692 — Refactoring Effect-Based Syncing to Key Prop
- Profiler
- is your performance detective.
- Lesson 70 — Profiler Tab: Recording Performance SessionsLesson 176 — Profiling Key-Related Performance IssuesLesson 416 — Visualizing Renders with React DevTools ProfilerLesson 886 — Profiling Before OptimizingLesson 918 — Demonstrating Skipped Renders with DevTools ProfilerLesson 1227 — Performance Comparison: RHF vs ControlledLesson 1274 — Debugging Key-Related IssuesLesson 1462 — Identifying Heavy Renders with Profiler (+2 more)
- Profiler recordings
- one before splitting contexts, and one after.
- Lesson 844 — Measuring Impact with React DevTools Profiler
- Profiler shows
- multiple components updating when only one needed to
- Lesson 951 — Identifying Over-Hoisted State
- 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 1154 — The Flexibility vs Simplicity Tradeoff
- progressive enhancement
- start with something that works everywhere (basic HTML), then optionally add JavaScript for a nicer experience.
- Lesson 32 — Simple Forms and Progressive EnhancementLesson 1058 — Combining Function Children with Other PropsLesson 1086 — Advantages Over Monolithic ComponentsLesson 1611 — The action Prop on FormsLesson 1639 — Server-Side HTML Structure and Scripts
- 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 1649 — Progressive Hydration: Hydrating on Interaction
- Progressive Rendering
- As chunks of HTML arrive, browsers start parsing and displaying them immediately.
- Lesson 1641 — renderToString vs renderToPipeableStream: The Modern ChoiceLesson 1664 — renderToPipeableStream for Node.js
- Progressive web apps
- Where offline cache size matters
- Lesson 28 — Preact: React's Lightweight Alternative
- Promise
- Lesson 1348 — What React.lazy() Does Under the HoodLesson 1385 — Dynamic import() SyntaxLesson 2059 — findBy for Async ElementsLesson 2060 — getAllBy, queryAllBy, findAllBy for Multiple Elements
- Prop conditions
- Render `sidebar` only if `showSidebar` prop is true
- Lesson 1143 — Conditional Rendering of Prop Content
- 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 266 — What is Prop Drilling?Lesson 267 — A Simple Drilling ExampleLesson 777 — The Global State Problem That useReducer + Context SolvesLesson 787 — What is Context and Why It ExistsLesson 1700 — The Problem of Shared State Across Distant Components
- Prop drilling hell
- Pass every piece of state down through multiple levels
- Lesson 1077 — What Are Compound Components?
- prop explosion
- when a component becomes a Swiss Army knife of configuration options.
- Lesson 196 — Component Composition vs Prop ExplosionLesson 1106 — Why These Libraries Choose Compound Patterns
- Prop getters
- are functions that return a pre-configured object of props.
- Lesson 1164 — What is the Prop Getters Pattern?Lesson 1173 — When Prop Getters Beat Component SlotsLesson 1183 — What 'Headless' Means: Logic Without Styling
- Prop name
- in camelCase (like regular JavaScript variables)
- Lesson 213 — Basic 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 1973 — Variants: Named Animation States
- Props
- All data passed down to this component from its parent
- Lesson 68 — Components Tab: Inspecting the Component TreeLesson 228 — Props vs State: Who Owns the DataLesson 937 — Context Updates: memo Doesn't Stop ThoseLesson 1304 — Error Boundary Props and CustomizationLesson 1504 — The Compiler's Mental Model: Reactive DependenciesLesson 2036 — The Mental Model: Black Box Testing
- Props are grouped together
- React bundles them into a single object, the second argument to `createElement`
- Lesson 219 — Props vs Attributes: JSX Transformation
- Props are passed down
- through components that don't read them (prop drilling to one branch)
- Lesson 951 — Identifying Over-Hoisted State
- Props changes
- Which props received new values (and what those values were)
- Lesson 2225 — Comparing Renders: Why Did This Update Happen?
- Props interface
- Define the shape of your props object
- Lesson 2329 — Basic Function Component Type Annotation
- Pros
- Easy to find "all components" or "all hooks"
- Lesson 60 — Feature-Based vs Layer-Based OrganizationLesson 1207 — The Single State Object PatternLesson 1213 — Multi-Step Forms with Shared State
- Protected Routes
- Navigate directly to routes that require authentication while logged out.
- Lesson 2189 — E2E for Authentication and Authorization Flows
- Prototyping and small applications
- The developer experience advantage is real.
- Lesson 1955 — When Runtime CSS-in-JS Still Makes Sense
- Provider
- is a component that wraps part of your tree and supplies a value.
- Lesson 789 — The Context Object Structure
- provider component
- that does the actual work.
- Lesson 779 — The Provider Component PatternLesson 1111 — Building the Context Provider
- Pseudo-classes
- like `:hover`, `:focus`, or `:active` don't work.
- Lesson 1897 — What You Can't Do with Inline Styles
- Pseudo-elements
- like `::before` and `::after` are impossible.
- Lesson 1897 — What You Can't Do with Inline Styles
- pure
- Lesson 754 — Reducer Function: (state, action) => newStateLesson 1300 — static getDerivedStateFromError
- pure function
- is predictable: given the same inputs, it always returns the same result.
- Lesson 179 — Components are Pure Functions of PropsLesson 407 — Pure Functions: Why Components Must Be PureLesson 525 — Pure Functions vs Side EffectsLesson 698 — Extracting Computation Outside the ComponentLesson 776 — Common Pattern: Reusable Init Functions
- Pure functions
- Components should behave like pure functions—same inputs (props) always produce the same output (UI)
- Lesson 224 — Props Are Immutable in ReactLesson 230 — Props Read-Only Rule and Pure ComponentsLesson 413 — Strict Mode's Double-Render BehaviorLesson 2190 — Unit Tests for Pure Functions and Hooks
- pure logic
- (state, effects, calculations)
- Lesson 1076 — Choosing the Right Pattern for Your APILesson 2190 — Unit Tests for Pure Functions and Hooks
- Pure reducer
- Lesson 758 — Pure Function Requirements
Q
- Query functions
- like `getByText`, `queryByRole`, `findByLabelText`—tools to locate elements the way users would
- Lesson 2043 — The render Function from RTL
- query keys
- unique identifiers for each piece of data (like `['user', userId]`).
- Lesson 606 — TanStack Query's Automatic Caching and DeduplicationLesson 1811 — Migration Considerations: SWR to TanStack Query
- Quick prototypes
- where setup time matters more than build optimization
- Lesson 53 — Parcel: Zero-Config Bundler
- Quick returns
- If a user navigates back within `cacheTime`, the data is *instantly* available (even if stale)
- Lesson 1783 — The 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 578 — What Race Conditions Are in Data FetchingLesson 579 — The Fast-Click Search Box ProblemLesson 672 — Testing Render vs Effect Approaches
- Race condition prevention
- (ignore flags or `AbortController`)
- Lesson 605 — The Problem with Manual useEffect Data Fetching
- race conditions
- whichever fetch finishes last wins, regardless of which request was made most recently.
- Lesson 574 — The Stale Closure ProblemLesson 577 — Why This Pattern is Problematic at ScaleLesson 1345 — Suspense Without a Data Library
- Racing conditions
- (take the first response, ignore others)
- Lesson 1746 — Middleware-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 1107 — Comparing API Styles: Radix vs Headless UI
- Ranked chart
- A sorted list of slowest components first
- Lesson 416 — Visualizing Renders with React DevTools ProfilerLesson 2210 — Reading the Ranked Chart ViewLesson 2224 — Ranked Chart: Finding the Slowest ComponentsLesson 2270 — Measuring Render Count vs Render Time
- Rapid state changes
- Interrupting FLIP calculations before completion
- Lesson 1987 — Layout Animation Performance
- Rare usage
- If you only use a prop once deep in the function, destructuring it upfront feels premature.
- Lesson 244 — Destructuring vs Direct Access Tradeoffs
- Rarely changes
- (configuration): `staleTime: Infinity` (never stale)
- Lesson 1774 — Cache Staleness: staleTime Explained
- Rarely changing data
- (site configuration, user preferences)
- Lesson 1782 — The staleTime ConfigurationLesson 2257 — Comparing Context Overhead to Alternatives
- Re-mounts the component tree
- , giving it a fresh attempt to render
- Lesson 1324 — The resetErrorBoundary Function
- Re-triggered effects
- (useEffect cleanup and re-run)
- Lesson 1245 — Why Keys Must Be Stable Across Renders
- React batches state updates
- in event handlers and lifecycle methods.
- Lesson 384 — Performance: Object vs Multiple Variables
- React compares it
- to the previous Virtual DOM (this comparison is called "diffing")
- Lesson 12 — The Virtual DOM Concept
- React components instead
- Lesson 1919 — The @apply Directive: When and Why
- React DevTools Profiler
- is your measurement tool.
- Lesson 844 — Measuring Impact with React DevTools ProfilerLesson 930 — Profiling Before and After memo
- React elements
- (directly—though Server Components as children works differently)
- Lesson 1552 — Prop Serialization Across the Boundary
- React Hook Form
- 0 React component re-renders (only DOM updates)
- Lesson 1227 — Performance Comparison: RHF vs Controlled
- React re-renders
- , feeding the new state back to `value`
- Lesson 465 — Controlled: State Drives the DOM
- React reconciliation cost
- Every re-render must diff thousands of elements
- Lesson 2295 — The Problem Virtualization Solves
- React Router
- handles navigation state and URL parameters through hooks like `useNavigate` and `useParams`.
- Lesson 1004 — When Framework Libraries Obviate Custom Hooks
- React Runtime
- Always present if you have *any* Client Components or interactivity.
- Lesson 1534 — What 'No JS' Really Means: The Nuance
- React Server Components
- Fetch directly in the component body (if using RSC)
- Lesson 648 — Migration 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 1368 — Client-Only Apps: Limited Suspense UtilityLesson 1932 — Migration Path: When to Consider Alternatives
- React Spring
- Best when the animation needs to *feel physical* rather than *look designed*
- Lesson 2011 — React Spring for Natural, Physics-Based Motion
- React Transition Group
- that handle this delay logic for you.
- Lesson 1965 — Limitations: No Mount/Unmount Animations
- react-window
- (by Brian Vaughn) was the go-to library for list virtualization.
- Lesson 1284 — Virtualization with react-window (Legacy)Lesson 2296 — React Window vs React Virtualized
- React.lazy() wraps it
- in a component that manages loading states
- Lesson 1348 — What React.lazy() Does Under the Hood
- React's advantage
- Better performance in *complex* applications with frequent, large-scale updates.
- Lesson 25 — Svelte: Compile-Time Reactivity
- ReactElement
- is more strict — it only accepts actual JSX elements (not primitives like strings or numbers).
- Lesson 1135 — Type Safety for Slot PropsLesson 2338 — Typing Component Return Values
- ReactNode
- is the most permissive — it accepts anything renderable: strings, numbers, JSX elements, arrays, fragments, or even `null`.
- Lesson 1135 — Type Safety for Slot PropsLesson 2338 — Typing Component Return Values
- Read
- that variable's current value
- Lesson 329 — What useState Does: Adding State to Function Components
- Read the ref values
- inside the submit handler to access what the user typed
- Lesson 516 — Form Submission Basics with Uncontrolled Inputs
- read-only
- .
- Lesson 466 — Why onChange is Required with valueLesson 2364 — RefObject vs MutableRefObjectLesson 2383 — Typing useRef: Mutable Values vs DOM Refs
- Readability
- Named variables act as inline documentation
- Lesson 124 — Extracting Ternaries to Variables for ClarityLesson 133 — When to Extract to Helper FunctionsLesson 186 — Early Returns for Conditional LogicLesson 269 — When Drilling Isn't a ProblemLesson 384 — Performance: Object vs Multiple VariablesLesson 907 — The Readability Tax
- Readability suffers
- from cramming too much inline
- Lesson 187 — Inline 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 1000 — When Single-Component Logic Should Stay Inline
- Real-Time Data
- The HTML contains fresh data from *that moment*.
- Lesson 1674 — Server-Side Rendering (SSR): HTML on Every RequestLesson 1726 — Atom Families for Dynamic CollectionsLesson 1782 — The staleTime Configuration
- Real-time updates
- A chat interface, live notifications, or a stock ticker require continuous client-side connections (WebSockets, polling, or subscriptions).
- Lesson 1573 — Client-Side Data Fetching Still Exists
- Real-time-ish data
- (social feeds, dashboards, notifications)
- Lesson 1807 — Automatic Revalidation Strategies
- Real-world validation
- If the test passes but users can't see the change, the test would catch it
- Lesson 2038 — Avoiding Direct State and Props Assertions
- Reason for re-render
- (props change, hook change, or parent render)
- Lesson 2234 — Reading the Console Output
- receive
- and use it.
- Lesson 249 — Receiving Children in ComponentsLesson 364 — State is Owned by the Component That Declares It
- Receives
- The `initialArg` (second parameter to `useReducer`)
- Lesson 773 — init Function Signature and Arguments
- Receives email's stored value
- Lesson 1009 — Why Conditional Hooks Break Everything
- reconciliation
- a clever diffing algorithm.
- Lesson 7 — The Performance Cost of Naive Re-renderingLesson 13 — Reconciliation: React's Diffing AlgorithmLesson 150 — What the Key Prop Actually DoesLesson 171 — How Stable Keys Enable ReconciliationLesson 408 — The Virtual DOM (Reconciliation)Lesson 1254 — Keys and React's Reconciliation Algorithm
- Reconciliation time
- for child components
- Lesson 1197 — Performance Implications: Re-renders on Every Keystroke
- Recovery options
- – Retry this component vs navigate away vs reload everything
- Lesson 1316 — Contextual 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 1874 — Common Pitfalls: Redirect Loops and Flash
- reduce network requests
- (debouncing prevents API calls on every keystroke)
- Lesson 1451 — The Debounce AlternativeLesson 2305 — Deferring vs Debouncing: When Each Fits
- Reducer processes it
- Your slice's reducer updates the state
- Lesson 1737 — Dispatching Actions with useDispatch
- reducers
- An object where each key becomes both a reducer case AND an auto-generated action creator
- Lesson 1732 — Slices: State + Reducers + Actions TogetherLesson 1748 — Strict Architectural Boundaries and Testability
- Redux's cost
- More files, more boilerplate, steeper learning curve.
- Lesson 1718 — Zustand vs Context vs Redux: The Tradeoffs
- ref
- is like a box that holds a mutable value in its `.
- Lesson 398 — useRef for Mutable Current ValuesLesson 490 — What Are Uncontrolled Components?Lesson 708 — Common Use Case: Avoiding Stale ClosuresLesson 1196 — Uncontrolled Forms: Letting the DOM Manage State
- Refactor confidence
- Change internal logic freely without breaking tests
- Lesson 2038 — Avoiding Direct State and Props Assertions
- Refactoring becomes risky
- (adding a prop means touching 5 files)
- Lesson 809 — The Prop Drilling Threshold
- Refactoring confidence
- Rename an action type and find all uses instantly
- Lesson 762 — TypeScript: Discriminated Unions for ActionsLesson 2095 — Why Testing Hooks in Isolation Matters
- Refactoring Landmines
- Lesson 1041 — The Cost of Disabling: Maintenance and Debugging
- Refactoring Safety
- You can change the internal implementation (maybe switch from Context to another solution) without touching every component.
- Lesson 780 — Custom Hooks for Consuming State and Dispatch
- Refactoring tools work better
- (rename refactoring updates all imports automatically)
- Lesson 199 — Named Exports vs Default Exports
- reference
- , not by content.
- Lesson 628 — Missing Memoization on Complex DependenciesLesson 633 — Why Objects in Dependencies Cause Re-runsLesson 2271 — The Shallow Equality Check
- reference equality
- (`===`).
- Lesson 879 — The Object Dependency ProblemLesson 1096 — Context Memoization in Compound ComponentsLesson 1896 — Performance Cost of Inline Styles
- reference inequality
- .
- Lesson 2234 — Reading the Console OutputLesson 2240 — Identifying Object Creation in Props
- references
- two objects with identical contents but different memory locations are considered different.
- Lesson 612 — What the Dependency Array Actually DoesLesson 878 — Primitive vs Reference DependenciesLesson 2271 — The Shallow Equality Check
- References compare by identity
- Lesson 878 — Primitive vs Reference Dependencies
- referential equality
- literally asking "is this the exact same thing in memory?
- Lesson 541 — Object and Array Dependencies: Equality by ReferenceLesson 827 — How Context Triggers Re-rendersLesson 2252 — The Object-Value Reference Trap in Providers
- Referential equality chains
- Memoizing one component often requires memoizing everything it touches.
- Lesson 1502 — The Manual Memoization Problem
- Refetching
- Keys decide which queries update when data changes
- Lesson 1771 — Query Keys: The Cache Identifier
- refs
- come in.
- Lesson 491 — Creating a Ref with useRefLesson 498 — Refs Don't Trigger Re-rendersLesson 722 — When to Use Refs vs State for DOM Interaction
- Regexes
- shine for case-insensitive matching (`/submit/i`) or partial matches (`/loading/i` finds "Loading.
- Lesson 2062 — TextMatch: String, Regex, and Function
- regression detector
- .
- Lesson 2039 — The Cost of Testing ImplementationLesson 2105 — Why Implementation Tests Are Brittle
- Regular expression
- `/submit/i` finds "Submit", "submit", "SUBMIT"
- Lesson 2062 — TextMatch: 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 379 — The Single Object Approach: Pros and Cons
- Remix
- , you export a `loader` function:
- Lesson 645 — SSR with Loaders: Next.js and Remix PatternsLesson 1345 — Suspense Without a Data LibraryLesson 1512 — Compiler Adoption Timeline and Stability
- Remove now-unused dependencies
- from your component
- Lesson 662 — Refactoring: From Effect to Direct Call
- Remove state declarations
- for form values
- Lesson 1203 — Migration Strategy: Converting Between Approaches
- Removing items
- Filter out the item by its ID from the cached array.
- Lesson 1798 — Optimistic Updates for Lists
- Removing items from lists
- If a list item component is removed, any state it held is gone forever.
- Lesson 363 — Unmounting Destroys State
- Render
- You sketch what the room will look like in blue
- Lesson 348 — The Re-render Lifecycle FlowLesson 433 — The Render-Commit-Effect Timeline VisualizedLesson 561 — Why Effects Run After PaintLesson 1405 — Lazy Loading on Click or Hover
- Render 1
- Props change → Component renders with old derived state → Effect runs → Updates derived state
- Lesson 670 — The Stale State Problem with useEffect
- Render 2
- Component re-renders with the *now-updated* derived state from the previous render
- Lesson 670 — The Stale State Problem with useEffect
- Render count
- per component
- Lesson 844 — Measuring Impact with React DevTools ProfilerLesson 2215 — Component Render Count and Duration TotalsLesson 2270 — Measuring Render Count vs Render TimeLesson 2273 — Profiling After Adding memoLesson 2278 — Using React DevTools Profiler with MemoizationLesson 2282 — Profiling Before and After Memoization
- Render count drops significantly
- Lesson 2314 — Before/After: State at Root vs State in Subtree
- Render delay
- On first render, `activeProducts` is `[]`, then the effect runs and triggers a *second* render with the filtered list
- Lesson 651 — Example: Filtering Props in an Effect
- Render duration
- How many milliseconds each component's render phase took
- Lesson 416 — Visualizing Renders with React DevTools ProfilerLesson 1462 — Identifying Heavy Renders with ProfilerLesson 2269 — Reading Profiler FlamegraphsLesson 2278 — Using React DevTools Profiler with MemoizationLesson 2282 — Profiling Before and After Memoization
- Render only those items
- Create DOM elements for maybe 15-30 items instead of thousands
- Lesson 1276 — What Virtualization Is: Render Only Visible Items
- Render Phase
- React calls your component function to figure out *what should be on screen*.
- Lesson 405 — Rendering vs Committing: The Two-Phase ProcessLesson 407 — Pure Functions: Why Components Must Be PureLesson 412 — The Commit Phase: Applying Changes to the DOMLesson 415 — Why Renders Are Usually FastLesson 428 — Render Phase: Pure CalculationLesson 429 — Commit Phase: Applying Changes to the DOMLesson 431 — Why Effects Can't Run During RenderLesson 434 — Why State Updates Don't Appear Immediately (+6 more)
- render prop
- is a pattern where you pass a *function* as a prop to a component.
- Lesson 275 — What is a Render Prop?Lesson 276 — Basic Render Prop ImplementationLesson 1042 — What is a Render Prop?Lesson 1103 — Headless UI's Render Prop Alternative
- Render Props
- Pass functions around, creating deeply nested JSX
- Lesson 313 — Hooks Enable Logic ExtractionLesson 954 — Component Composition Over memoLesson 1049 — Render Props vs HOCs for Logic SharingLesson 1070 — The Historical Context: Why Render Props ExistedLesson 1136 — Slots vs Render Props: The TradeoffLesson 1144 — JSX Props vs Render PropsLesson 1146 — Three Ways to Inject Content: A ComparisonLesson 1153 — What is Inversion of Control in React? (+3 more)
- Render Props (Function Signatures)
- Lesson 1151 — Type Safety Across Patterns
- Render props excel when
- Lesson 1049 — Render Props vs HOCs for Logic Sharing
- render props pattern
- solved the problem of sharing stateful logic between components.
- Lesson 322 — From Render Props Pattern to Custom HooksLesson 798 — The Legacy Context.Consumer PatternLesson 1231 — The <Formik> Component and Render Props
- Render reasons
- Tags like "State change," "Props change," or "Parent rendered"
- Lesson 416 — Visualizing Renders with React DevTools Profiler
- Render Time
- How long each individual render takes
- Lesson 2270 — Measuring Render Count vs Render TimeLesson 2273 — Profiling After Adding memo
- Render time got worse
- (the memo check is more expensive than the render)
- Lesson 2276 — When NOT to Use memo: Profiling Says No
- Render timing
- Prepare everything together, serve the complete sandwich once
- Lesson 693 — When 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 41 — main.jsx: The React Bootstrap
- Render untrusted content
- (markdown, user HTML)
- Lesson 1311 — Component-Level Boundaries for Risky Code
- Render-time computation
- Lesson 672 — Testing Render vs Effect Approaches
- Render-Time Flexibility
- Lesson 1073 — Hooks Can't Replace All Render Props Use Cases
- Render/Commit/Paint
- = Taking your order, cooking it, and serving it to your table
- Lesson 561 — Why Effects Run After Paint
- Rendered DOM
- What actually appears on screen (text, buttons, images)
- Lesson 2036 — The Mental Model: Black Box Testing
- Rendering
- The actors perform the scene again
- Lesson 411 — Render Does Not Mean DOM UpdateLesson 2141 — Testing Reset FunctionalityLesson 2305 — Deferring vs Debouncing: When Each Fits
- Rendering based on props
- Does your component show different content when you pass `isLoading={true}` vs `isLoading= {false}`?
- Lesson 2184 — Unit Tests for Component Logic
- Repeated cleanup logic
- (like clearing intervals or removing listeners)
- Lesson 992 — Extracting Shared Logic from Multiple Custom Hooks
- Repeated patterns
- components re-rendering unnecessarily multiple times
- Lesson 71 — Reading Profiler Flamegraphs
- Repetitive
- The same 10+ props get copied everywhere
- Lesson 1165 — The 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 349 — State Updates Don't MergeLesson 1712 — The set Function: Merging and Replacing
- Replace `defaultValue` with `value`
- (never have both!
- Lesson 1203 — Migration Strategy: Converting Between Approaches
- Replace `onChange` handlers
- with `ref` access
- Lesson 1203 — Migration Strategy: Converting Between Approaches
- Replace index keys
- If items reorder, filter, or insert, `key={index}` will cause issues.
- Lesson 161 — Debugging Key-Related Issues
- replaces
- the old state value with the new one completely.
- Lesson 349 — State Updates Don't MergeLesson 1868 — Using Navigate for Redirects
- Replay scenarios
- Jump to any point in your app's history and watch it play forward
- Lesson 1744 — Time-Travel Debugging and Audit Requirements
- Request
- changes by calling callbacks the parent provides
- Lesson 364 — State is Owned by the Component That Declares It
- Request correlation
- Link actions to API calls
- Lesson 769 — Meta Fields: Adding Timestamps, IDs, or Metadata
- Request deduplication
- across your entire app
- Lesson 1482 — When use() Fits vs TanStack Query or Loaders
- Request IDs
- for tracking which API call is the latest
- Lesson 707 — Common Use Case: Counters and FlagsLesson 769 — Meta Fields: Adding Timestamps, IDs, or Metadata
- Reset functionality
- automatic retry mechanisms
- Lesson 1322 — Installing and Basic Setup of react-error-boundary
- Resetting
- means clearing the error state so the component tree can try rendering again.
- Lesson 1305 — Resetting Error Boundaries
- Resilience
- Tests survive refactors that don't change behavior
- Lesson 2103 — The 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 1683 — Form State: Almost Always Local
- Resolution Phase
- Either success (render data) OR failure (throw error → Error Boundary catches it)
- Lesson 1320 — Loading-to-Error Transition Design
- Resolve the outcome
- Either confirm the optimistic state (on success) or roll it back (on error)
- Lesson 1498 — The Optimistic State Pattern
- Responsive feedback
- With fixed durations, faster interactions feel sluggish (waiting for the full duration) and slower interactions feel rushed.
- Lesson 1990 — Why Physics-Based Animation vs Keyframe/Duration
- Responsive layouts
- Breakpoint changes trigger smooth repositioning
- Lesson 1984 — Layout Animations with layout Prop
- REST
- remains the gold standard for **heterogeneous clients**—when Android, iOS, Python scripts, and web apps all need access.
- Lesson 1821 — When tRPC Fits vs GraphQL or REST
- Result
- React unnecessarily destroys and recreates components that simply moved positions.
- Lesson 165 — Deletions and Index Key ShiftLesson 867 — Memoizing Expensive CalculationsLesson 1464 — Heavy Computation Example: Large Lists
- 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 1651 — Resumability: Qwik's Alternative to Hydration
- Resume
- work when the main thread is idle
- Lesson 409 — Fiber: React's Internal Reconciliation EngineLesson 1455 — The Interruptible Render: What Makes Concurrent Mode Different
- Retry logic
- with exponential backoff
- Lesson 1746 — Middleware-Heavy Workflows: Sagas, Observables, Complex Async
- return a cleanup function
- from your effect.
- Lesson 319 — From componentWillUnmount to Effect CleanupLesson 555 — Cleanup for Timers
- Return cached data immediately
- (if available)
- Lesson 1804 — SWR's Core Philosophy: Stale-While-Revalidate
- Return type
- Explicitly mark the function as returning JSX (optional but clear)
- Lesson 2329 — Basic Function Component Type Annotation
- Returned state
- `data` (your result), `isLoading` (first fetch), `error` (if failed)
- Lesson 1770 — useQuery: The Basic Data Fetching Hook
- Returns JSX
- (that `<h1>` element)
- Lesson 178 — Your First Function ComponentLesson 1043 — Basic Render Prop Syntax
- Reusability
- Lesson 133 — When to Extract to Helper FunctionsLesson 817 — Local Context for Component SubtreesLesson 1691 — Context for Feature-Scoped State
- reusable
- you can render the same component multiple times with different data, just like calling a function with different arguments.
- Lesson 212 — What Props Are: Arguments to ComponentsLesson 1002 — The Cohesion Test: Does the Hook Have a Clear Purpose?
- Reusable utilities
- (date helpers, string manipulation)
- Lesson 2190 — Unit Tests for Pure Functions and Hooks
- Reuse
- UI patterns without copying code
- Lesson 182 — Components Can Call Other ComponentsLesson 779 — The Provider Component Pattern
- Reuse-driven extraction
- asks: "Where else will I use this?
- Lesson 1001 — Extracting for Testability vs Reusability
- reuses
- the existing DOM node and component instance
- Lesson 171 — How Stable Keys Enable ReconciliationLesson 1258 — The Sorting Problem with Index Keys
- Revenue-impacting
- Checkout, subscription signup, payment processing
- Lesson 2183 — E2E Tests Cover Critical User Journeys
- Revert the UI
- to its previous state (or refetch the real state from the server)
- Lesson 1500 — Handling Optimistic Update Failures
- Review
- Changes to page interactions are visible in Page Object diffs, not scattered across test files
- Lesson 2199 — Page Objects in CI: Keeping Tests DRY
- Risk Management
- A working Redux codebase is *working*.
- Lesson 1747 — Team Familiarity and Existing Codebase Investment
- Risky
- Array indexes (stable only if the list never reorders)
- Lesson 153 — Keys 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 2189 — E2E 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 1871 — Role-Based Authorization
- Rollbacks would be jarring
- If showing success then yanking it away would confuse users more than waiting
- Lesson 1802 — Pessimistic 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 1333 — Error Tracking with LogRocket and Other Services
- Rough guidelines
- Lesson 2280 — Measuring Expensive Computations
- Route paths get autocomplete
- Type `/us` and see `/users` suggested
- Lesson 1875 — What TanStack Router Brings: Type Safety End-to-End
- Route problems
- Client-side routing that works in dev but breaks on static hosts
- Lesson 47 — Previewing the Production Build
- Route-based sections
- entire pages users may never visit
- Lesson 1358 — Lazy vs Eager: When Each is Right
- Route-Level Boundaries
- Place boundaries at each major route to prevent one page's errors from affecting navigation.
- Lesson 1307 — Error Boundary Placement StrategyLesson 1340 — Suspense Boundaries: Where to Place Them
- Route-level data requirements
- that block navigation
- Lesson 1482 — When use() Fits vs TanStack Query or Loaders
- Route-level splitting
- means creating separate bundles for each major route in your application.
- Lesson 1423 — Route-Level Splitting: The Sweet SpotLesson 1426 — The Cost of Over-Splitting
- Routes are unrelated
- Blog posts and checkout flow don't share context
- Lesson 1842 — When to Nest vs Flatten Routes
- RTL
- "Test that your component behaves correctly for users.
- Lesson 2040 — RTL vs Enzyme: Philosophy Differences
- RTL's philosophy
- If you can't test it without diving into React internals (`.
- Lesson 2034 — Why RTL Discourages Testing Details
- Run comparison logic
- Check if dependencies changed by comparing old values to new ones
- Lesson 905 — The Cost of Memoization Itself
- Run your production build
- in CI (the same `npm run build` you'd deploy)
- Lesson 1420 — Measuring Bundle Size in CI
- Running useState again
- , which now returns the *updated* state value
- Lesson 342 — How setState Triggers Re-renders
- Runs your function
- (the expensive calculation or the callback you're defining)
- Lesson 874 — The Mental Model: Cache Invalidation
- runtime overhead
- (name lookups) because the performance win benefits every React app, every millisecond, forever.
- Lesson 1016 — The Performance Win of Order-Based TrackingLesson 1952 — The Shift to Zero-Runtime Solutions
- Runtime safety
- Clear error messages if components are used incorrectly
- Lesson 1094 — Type-Safe Context for Compound Components
- RxJS Observables
- Lesson 24 — Angular (2+): TypeScript-First Architecture
S
- Safari-specific CSS rendering bugs
- (flexbox behaves differently)
- Lesson 2187 — E2E for Cross-Browser and Device Testing
- Same tooling philosophy
- Fast refresh (like HMR), environment variables, build optimization
- Lesson 57 — Expo for React Native
- Sanitizing input
- Removing special characters or formatting
- Lesson 1243 — Transforming and Preprocessing Data
- Save on change
- Lesson 1948 — Persisting Theme Choice in localStorage
- Save time
- You skip over hundreds of unimportant commits.
- Lesson 2213 — Filtering Commits by Duration Threshold
- Scalability
- Large apps don't slow initial load
- Lesson 1651 — Resumability: Qwik's Alternative to Hydration
- Scale up from center
- Lesson 1971 — Animating on Mount and Unmount
- Scenario A
- A simple text counter component renders 50 times during an animation.
- Lesson 2270 — Measuring Render Count vs Render Time
- Scenario B
- A complex data table renders once when a user clicks "Load More".
- Lesson 2270 — Measuring Render Count vs Render Time
- scheduling a re-render
- of that component.
- Lesson 336 — State Updates Trigger Re-rendersLesson 342 — How setState Triggers Re-renders
- Scroll jank
- As users scroll, the browser struggles to repaint and reflow massive DOM trees
- Lesson 2295 — The Problem Virtualization Solves
- Scrub through time
- Move backward and forward through actions to see exactly when something went wrong
- Lesson 1744 — Time-Travel Debugging and Audit Requirements
- Search
- Typing in a search box → update `?
- Lesson 1861 — Updating Search Params Without Full Navigation
- Search params are schemas
- Define them once, get type-safe reads/writes everywhere
- Lesson 1875 — What TanStack Router Brings: Type Safety End-to-End
- Second `!` (negation again)
- Flips it back to the "correct" boolean
- Lesson 113 — Safe Boolean Coercion: !! Pattern
- second argument
- to your component function (alongside the regular `props` object).
- Lesson 725 — The forwardRef Wrapper FunctionLesson 2272 — Custom Comparison Functions
- Second pass
- Re-render with the **new** deferred value in the background (as a low-priority update)
- Lesson 1443 — The Basic useDeferredValue Pattern
- Second pass (after hydration)
- Update to the real, browser-specific value
- Lesson 1659 — The Two-Pass Render Pattern
- Second render
- Component re-renders with the *updated* derived state
- Lesson 652 — Why It's Wrong: Double RenderingLesson 666 — Performance: Render Computation is FastLesson 700 — Avoiding the useEffect Computation TrapLesson 1033 — Dynamic Hook Calls Based on PropsLesson 1659 — The Two-Pass Render Pattern
- Second render (logged out)
- Lesson 1009 — Why Conditional Hooks Break Everything
- secret handshake
- between related components.
- Lesson 1110 — Setting Up Internal ContextLesson 1901 — Setup with Vite
- Section-Level Boundaries
- Lesson 1340 — Suspense Boundaries: Where to Place Them
- selective hydration
- .
- Lesson 1367 — The Streaming SSR ConnectionLesson 1667 — Selective Hydration with Streaming
- 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 2257 — Comparing Context Overhead to Alternatives
- selector function
- that extracts just what you need
- Lesson 858 — use-context-selector Library OverviewLesson 1709 — Consuming Store State with HooksLesson 1710 — Selectors: Subscribing to Specific SlicesLesson 1736 — Connecting Redux to React with useSelectorLesson 2326 — Context Selector Pattern with useSyncExternalStore
- self-contained
- .
- Lesson 10 — Component-Based ArchitectureLesson 120 — Inline Ternaries for Component SelectionLesson 1310 — Feature-Level Boundaries
- self-documenting
- .
- Lesson 114 — Explicit Comparisons Over Implicit TruthinessLesson 1122 — Slots vs Children: When Each Fits
- self-documenting code
- that's easy to debug
- Lesson 768 — When to Use Multiple Action Types vs Single with PayloadLesson 985 — Naming for Clarity and Intent
- Semantic clarity
- Names like `"loading"`, `"success"`, or `"error"` communicate intent better than raw property values.
- Lesson 1973 — Variants: Named Animation States
- Send placeholders
- (from Suspense boundaries) for slower components
- Lesson 1583 — Streaming and Incremental Rendering
- Send the actual request
- Make the network call in the background
- Lesson 1498 — The Optimistic State Pattern
- Sensitive or user-specific
- Partially filled forms, temporary selections
- Lesson 1864 — Search 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 1675 — SSR Trade-offs: Server Cost vs Time-to-Content
- SEO-critical data
- that must be server-rendered
- Lesson 1482 — When use() Fits vs TanStack Query or Loaders
- separation of concerns
- the tracker knows *what* data to provide, consumers know *how* to present it.
- Lesson 1051 — Classic Example: Mouse Position TrackerLesson 1169 — Event Handler Composition
- Sequence dozens of animations
- with precise millisecond gaps
- Lesson 2012 — GSAP for Complex Timeline Animations
- Sequential
- (await chains):
- Lesson 1568 — Sequential vs Parallel Fetching PatternsLesson 1579 — Sequential vs Parallel Data Fetching
- Sequential fetching
- happens when you `await` one fetch before starting the next:
- Lesson 1579 — Sequential vs Parallel Data Fetching
- Sequential workflows
- (wait for A, then B, then C)
- Lesson 1746 — Middleware-Heavy Workflows: Sagas, Observables, Complex Async
- Serializable (works)
- Lesson 1540 — The Serialization Boundary
- serialize
- them—convert them to a format that can be transmitted over the network and reconstructed on the other side.
- Lesson 1528 — Props Must Be SerializableLesson 1587 — What 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 1598 — Creating 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 1609 — When to Use Server Actions vs API Routes
- Server Component (the descriptions)
- The chef writes the menu once.
- Lesson 1559 — Zero JavaScript for Static Content
- Server Components
- Pure rendered output in the RSC wire format.
- Lesson 1534 — What '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 1952 — The Shift to Zero-Runtime Solutions
- Server renders
- Sees `width === null`, outputs "Loading width.
- Lesson 1658 — The useEffect Solution Pattern
- Server state
- , on the other hand, is the *truth* that lives on your backend: user profiles, product listings, shopping carts.
- Lesson 1684 — UI State vs Server StateLesson 1704 — Server State vs Client State SeparationLesson 1768 — TanStack Query: What Problem Does It Solve?
- Server State characteristics
- Lesson 1684 — UI State vs Server State
- Server validation is complex
- The server might reject the request for non-obvious reasons (permissions, business rules)
- Lesson 1802 — Pessimistic 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 1574 — The 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 611 — When 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 1291 — What Error Boundaries DON'T Catch: Server-Side RenderingLesson 1820 — Prefetching 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 1941 — When 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 34 — SEO-First Content Without SSR InfrastructureLesson 1368 — Client-Only Apps: Limited Suspense UtilityLesson 1630 — What Server-Side Rendering Actually Means
- Server-side rendering with GraphQL
- using Apollo's SSR utilities
- Lesson 1830 — When Apollo Fits vs TanStack Query
- Server-side templates
- (like Django templates, ERB, Blade, or Handmade)
- Lesson 35 — Teams Without JavaScript Expertise
- setter function
- .
- Lesson 332 — Calling the Setter FunctionLesson 1861 — Updating Search Params Without Full Navigation
- Setup time
- calculating item sizes and container heights
- Lesson 2301 — When Virtualization Isn't Worth It
- shallow comparison
- check if any props or state values changed using strict equality (`!
- Lesson 300 — shouldComponentUpdate: Manual Render OptimizationLesson 914 — Shallow Equality Explained: Object.is on Props
- shallow equality check
- by default—comparing each prop value with `Object.
- Lesson 922 — The Default Behavior: Why Shallow is Usually RightLesson 2271 — The Shallow Equality Check
- Shallow nesting (1-2 levels)
- All three work fine; choose based on content structure
- Lesson 1150 — Composability Comparison: Nesting and Flexibility
- Shareable across components
- Lesson 776 — Common Pattern: Reusable Init Functions
- Shared components
- are like basic utensils (knives, spoons, measuring cups) that you use everywhere—they belong in a common drawer.
- Lesson 63 — The Components Folder: Shared vs Feature-Specific
- Shared element transitions
- An image smoothly transitions from thumbnail to full-screen using `layoutId`
- Lesson 2010 — Framer Motion for Component-Driven UI Animations
- Shared layouts exist
- Dashboard pages all need the same sidebar
- Lesson 1842 — When to Nest vs Flatten Routes
- Shopping cart
- changes frequently, read only by cart-related components
- Lesson 839 — Identifying Independent State Domains
- Show a loading indicator
- (spinner, skeleton, or status text)
- Lesson 1411 — Handling Loading States in Interaction-Based Splits
- Show immediate feedback
- to user input (the input updates instantly)
- Lesson 1471 — User Perception: Immediate Feedback Matters Most
- Show loading indicators
- Lesson 1486 — The Pending State
- Show/Hide Content
- Lesson 339 — Boolean State for Toggles
- Sibling boundaries
- sit next to each other at the same level, letting independent sections load in parallel without blocking each other.
- Lesson 1377 — Multiple Suspense Boundaries: Nested vs Sibling
- Siblings subscribe
- child components (`Tab`, `TabPanel`) call `useContext` to tap into shared state
- Lesson 1090 — Creating a Private Context for Compound Components
- side effect
- is any operation that reaches outside your component's render calculation.
- Lesson 524 — What is a Side Effect?Lesson 568 — Why Fetch Happens in useEffectLesson 722 — When to Use Refs vs State for DOM Interaction
- Side effects
- Use `useEffect`
- Lesson 328 — Should You Write New Class Components?Lesson 1507 — The 'use memo' Directive (Opt- Out)
- Side effects happen here
- After DOM updates, React calls `useEffect` hooks and other lifecycle methods
- Lesson 429 — Commit Phase: Applying Changes to the DOM
- Side effects include
- Lesson 524 — What is a Side Effect?
- Signs of expensive computation
- Lesson 671 — Expensive Computations: When to Use useMemo
- Similar colors
- (indicating similar durations) cascading downward
- Lesson 2216 — Identifying Cascading Renders in the Flame Graph
- Similar patterns
- for form inputs, toggle states, or timers appearing in multiple places
- Lesson 997 — The Signal: When Logic is Repeated Across Components
- Simple APIs
- where users shouldn't think about functions
- Lesson 1148 — When Slots Win: Multiple Named Insertions
- Simple calculations
- wrapped in `useMemo`—the compiler handles these automatically now
- Lesson 1509 — Migration Strategy: Removing Manual Memoization
- Simple comparison
- Primitive props (strings, numbers, booleans) compare perfectly with shallow equality
- Lesson 934 — List Items with Stable Props: A Common Win
- Simple consumption patterns
- When most components need all or most of the context value
- Lesson 816 — Context vs State Management Libraries
- Simple containment
- The component is primarily a wrapper (layout, styling, behavior)
- Lesson 1147 — When Children is Enough
- Simple data
- Primitives or small objects, not complex nested structures
- Lesson 1690 — Context for Simple App-Wide State
- Simple DOM nodes
- (text, small images): The browser handles these efficiently
- Lesson 2301 — When Virtualization Isn't Worth It
- Simple loading indicators
- (pulsing dots, rotating spinners)
- Lesson 1957 — When CSS Transitions Are Enough
- Simple object/array literals
- `const style = { color: 'blue' }` (when referential identity doesn't matter)
- Lesson 906 — When Simple Values Don't Need useMemo
- Simple Spinners
- The easiest approach is a centered loading spinner.
- Lesson 1342 — The fallback Prop: Spinners and Skeletons
- Simple UIs
- A basic form with a few inputs doesn't need concurrent features.
- Lesson 1469 — When Concurrent Features Don't Help
- Simple URLs suffice
- Sometimes `/checkout` is clearer than nesting under `/store/cart/checkout`
- Lesson 1842 — When to Nest vs Flatten Routes
- Simpler caching needs
- you don't need entity normalization across deeply nested data
- Lesson 1830 — When Apollo Fits vs TanStack Query
- Simpler code
- Fewer lines, no dependency management
- Lesson 653 — The Fix: Compute During RenderLesson 1551 — Data Flow: Server Components Have Direct Backend Access
- Simpler Inline
- Lesson 969 — When NOT to Extract
- Simpler mental model
- Data routers are powerful but conceptually lighter than TanStack's full type-safe approach
- Lesson 1885 — When TanStack Router Fits vs React RouterLesson 2328 — When to Move to External State
- Simpler onboarding
- New developers understand props first
- Lesson 823 — When Prop Drilling is Actually Fine
- Simplicity
- No need to learn or set up additional patterns
- Lesson 269 — When Drilling Isn't a ProblemLesson 1864 — Search Params for Component State: TradeoffsLesson 2396 — Team Conventions: Picking a Style
- Simplicity without sacrifice
- Zustand excels in the sweet spot between Context and Redux.
- Lesson 1718 — Zustand vs Context vs Redux: The Tradeoffs
- Simplify component code
- Hide complexity behind intuitive names
- Lesson 993 — Composing Third-Party Hooks
- Simulate the user action
- with `user-event` (clicking a "Load More" button, submitting a form, etc.
- Lesson 2092 — Testing User-Triggered Fetches
- Simultaneously
- trigger a background refetch for fresh data
- Lesson 607 — Background Refetching and Stale-While-RevalidateLesson 1625 — Server for Data Fetching Without Waterfalls
- Single Page Applications (SPAs)
- smooth, app-like experiences without page refreshes.
- Lesson 1672 — Client-Side Rendering (CSR): The SPA Default
- single source of truth
- the *only* authoritative place that defines what the input displays.
- Lesson 463 — What 'Single Source of Truth' MeansLesson 471 — Tradeoff: Extra Re-rendersLesson 745 — The Cognitive Load of Many useState CallsLesson 765 — Action Creators: Functions That Return ActionsLesson 1111 — Building the Context ProviderLesson 1195 — Controlled Forms: Single Source of Truth PrincipleLesson 1201 — The defaultValue Trap in Controlled ComponentsLesson 1225 — Schema Validation with Zod Resolver (+4 more)
- Single-property changes
- Animating `opacity`, `transform`, or `background-color` based on a class toggle.
- Lesson 1978 — When Framer Motion is Overkill
- Skeleton Screens
- These are placeholder shapes that mimic the structure of the content about to load.
- Lesson 1342 — The fallback Prop: Spinners and SkeletonsLesson 1388 — The fallback Prop: Loading UILesson 1400 — Route Transition States and UX
- Skeleton UI
- works best when replacing specific content areas.
- Lesson 1373 — Common Fallback Patterns: Spinners and Skeletons
- Skip re-renders
- when props/state haven't changed (optimization)
- Lesson 407 — Pure Functions: Why Components Must Be Pure
- Slide in from left
- Lesson 1971 — Animating on Mount and Unmount
- slot pattern
- in action: you're filling named placeholders with specific content.
- Lesson 1141 — Passing JSX as Regular PropsLesson 1591 — The Slot Pattern with Server Components
- slot-based composition
- using the `asChild` prop.
- Lesson 1102 — Slot-Based Composition in Radix PrimitivesLesson 1192 — Headless UI (Tailwind Labs): Third Option
- Slots
- Pass multiple pieces of JSX as different props
- Lesson 954 — Component Composition Over memoLesson 1128 — Slots vs Compound Components: Design TradeoffsLesson 1136 — Slots vs Render Props: The TradeoffLesson 1146 — Three Ways to Inject Content: A ComparisonLesson 1153 — What is Inversion of Control in React?Lesson 1173 — When Prop Getters Beat Component Slots
- Slots (Explicit Props)
- Lesson 1151 — Type Safety Across Patterns
- Slots (Named Props)
- You pass JSX elements as explicitly named props like `header={<Logo />}` or `footer={<Nav />}`.
- Lesson 1146 — Three 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 1633 — The Performance Problem with renderToString
- slow startup times
- and **sluggish updates** during development.
- Lesson 37 — Why Vite Replaced Create React AppLesson 49 — Create React App: The Legacy Standard
- slower
- than just letting the component re-render naturally.
- Lesson 2267 — The Cost of React.memo ItselfLesson 2284 — Dependency Array Performance Impact
- Slower CPUs
- that take longer to parse and execute JavaScript
- Lesson 33 — Performance-Critical Mobile Web Apps
- Sluggish hot reloading
- compared to Vite's instant updates
- Lesson 49 — Create 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 2257 — Comparing Context Overhead to Alternatives
- Small to medium apps
- When your state tree isn't deeply nested or constantly changing
- Lesson 816 — Context vs State Management Libraries
- Small, private helper components
- used only by one parent component
- Lesson 201 — One Component Per File (Usually)
- Smaller bundle size matters
- TanStack Query is lighter and has no GraphQL parser overhead
- Lesson 1830 — When Apollo Fits vs TanStack Query
- Smaller bundles
- only interactive pieces add to your JavaScript payload
- Lesson 1621 — The Default: Start with Server Components
- Smaller initial bundle
- → faster download over the network
- Lesson 2287 — Performance Impact of Code Splitting
- Smaller virtual DOM implementation
- Optimized diffing with less overhead
- Lesson 28 — Preact: React's Lightweight Alternative
- Smart refetching
- Data refreshes when windows regain focus, components remount, or network reconnects
- Lesson 596 — Why 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 1675 — SSR Trade-offs: Server Cost vs Time-to-Content
- Solid
- State change → directly updates the exact DOM nodes that depend on it
- Lesson 26 — Solid: Fine-Grained Reactivity
- Some proxies and CDNs
- buffer responses before sending them
- Lesson 1671 — Streaming SSR Browser Support and Fallbacks
- Sophisticated caching strategies
- with stale-while-revalidate patterns
- Lesson 1482 — When use() Fits vs TanStack Query or Loaders
- Source maps
- are special files that map minified code back to your original source.
- Lesson 1334 — Source Maps for Readable Stack TracesLesson 1510 — Debugging Compiler Output
- Specific component types
- are the most restrictive — they enforce that a particular component is used.
- Lesson 1135 — Type Safety for Slot Props
- Speed
- No network delays or database queries
- Lesson 2075 — Why Module Mocking is Necessary in TestsLesson 2135 — The Integration Test Sweet Spot
- Speed perception matters
- Social feeds, chat apps, collaborative tools where instant feedback is expected
- Lesson 1802 — Pessimistic vs Optimistic: When to Choose
- Spinners
- work best for full-page or major section loads.
- Lesson 1373 — Common Fallback Patterns: Spinners and SkeletonsLesson 1388 — The fallback Prop: Loading UI
- 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 211 — When to Split vs Keep Components Together
- SSG
- Pre-packaged meals—made once, served instantly (CDN-cached HTML)
- Lesson 1679 — Decision Matrix: Choosing the Right Rendering Strategy
- SSR
- is ordering a fully prepared meal—it arrives ready to eat, though you might add garnish (interactivity) after.
- Lesson 1630 — What Server-Side Rendering Actually MeansLesson 1673 — CSR Trade-offs: Interactivity vs Initial LoadLesson 1679 — Decision Matrix: Choosing the Right Rendering Strategy
- Stabilize the references
- using `useCallback` for functions and `useMemo` for objects:
- Lesson 901 — Stabilizing Props to Memoized Components
- stable
- (doesn't change between renders).
- Lesson 142 — The Key Prop RequirementLesson 1249 — Composite Keys for Nested ListsLesson 1255 — Stable IDs: The Gold Standard for Keys
- Stable across renders
- The ID doesn't change when you re-fetch or update the data
- Lesson 155 — Using Database IDs as Keys
- stable keys
- , React can confidently match items between renders, even when they've moved, been inserted, or reordered.
- Lesson 171 — How Stable Keys Enable ReconciliationLesson 172 — Performance Cost of Unstable KeysLesson 1262 — The Performance Cost of Bad KeysLesson 1268 — Performance Degradation from Remounting
- Stable props
- Item data comes from arrays/databases and rarely changes
- Lesson 934 — List Items with Stable Props: A Common WinLesson 936 — memo with Pure Presentational Components
- Stable Props Pattern
- ensure every prop passed to a memoized component maintains the same reference across renders unless the underlying value truly changes.
- Lesson 2274 — memo + Stable Props Pattern
- Stable reference
- Lesson 234 — Inline Arrow Functions vs Stable References
- Stable references
- are better when no arguments are needed: `handleClick`
- Lesson 234 — Inline Arrow Functions vs Stable ReferencesLesson 861 — Selector Stability and PerformanceLesson 916 — When Props Are Objects: Reference Equality Matters
- Stack traces
- showing exactly where code failed
- Lesson 1330 — Why Log Errors Remotely: Visibility into Production
- Stagger patterns
- across arrays of elements with fine-grained control
- Lesson 2012 — GSAP for Complex Timeline Animations
- stale
- they no longer match the current state of your component.
- Lesson 574 — The Stale Closure ProblemLesson 1774 — Cache Staleness: staleTime ExplainedLesson 1782 — The staleTime ConfigurationLesson 1785 — Automatic Refetch on Network Reconnect
- Stale Closures
- Lesson 558 — What Happens Without CleanupLesson 882 — The eslint-plugin-react-hooks Exhaustive- Deps RuleLesson 1020 — The exhaustive-deps Rule
- Stale UI flash
- The component briefly shows old data before the effect runs
- Lesson 683 — The Props-Change-Triggers-Effect Antipattern
- Stale value window
- Between when `products` changes and the Effect runs, your UI displays outdated information
- Lesson 694 — The Effect Antipattern: Computing Derived Values
- stale-while-revalidate
- pattern works like this:
- Lesson 607 — Background Refetching and Stale-While-RevalidateLesson 1678 — Incremental Static Regeneration (ISR): Hybrid Freshness
- Standard patterns
- for actions, reducers, or mutations
- Lesson 1705 — Team Collaboration and Predictable Patterns
- Standard usage
- Lesson 1117 — Adding Flexibility with Render Props
- start
- the synchronization when the component appears (or when dependencies change) and **stop** it when appropriate.
- Lesson 534 — The Mental Model: SynchronizationLesson 656 — Exception: External System Synchronization
- Start Recording
- Click the record button (red circle) in the Profiler tab before doing anything
- Lesson 2208 — Recording a Profile: Start, Interact, Stop
- Start simple
- Build components that work great for the 80% case with minimal configuration.
- Lesson 1154 — The Flexibility vs Simplicity Tradeoff
- Start streaming HTML immediately
- for components that resolve quickly
- Lesson 1583 — Streaming and Incremental Rendering
- State
- Internal data the component manages (if any)
- Lesson 68 — Components Tab: Inspecting the Component TreeLesson 224 — Props Are Immutable in ReactLesson 228 — Props vs State: Who Owns the DataLesson 483 — Checkbox: checked and onChangeLesson 498 — Refs Don't Trigger Re-rendersLesson 722 — When to Use Refs vs State for DOM InteractionLesson 1504 — The Compiler's Mental Model: Reactive DependenciesLesson 1870 — Preserving Return-To URLs
- State changes
- Which state variables updated
- Lesson 2225 — Comparing Renders: Why Did This Update Happen?
- State confusion
- Component state (like form inputs) can attach to the wrong items
- Lesson 142 — The Key Prop Requirement
- State diff visualization
- exactly what changed between states
- Lesson 1703 — Developer Experience: DevTools and Time Travel
- state machine
- defines:
- Lesson 752 — Modeling State MachinesLesson 1750 — State Machines vs Ad-Hoc State
- State management
- Use `useState`
- Lesson 328 — Should You Write New Class Components?Lesson 1109 — Creating the Parent Component Shell
- State Management Conflicts
- Lesson 36 — Embedding in Existing Non-React Apps
- State management hooks
- `useFormState` vs `useForm`—pick one pattern
- Lesson 987 — Consistency Across Your Codebase
- State persistence
- A reused component keeps its local state
- Lesson 151 — Keys Preserve Component Identity
- State Reducer pattern
- inverts control of *how state transitions happen*.
- Lesson 1174 — What the State Reducer Pattern Solves
- State reducers
- to let you customize behavior
- Lesson 1183 — What '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 362 — State Lives in the React Tree, Not the Component Function
- State updates queued
- Calls to `setState` schedule updates, they don't apply yet
- Lesson 438 — The Render Cycle Timeline
- State variable names
- `const [count, setCount]` vs `const [value, setValue]`
- Lesson 2115 — What Are Implementation Details?
- State variants
- `hover:bg-blue-700 active:bg-blue-800 disabled:opacity-50`
- Lesson 1915 — Composing Utilities for Complex Styles
- state-driven animations
- you declare what should animate based on component state, and the library handles the rest.
- Lesson 2000 — Why GSAP for React: Imperative Animation PowerLesson 2010 — Framer 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 778 — Creating the Context Pair: State and DispatchLesson 2324 — Separating State and Dispatch Contexts
- static
- or **dynamic**?
- Lesson 1144 — JSX Props vs Render PropsLesson 1300 — static getDerivedStateFromError
- static content
- they're the same for every visitor, every time.
- Lesson 31 — Static Content Sites: When a Framework is OverkillLesson 1148 — When Slots Win: Multiple Named InsertionsLesson 1782 — The staleTime Configuration
- Static labels
- that aren't formally associated with inputs
- Lesson 2056 — getByText for Non-Interactive Content
- Static lists
- that never change (a hardcoded array of links)
- Lesson 162 — The Index-as-Key Pattern and Why It's Common
- Step 4: Refactor Incrementally
- Lesson 648 — Migration Strategy: Moving Fetches Server-Side
- Still no lint error
- The linter doesn't know `getUser` contains hooks.
- Lesson 984 — What Happens Without the 'use' Prefix
- stop
- it when appropriate.
- Lesson 534 — The Mental Model: SynchronizationLesson 656 — Exception: External System Synchronization
- Stop Recording
- Click the record button again to stop and generate the flame graph
- Lesson 2208 — Recording a Profile: Start, Interact, StopLesson 2230 — Establishing a Performance Baseline
- Storage overhead
- React must store both the memoized value and the dependency array in memory
- Lesson 2279 — The Cost of useMemo Itself
- store
- the fact that your sandwich exists separately from storing the bread and filling.
- Lesson 649 — What 'Deriving State' MeansLesson 889 — The Cost-Benefit Analysis of useMemo
- Store references
- Keep the memoized value in memory between renders
- Lesson 905 — The Cost of Memoization Itself
- stream
- .
- Lesson 1366 — Server Components: Automatic Suspense IntegrationLesson 1583 — Streaming and Incremental Rendering
- Streams in
- the suspended component's HTML once its data resolves
- Lesson 1367 — The Streaming SSR Connection
- StrictMode double-fetch handling
- Lesson 605 — The Problem with Manual useEffect Data Fetching
- string
- , not a number.
- Lesson 487 — Number Input: Parsing and ValidationLesson 2062 — TextMatch: String, Regex, and Function
- String concatenation
- `const greeting = "Hello, " + name`
- Lesson 906 — When Simple Values Don't Need useMemo
- Strings
- `name.
- Lesson 114 — Explicit Comparisons Over Implicit TruthinessLesson 251 — Children Types: Elements, Strings, Numbers
- Stripped legacy support
- Focuses on modern browsers only
- Lesson 28 — Preact: React's Lightweight Alternative
- structure
- of your UI.
- Lesson 77 — Why JSX Improves Developer ExperienceLesson 1643 — The Two-Pass Process: Server Render, Then Client Hydrate
- Style-based hiding
- Render the element but make it invisible with CSS (`display: none`, `visibility: hidden`, or `opacity: 0`)
- Lesson 139 — Style-Based Hiding vs Conditional Rendering
- Submitted data
- After validation passes and the user clicks "Save"
- Lesson 1683 — Form State: Almost Always Local
- subscribe
- to specific field changes.
- Lesson 1202 — Form Libraries' Approach: Uncontrolled with Smart SubscriptionsLesson 1221 — watch() for Reactive Values
- Subscriptions
- Setting up event listeners or WebSocket connections
- Lesson 297 — componentDidMount: Side Effects After First Render
- Subscriptions that leak
- (connections that never close)
- Lesson 597 — What StrictMode Does: Intentional Double-Mounting
- Success is highly likely
- The server rarely rejects these requests
- Lesson 1802 — Pessimistic vs Optimistic: When to Choose
- Success with different data
- Lesson 2089 — Returning Different Responses per Test
- Suppressing console error output
- so intentional test errors don't pollute results
- Lesson 2136 — Why Error Boundaries Need Special Testing
- Suspense boundaries
- .
- Lesson 1566 — No Loading States in Server ComponentsLesson 1577 — No Loading States in the Component
- Suspense boundary
- is a dividing line in your component tree.
- Lesson 1637 — Suspense Boundaries in Streaming SSR
- Suspense Support
- Streaming is the *only* way to leverage Suspense boundaries for SSR.
- Lesson 1641 — renderToString vs renderToPipeableStream: The Modern Choice
- Svelte's advantage
- Smaller bundle sizes and faster runtime performance for simpler applications.
- Lesson 25 — Svelte: Compile-Time Reactivity
- SWC
- (Speedy Web Compiler) is written in Rust and offers similar performance to esbuild while maintaining more Babel-like features.
- Lesson 79 — The Role of Babel and Modern Transpilers
- Switch statements
- that pick between many components
- Lesson 129 — Immediately Invoked Function Expressions (IIFEs) in JSX
- SWR
- treat data fetching as a *solved problem*.
- Lesson 587 — Why Modern Libraries Solve This Automatically
- Symbols
- , WeakMaps, or other non-serializable types
- Lesson 1552 — Prop Serialization Across the Boundary
- Symptom
- Your memoized value or callback seems to run constantly despite "nothing changing.
- Lesson 879 — The Object Dependency Problem
- Sync across tabs
- Lesson 1948 — Persisting Theme Choice in localStorage
- synchronization
- your component needs to stay connected to something outside React.
- Lesson 534 — The Mental Model: SynchronizationLesson 1768 — TanStack Query: What Problem Does It Solve?
- Synchronization bugs
- the derived state can fall out of sync with its source
- Lesson 684 — Derived State: Compute During Render Instead
- Synchronization burden
- The effect must re-run every time `products` changes
- Lesson 651 — Example: Filtering Props in an Effect
- Synchronize with third-party libraries
- that need pre-paint access
- Lesson 432 — useLayoutEffect: Pre-Paint Synchronous Effects
- Synchronized inputs
- (two fields that must stay in sync)
- Lesson 515 — Recognizing When Controlled is Still Better
- synchronizing with external systems
- (like subscriptions, browser APIs).
- Lesson 659 — Moving onClick Logic Out of EffectsLesson 674 — The Event Handler PatternLesson 693 — When Computation Happens: Render vs Effect Timing
- Synchronous
- React blocks everything else and updates the DOM in one uninterrupted sequence
- Lesson 412 — The Commit Phase: Applying Changes to the DOMLesson 429 — Commit Phase: Applying Changes to the DOMLesson 679 — Sequential Actions After Events
- synchronously
- applies every single change to the actual browser DOM.
- Lesson 412 — The Commit Phase: Applying Changes to the DOMLesson 562 — useLayoutEffect: The Synchronous AlternativeLesson 674 — The Event Handler PatternLesson 1454 — Synchronous Updates: Legacy Default Behavior
- Syntax Brevity
- Arrow functions can be more concise with implicit returns:
- Lesson 183 — Arrow Functions vs Function Declarations
T
- Tabbing
- triggers `keydown`, `keyup`, `focus` on the next element, and `blur` on the previous one
- Lesson 2072 — Testing Focus Behavior with user-event
- Tailwind
- produces a static CSS file that browsers cache efficiently.
- Lesson 1921 — Tailwind vs CSS-in-JS Tradeoffs
- Tailwind CSS
- Zero runtime, utility-first approach retains component colocation without the parsing cost.
- Lesson 1932 — Migration Path: When to Consider Alternatives
- TanStack Query
- (formerly React Query) and **SWR** treat data fetching as a *solved problem*.
- Lesson 587 — Why Modern Libraries Solve This AutomaticallyLesson 596 — Why Libraries Handle This BetterLesson 1004 — When Framework Libraries Obviate Custom HooksLesson 1345 — Suspense Without a Data LibraryLesson 1573 — Client-Side Data Fetching Still ExistsLesson 1830 — When Apollo Fits vs TanStack Query
- TanStack Query and SWR
- require opt-in configuration (experimental features)
- Lesson 1346 — The 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 1278 — TanStack Virtual: The Modern Choice
- Target high-traffic pages next
- Identify pages with the most user traffic or the worst performance metrics.
- Lesson 1956 — Migration Strategies from Runtime to Zero-Runtime
- Team collaboration
- Share profiles in code reviews or bug reports
- Lesson 2219 — Exporting and Sharing Profiler Data
- Team Consistency
- Every React codebase uses this convention.
- Lesson 335 — Naming Convention: [thing, setThing]
- Team Coordination
- Large teams can work on different slices simultaneously.
- Lesson 1743 — Large-Scale Apps with Many Interconnected Features
- Team experience
- Less TypeScript-savvy teams benefit from simpler, explicit patterns
- Lesson 2396 — Team Conventions: Picking a Style
- Team experience matters
- Your developers already know the patterns cold
- Lesson 1885 — When 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 1747 — Team Familiarity and Existing Codebase Investment
- Tension
- (default: 170): How stiff the spring is.
- Lesson 1993 — Spring Configuration: Tension, Friction, Mass
- Terms below were extracted from bolded phrases in lesson content. Click a lesson reference to jump
- Test coverage
- – Don't migrate without tests confirming behavior stays identical
- Lesson 327 — When Teams Haven't Migrated Yet
- Test filtering
- Remove items—do remaining items keep their identity?
- Lesson 1274 — Debugging Key-Related Issues
- Test reordering
- Sort your list—do keys stay with their data?
- Lesson 1274 — Debugging Key-Related Issues
- Test-driven extraction
- asks: "Can I verify this logic without the component?
- Lesson 1001 — Extracting for Testability vs Reusability
- Testability
- You could even unit-test that variable logic separately if extracted to a helper
- Lesson 124 — Extracting Ternaries to Variables for ClarityLesson 133 — When to Extract to Helper FunctionsLesson 230 — Props Read-Only Rule and Pure ComponentsLesson 782 — Action Creators for Better Developer ExperienceLesson 1750 — State Machines vs Ad-Hoc State
- testable
- .
- Lesson 179 — Components are Pure Functions of PropsLesson 1002 — The Cohesion Test: Does the Hook Have a Clear Purpose?
- Testing Becomes Fragmented
- Lesson 36 — Embedding in Existing Non-React Apps
- Testing becomes straightforward
- Pass in specific state, verify the output matches expectations.
- Lesson 17 — UI as a Function of State
- Testing components in isolation
- without wrapping every test in a Provider
- Lesson 795 — Context Without a Provider
- Testing edge cases
- in a controlled test environment
- Lesson 1035 — ESLint Override Comments: When and How
- Testing gets complicated
- (you need to mock global stores or wrap components in providers)
- Lesson 1681 — Colocation: Keep State Close to Where It's Used
- Tests survive refactoring
- from fetch to axios to a custom hook
- Lesson 2127 — MSW for Realistic API Mocking
- Text content
- Does the text inside elements match exactly?
- Lesson 1654 — How React Detects MismatchesLesson 2167 — Assertions with expect()
- Text input
- causes immediate character rendering
- Lesson 1456 — User Input Priority: Clicks, Typing, and Immediate Feedback
- That's not true
- If a Provider exists, its value wins — even if that value is `undefined`.
- Lesson 793 — Default 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 753 — The Readability Tipping Point
- Theme + User
- Styling based on theme while displaying user information
- Lesson 804 — Multiple Contexts in One Component
- Theme preferences
- Dark mode affects styling across your entire app
- Lesson 810 — Context for Truly Global State
- Theme transitions
- (background color shifts when switching light/dark mode)
- Lesson 1957 — When CSS Transitions Are Enough
- Then
- React runs the effect again, subscribing to `"user-2"`
- Lesson 552 — When Cleanup Runs: Before Re-runLesson 675 — Why useEffect is Wrong for Click HandlersLesson 814 — When NOT to Use Context: Single ConsumerLesson 1558 — The Waterfall Problem in Data FetchingLesson 1964 — onTransitionEnd for Cleanup Logic
- 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 1322 — Installing and Basic Setup of react-error-boundary
- Think of it like
- "If the first thing is true, show the second thing.
- Lesson 89 — Short-Circuit Evaluation: && and ||Lesson 576 — Basic Cleanup with Boolean FlagsLesson 1207 — The Single State Object PatternLesson 1671 — Streaming SSR Browser Support and FallbacksLesson 2074 — Migration Strategy: Replacing fireEvent with user-event
- Third
- Use concurrent features for remaining responsiveness issues
- Lesson 1470 — Concurrent Features vs Other Optimizations
- Third return value
- React 19 added `isPending` (in experimental `useFormState`, you needed `useFormStatus` separately)
- Lesson 1491 — Migration from useFormState
- Third-party APIs
- (analytics, payment SDKs)
- Lesson 2126 — Mock External Dependencies, Not Internal CodeLesson 2185 — E2E Tests for Integration Points
- Third-Party ID Libraries
- Lesson 168 — Better Alternatives: Generating Stable IDs
- Third-party integration
- Libraries that expect fresh object references every render
- Lesson 1507 — The 'use memo' Directive (Opt-Out)
- Third-party library callbacks
- that you know are stable despite what the linter thinks
- Lesson 1022 — When to Disable exhaustive-deps (Rarely)
- This breaks
- React will immediately complain with a syntax error.
- Lesson 181 — Returning 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 411 — Render Does Not Mean DOM UpdateLesson 744 — State Transitions That Depend on Previous State
- This requires framework support
- Libraries like Relay, SWR, TanStack Query, and frameworks like Next.
- Lesson 1359 — Why Suspense for Data ≠ Suspense for Code Splitting
- This works without JavaScript
- Add a Client Component wrapping for enhancements:
- Lesson 1617 — Progressive Enhancement Pattern
- Three state variables
- one for the data itself, one for loading status, and one for any errors
- Lesson 567 — The Classic useEffect Fetch Pattern
- Throwing errors
- in a Server Action will trigger React's error boundary mechanism on the client side.
- Lesson 1604 — Error Handling in Server Actions
- throws a Promise
- .
- Lesson 1339 — How Suspense Detects 'Not Ready'Lesson 1350 — Suspense Boundary for Lazy ComponentsLesson 1363 — TanStack Query's useSuspenseQuery
- throws an error
- if validation fails.
- Lesson 1237 — Schema Validation Methods: parse vs safeParseLesson 2058 — queryBy vs getBy: Asserting AbsenceLesson 2060 — getAllBy, queryAllBy, findAllBy for Multiple Elements
- tightly coupled
- to the parent's behavior
- Lesson 202 — Co-locating Helper ComponentsLesson 819 — Prop Drilling Defined: Threading Props Through LayersLesson 845 — When Not to Split: Tightly Coupled State
- 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 1459 — Time Slicing: Yielding Control Back to the Browser
- Time to First Byte
- and **Largest Contentful Paint**.
- Lesson 1583 — Streaming and Incremental Rendering
- Time to Interactive
- 3-4 seconds faster on mobile
- Lesson 1412 — Why Bundle Size Matters: Performance ImpactLesson 1650 — Islands Architecture: Partial HydrationLesson 1651 — Resumability: Qwik's Alternative to Hydration
- Time to Interactive (TTI)
- how fast users can use your app.
- Lesson 1357 — Bundle Size Impact of Code SplittingLesson 1427 — Measuring Real-World ImpactLesson 1645 — Why Hydration Happens: The Performance TradeoffLesson 2291 — Measuring Split Effectiveness
- Time-based revalidation
- "Regenerate this page every 60 seconds if someone visits it.
- Lesson 1678 — Incremental Static Regeneration (ISR): Hybrid Freshness
- Time-travel debugging
- You can replay state changes and see exactly what users saw.
- Lesson 17 — UI as a Function of StateLesson 1701 — When State Logic Becomes Too Complex for useReducerLesson 1742 — When RTK/RTK Query Fits Your App
- Timeline sequencing
- Chain animations with exact delays
- Lesson 2000 — Why GSAP for React: Imperative Animation Power
- Timers
- Countdown values, elapsed time displays
- Lesson 1685 — Temporary State: Counters, Timers, Animations
- timestamps
- .
- Lesson 101 — suppressHydrationWarning: The Escape HatchLesson 769 — Meta Fields: Adding Timestamps, IDs, or Metadata
- Timing Numbers
- Lesson 2269 — Reading Profiler Flamegraphs
- Tiny bundle size matters
- Every KB counts in your initial load.
- Lesson 1978 — When Framer Motion is Overkill
- Too few chunks
- Large initial bundle, slow first load
- Lesson 1422 — The Bundle Size vs Request Count Tradeoff
- Too many chunks
- Fast initial load, but slow complete experience due to waterfall requests
- Lesson 1422 — The Bundle Size vs Request Count Tradeoff
- Too many context providers
- stacked in your component tree (five or more)
- Lesson 2328 — When to Move to External State
- Too many required decisions
- If users must provide 5+ props just to render something basic, you've inverted too much.
- Lesson 1163 — When 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 335 — Naming Convention: [thing, setThing]
- Top (Narrow)
- E2E tests — few, slow, comprehensive tests running the entire application
- Lesson 2182 — The Testing Pyramid: Unit, Integration, E2E
- Total Blocking Time
- Are expensive chunks deferred properly?
- Lesson 2291 — Measuring Split Effectiveness
- Total Count Announcement
- Use `aria-label` on the container to announce the full list size:
- Lesson 1285 — Accessibility Considerations
- Total duration
- The cumulative time spent rendering that component across all renders
- Lesson 2215 — Component Render Count and Duration Totals
- Touch event handling issues
- (works with mouse, fails with touch)
- Lesson 2187 — E2E for Cross-Browser and Device Testing
- Trace viewer
- Time-travel debug with screenshots, network logs, and DOM snapshots
- Lesson 2161 — Why Playwright is the Modern E2E Choice
- Traceability
- You can easily follow where data comes from and goes
- Lesson 269 — When Drilling Isn't a ProblemLesson 823 — When Prop Drilling is Actually Fine
- Tracks reads
- during component render—knowing *this component accessed `state.
- Lesson 1760 — Proxy-Based State: How Valtio Tracks Mutations
- Tracks writes
- when you mutate—knowing *`state.
- Lesson 1760 — Proxy-Based State: How Valtio Tracks Mutations
- transform
- data first, then validate the cleaned result.
- Lesson 1243 — Transforming and Preprocessing DataLesson 2016 — The Browser's Rendering Pipeline
- transition updates
- .
- Lesson 1433 — Urgent vs Transition Updates PrioritizationLesson 1440 — Transitions Don't Make Code Faster
- transitions
- (the rules that determine which state comes next).
- Lesson 1751 — XState Core Concepts: States, Events, TransitionsLesson 1915 — Composing Utilities for Complex Styles
- Tree structure
- Are children in the same order?
- Lesson 1654 — How React Detects MismatchesLesson 1832 — The Route Tree: Parent and Child Routes
- Tree-shake better
- Ensure you're importing selectively
- Lesson 1421 — Bundle Budget Strategy: Setting Thresholds
- Tree-shaking
- Unused methods in classes are harder to detect and remove
- Lesson 311 — Classes Confuse Both People and Machines
- Triggers re-renders
- only in components that read the changed property
- Lesson 1760 — Proxy-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 810 — Context for Truly Global State
- Truly repeated patterns
- that appear across many components and resist React component extraction
- Lesson 1919 — The @apply Directive: When and Why
- Truthy left side
- (everything else): The gatekeeper waves you through.
- Lesson 111 — Why && Works: Truthy/Falsy Evaluation
- twice
- .
- Lesson 182 — Components Can Call Other ComponentsLesson 413 — Strict Mode's Double-Render BehaviorLesson 650 — The Symptom: Stale Derived ValuesLesson 1449 — Combining with memo for Maximum BenefitLesson 1524 — Server Components Run Once, Not Twice
- two
- places storing its value:
- Lesson 463 — What 'Single Source of Truth' MeansLesson 552 — When Cleanup Runs: Before Re-runLesson 669 — When Derived State Depends on Props
- Two separate commits
- instead of one giant commit
- Lesson 2310 — Measuring Impact: Profiling Before and After useTransition
- two separate contexts
- one for state, one for dispatch—you gain fine-grained control:
- Lesson 781 — Why Splitting Contexts Matters for PerformanceLesson 843 — Read-Only vs Write-Only Context SplitLesson 852 — Solution 2: Split Context into Separate ProvidersLesson 2324 — Separating State and Dispatch Contexts
- two sources of truth
- one in the DOM, one in your state variable.
- Lesson 465 — Controlled: State Drives the DOMLesson 663 — What is Derived State?Lesson 1195 — Controlled Forms: Single Source of Truth Principle
- Type coercion
- Converting string numbers to actual numbers
- Lesson 1243 — Transforming and Preprocessing Data
- Type inference
- TypeScript knows your form data shape from the schema
- Lesson 1225 — Schema Validation with Zod Resolver
- Type refinement
- `type="email"` for specific input types
- Lesson 1170 — Prop Getter Arguments: Customization Points
- Type safety
- TypeScript knows exactly what parameters you need
- Lesson 765 — Action Creators: Functions That Return ActionsLesson 782 — Action Creators for Better Developer ExperienceLesson 1079 — Named Children vs Generic ChildrenLesson 1099 — Radix UI's Compound Component ArchitectureLesson 1142 — Multiple Named Content PropsLesson 1922 — CSS-in- JS Philosophy: Colocation and Dynamic Styles
- Type safety is non-negotiable
- Large teams where catching routing errors at compile time prevents production bugs
- Lesson 1885 — When TanStack Router Fits vs React Router
- Type safety matters
- TypeScript discriminated unions work beautifully
- Lesson 768 — When to Use Multiple Action Types vs Single with Payload
- Type-Based Structure
- groups files by *what they are* (their technical type):
- Lesson 208 — Folder Structure: Feature-Based vs Type-Based
- Type-based works well
- when your app is small (under ~10 components).
- Lesson 208 — Folder Structure: Feature-Based vs Type-Based
- Types folder
- If it's a TypeScript definition used in multiple places.
- Lesson 64 — Common Top-Level Folders: hooks, utils, types
- TypeScript declaration generation
- Lesson 1954 — CSS Modules Resurging in Popularity
- TypeScript support
- better type safety
- Lesson 1322 — Installing and Basic Setup of react-error-boundary
- TypeScript types
- need to be clear and autocomplete-friendly
- Lesson 1128 — Slots vs Compound Components: Design Tradeoffs
- TypeScript verbosity
- Duplicate the type annotation everywhere
- Lesson 820 — The Component Tree Depth Problem
- TypeScript-First
- Lesson 24 — Angular (2+): TypeScript-First Architecture
- TypeScript-First Teams
- If your team values type safety everywhere, vanilla-extract's `.
- Lesson 1941 — When vanilla-extract Fits Best
- TypeScript-only, full-stack projects
- where you control both the frontend and backend.
- Lesson 1821 — When tRPC Fits vs GraphQL or REST
U
- UI preferences
- (theme, language) — changes rarely, read by layout components
- Lesson 839 — Identifying Independent State Domains
- UI state
- that React should manage
- Lesson 722 — When to Use Refs vs State for DOM InteractionLesson 1684 — UI State vs Server State
- UI State characteristics
- Lesson 1684 — UI State vs Server State
- 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 2318 — Local State for UI-Only Concerns
- Unclear intent
- When another developer might misunderstand your condition
- Lesson 114 — Explicit Comparisons Over Implicit Truthiness
- Uncontrolled
- Component is self-sufficient, simpler API, works standalone
- Lesson 1157 — The Controlled vs Uncontrolled Pattern GeneralizedLesson 1216 — Installing and Basic Setup
- Uncontrolled (child owns state)
- Lesson 689 — Controlled vs Uncontrolled: Let Parent Own State
- Uncontrolled components
- flip this model: the DOM itself manages the input's value, just like traditional HTML forms.
- Lesson 490 — What Are Uncontrolled Components?Lesson 507 — Simple Forms Without Real-Time ValidationLesson 1157 — The Controlled vs Uncontrolled Pattern Generalized
- Under ~50-100 items
- with simple content: Regular rendering is often faster
- Lesson 2301 — When Virtualization Isn't Worth It
- Understandable
- Others (including future you) know what it does
- Lesson 1002 — The Cohesion Test: Does the Hook Have a Clear Purpose?
- Undo/redo systems
- Store original timestamps
- Lesson 769 — Meta Fields: Adding Timestamps, IDs, or Metadata
- Unexpected re-renders
- Use React DevTools Profiler alongside compiler output to correlate
- Lesson 1510 — Debugging Compiler Output
- Unexpectedly wide bars
- If a small, simple component shows a surprisingly wide bar, investigate why it's slow.
- Lesson 2223 — Reading the Profiler Flamegraph
- unidirectional data flow
- principles.
- Lesson 13 — Reconciliation: React's Diffing AlgorithmLesson 14 — Learn Once, Write AnywhereLesson 15 — Composition Over InheritanceLesson 224 — Props Are Immutable in React
- Union types
- and **complex transformations** require `type`:
- Lesson 2330 — Props Interface vs Type AliasLesson 2381 — Typing useState: Explicit Type Arguments
- Unique
- The combination prevents collisions across all nesting levels
- Lesson 1249 — Composite Keys for Nested Lists
- unique among siblings
- and **stable** (doesn't change between renders).
- Lesson 142 — The Key Prop RequirementLesson 155 — Using Database IDs as Keys
- Unmount
- is when React removes the component from the screen entirely.
- Lesson 296 — The Three Lifecycle Phases: Mount, Update, Unmount
- Unmount Phase (component disappears)
- Lesson 307 — The Lifecycle Diagram: Mental Model
- unmounts
- the old component instance (runs cleanup, discards state)
- Lesson 157 — Keys and Component StateLesson 366 — The Key Prop Resets State by Changing IdentityLesson 504 — Resetting Uncontrolled Inputs with keyLesson 1267 — Animation and Transition Breaks
- unnecessary dependencies
- values included in the array but never used in the hook body.
- Lesson 1020 — The exhaustive-deps RuleLesson 1021 — Reading and Understanding Exhaustive-Deps WarningsLesson 2284 — Dependency Array Performance Impact
- unnecessary renders
- components that rendered but displayed no visible change.
- Lesson 844 — Measuring Impact with React DevTools ProfilerLesson 2220 — What Constitutes an 'Unnecessary' Render
- Unnecessary unmounting and remounting
- (performance hit)
- Lesson 1245 — Why 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 2236 — Finding Hook Dependency Issues
- Unstable networks
- where downloading even 100 KB can be painfully slow
- Lesson 33 — Performance-Critical Mobile Web Apps
- up
- the tree from the component that's consuming the context.
- Lesson 794 — Multiple Providers of the Same ContextLesson 805 — useContext Cannot Read from Sibling Providers
- Update
- occurs whenever props or state change.
- Lesson 296 — The Three Lifecycle Phases: Mount, Update, UnmountLesson 329 — What useState Does: Adding State to Function Components
- Update logic
- Spreading large objects can be verbose
- Lesson 384 — Performance: Object vs Multiple Variables
- Update on scroll
- As you scroll, new items render into view and old ones unmount
- Lesson 1276 — What Virtualization Is: Render Only Visible Items
- Update submit handler
- to read from refs or `FormData`
- Lesson 1203 — Migration Strategy: Converting Between Approaches
- Update the dependency
- first, ensure everything still works
- Lesson 1521 — Migration Strategy: Incremental Adoption
- Updates are infrequent
- (theme changes, user auth state)
- Lesson 1694 — When Context Beats Prop Drilling
- Updates to Unmounted Components
- Lesson 558 — What Happens Without Cleanup
- Updating items
- Map through the array and replace the matching item with its updated version.
- Lesson 1798 — Optimistic Updates for Lists
- Urgent update renders first
- React immediately re-renders with the new urgent value
- Lesson 1445 — When Deferred Values Update
- urgent updates
- and **transition updates**.
- Lesson 1433 — Urgent vs Transition Updates PrioritizationLesson 1440 — Transitions Don't Make Code FasterLesson 2302 — What useTransition Does: Marking Updates as Non-Urgent
- Urgent updates always win
- React interrupts transition rendering
- Lesson 1433 — Urgent vs Transition Updates Prioritization
- Urgent value
- The search input itself (updates immediately)
- Lesson 1448 — Deferring Expensive List Filters
- URL structure aids comprehension
- `/dashboard/analytics` reads better than `/dashboard-analytics`
- Lesson 1842 — When to Nest vs Flatten Routes
- Use `componentDidUpdate`
- to respond to prop changes with side effects
- Lesson 302 — getDerivedStateFromProps: Syncing State to Props
- Use `ReactElement[]` when
- Lesson 2348 — Arrays of Children: ReactNode vs ReactElement[]
- Use `ReactNode` when
- Lesson 2348 — Arrays of Children: ReactNode vs ReactElement[]
- Use `useMemo` inline
- when your computation **depends on props or state**:
- Lesson 699 — When to Extract vs Inline with useMemo
- Use absolute paths
- rarely, when you need to escape the parent's path for architectural reasons while maintaining the component hierarchy.
- Lesson 1835 — Path Construction in Nested Routes
- Use API routes when
- Lesson 1609 — When to Use Server Actions vs API Routes
- Use behavior props
- when consumers need to customize logic conditionally:
- Lesson 1182 — When State Reducer is Overkill
- Use callbacks
- when consumers need to react to state changes or inject side effects:
- Lesson 1182 — When State Reducer is Overkill
- Use case
- Web components, testing selectors, or progressive enhancement scripts often need custom attributes.
- Lesson 103 — Custom Attributes: When They Work and When They're StrippedLesson 1779 — Initial 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 1854 — shouldRevalidate 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 1154 — The Flexibility vs Simplicity Tradeoff
- Use conditional rendering when
- Lesson 1963 — Conditional Rendering vs Visibility Transitions
- Use Context
- (adds complexity, potential re-render issues)
- Lesson 1778 — Sharing Data Across ComponentsLesson 2315 — When Lifting Down Breaks Communication
- Use controlled props
- when consumers need to override specific state values:
- Lesson 1182 — When State Reducer is Overkill
- Use experimental features
- (new libraries, beta APIs)
- Lesson 1311 — Component-Level Boundaries for Risky Code
- Use functional updates
- or `useRef` in those handlers to avoid dependencies that change
- Lesson 946 — Memoizing Component Lists with Map Callbacks
- Use headless libraries when
- Lesson 1194 — The Trade-Off: Bundle Size vs Custom HTML
- Use Hooks when
- Lesson 1076 — Choosing the Right Pattern for Your API
- Use inline types when
- Lesson 2332 — Inline Props Types vs Named Interfaces
- Use it sparingly
- Only apply it to elements where the mismatch is unavoidable (timestamps, random IDs, browser- only features).
- Lesson 101 — suppressHydrationWarning: The Escape Hatch
- Use labels
- to mark important moments and build from them
- Lesson 2012 — GSAP for Complex Timeline Animations
- Use metadata APIs
- in new pages while old pages keep their helmet solution
- Lesson 1521 — Migration Strategy: Incremental Adoption
- Use named interfaces when
- Lesson 2332 — Inline Props Types vs Named Interfaces
- Use nested boundaries
- for hierarchical, progressive disclosure:
- Lesson 1377 — Multiple Suspense Boundaries: Nested vs Sibling
- Use props
- when the parent component should be in charge (display a user's name passed from above)
- Lesson 228 — Props 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 161 — Debugging Key-Related Issues
- Use React DevTools Profiler
- to record actual render times
- Lesson 837 — Measuring Before OptimizingLesson 875 — Reading the React Docs on When to Memoize
- Use relative paths
- (99% of cases) when the child logically belongs under the parent in your URL structure.
- Lesson 1835 — Path Construction in Nested Routes
- Use Render Props when
- Lesson 1076 — Choosing the Right Pattern for Your API
- Use Server Actions when
- Lesson 1609 — When to Use Server Actions vs API Routes
- Use sibling boundaries
- when you have independent features on the same page:
- Lesson 1377 — Multiple Suspense Boundaries: Nested vs Sibling
- Use stable keys
- that represent the actual identity of your data.
- Lesson 1273 — Memory Leaks from Incomplete Cleanup
- Use state
- when the component itself needs to manage the value (track whether a toggle is on/off)
- Lesson 228 — Props vs State: Who Owns the Data
- Use those primitives
- inside your memoized function
- Lesson 880 — Extracting Primitive Values from Objects
- Use visibility transitions when
- Lesson 1963 — Conditional Rendering vs Visibility Transitions
- Used on every page
- shared layouts, common UI components
- Lesson 1358 — Lazy vs Eager: When Each is Right
- user actions
- like clicks, form submissions, or keyboard input.
- Lesson 658 — The 'Handle Event in Effect' AntipatternLesson 2036 — The Mental Model: Black Box Testing
- User authentication
- (login state, user profile) — changes on login/logout
- Lesson 839 — Identifying Independent State Domains
- User context
- Who triggered the action
- Lesson 769 — Meta Fields: Adding Timestamps, IDs, or MetadataLesson 1410 — The Prefetch/Import Timing Tradeoff
- User context switches
- Clear errors when a different user logs in or when switching between accounts.
- Lesson 1327 — resetKeys for Automatic Recovery
- User experience
- Extra loading states mean more spinners, more layout shifts
- Lesson 642 — Client-Side Fetching: The Hidden Cost
- User impact severity
- – Did one button break, or the entire app?
- Lesson 1316 — Contextual Error Messages by Location
- User intent alignment
- Code loads when users actually need it
- Lesson 1423 — Route-Level Splitting: The Sweet Spot
- User interactions
- A search box that filters results as you type needs immediate, client-side data fetching.
- Lesson 1573 — Client-Side Data Fetching Still Exists
- User Profile
- Basic user info (name, avatar) that many components display but rarely updates.
- Lesson 1690 — Context for Simple App-Wide State
- User types something
- Lesson 465 — Controlled: State Drives the DOM
- User-perceptible lag
- Typing feels sluggish, scrolling stutters, or interactions feel delayed
- Lesson 2237 — Tracking vs Fixing: When to Act
- Users need immediate feedback
- There's a text input or button that must feel responsive
- Lesson 1436 — When useTransition Actually Helps
- Users see magic
- from their perspective, components "just work" together
- Lesson 1090 — Creating a Private Context for Compound Components
- Utility functions
- are plain JavaScript functions that perform calculations or transformations without any React features.
- Lesson 970 — Custom Hooks vs Utility FunctionsLesson 1713 — Reading State Without Subscribing
- Utils folder
- If it's a plain function doing calculations, transformations, or formatting.
- Lesson 64 — Common Top-Level Folders: hooks, utils, types
V
- Validation
- You control exactly what appears in the input
- Lesson 462 — Why Controlled Components Re-render on Every Change
- Validation before storage
- You can reject or transform input before it reaches state
- Lesson 1195 — Controlled Forms: Single Source of Truth Principle
- value
- Bind the input's displayed value to that state
- Lesson 453 — The Basic Pattern: useState + value + onChangeLesson 633 — Why Objects in Dependencies Cause Re-runsLesson 870 — useMemo vs useCallback: The RelationshipLesson 915 — When Props Are Primitives: Automatic WinsLesson 1447 — useDeferredValue vs useTransition
- Value-tracking animations
- Following a moving target (cursor, scroll position) where the destination keeps changing
- Lesson 2011 — React Spring for Natural, Physics-Based Motion
- vanilla-extract
- , and **Panda CSS** shift style extraction to **build time**.
- Lesson 1931 — Performance Tradeoffs: Runtime Style InjectionLesson 1932 — Migration Path: When to Consider AlternativesLesson 1933 — What Zero-Runtime Means
- Variable assignment example
- Lesson 127 — Using if/else Before Return
- Variables
- Lesson 215 — Curly Braces for Non-String ValuesLesson 220 — Passing Variables and Expressions
- Verbose code
- Every intermediate component must accept and pass along props it doesn't need
- Lesson 266 — What is Prop Drilling?
- Verify prop types
- Remove non-serializable props (functions, Dates, class instances)
- Lesson 1545 — Debugging Boundary Violations
- Verify proper splits
- Each lazy-loaded route should appear as its own chunk file.
- Lesson 1402 — Route-Based Bundle Analysis
- Verifying the fallback UI
- renders when the error occurs
- Lesson 2136 — Why Error Boundaries Need Special Testing
- Vertical stacking
- Shows component hierarchy (children appear below parents)
- Lesson 71 — Reading Profiler FlamegraphsLesson 2269 — Reading Profiler Flamegraphs
- Very simple components
- (2-3 lines) that exist purely to support one main component
- Lesson 201 — One Component Per File (Usually)
- Via inline styles
- Lesson 1958 — Adding transition Property to React Components
- Views
- that *listened* to those events and re-rendered themselves
- Lesson 20 — Backbone.js: MVC in the Browser
- Virtual DOM
- a JavaScript representation of your UI that lives in memory.
- Lesson 12 — The Virtual DOM ConceptLesson 25 — Svelte: Compile-Time ReactivityLesson 408 — The Virtual DOM (Reconciliation)
- Visibility checks
- Lesson 2167 — Assertions with expect()
- Visual continuity
- Keep the error message in the same location as the loading spinner.
- Lesson 1320 — Loading-to-Error Transition Design
- Visual distinction
- Action types stand out immediately in your code.
- Lesson 767 — Naming Action Types: SCREAMING_SNAKE_CASE
- Visual glitches
- Components animate to wrong positions, or content "jumps" during updates.
- Lesson 161 — Debugging Key-Related IssuesLesson 439 — Batching Hides Individual Updates
- Visual hierarchy is clear
- Settings → Profile → Avatar feels naturally nested
- Lesson 1842 — When 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 1312 — Avoiding Boundary Overuse
- Visual options
- `disabled`, `placeholder`, `className`
- Lesson 1170 — Prop 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 2024 — Why Vitest Over Jest for Modern React
- Vite/CRA
- Requires manual webpack/Babel plugin setup
- Lesson 1512 — Compiler Adoption Timeline and Stability
- Vitest
- is your test runner—it finds, executes, and reports on your tests.
- Lesson 2025 — Installing Vitest and Testing Dependencies
W
- WAI-ARIA compliant components
- by simply assembling the compound parts correctly.
- Lesson 1104 — Accessibility 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 1512 — Compiler Adoption Timeline and Stability
- Waiting for the server
- – users see a loading spinner while the mutation completes
- Lesson 609 — Optimistic Updates and Mutations Made Simple
- Wasted renders
- Empty render → loading render → data render (three renders for one piece of data)
- Lesson 642 — Client-Side Fetching: The Hidden Cost
- waterfalls
- sequential chains where one data fetch must complete before the next can begin.
- Lesson 1625 — Server for Data Fetching Without WaterfallsLesson 1843 — The Data Router Paradigm Shift in v6.4Lesson 2292 — Avoiding Over-Splitting
- Web Components
- are built directly into browser standards.
- Lesson 27 — Web Components: Standards-Based Approach
- Webpack
- as its bundler, which works but is significantly slower than modern alternatives like Vite.
- Lesson 49 — Create React App: The Legacy StandardLesson 54 — Webpack from Scratch
- WebSockets
- , **Server-Sent Events (SSE)**, or **GraphQL subscriptions**, libraries like TanStack Query don't handle these out of the box.
- Lesson 611 — When useEffect Data Fetching Still Makes Sense
- what
- it does.
- Lesson 310 — Giant Components and Related Logic ScatteredLesson 658 — The 'Handle Event in Effect' AntipatternLesson 1044 — Sharing Stateful Logic with Render Props
- What cannot cross
- Lesson 1587 — What Can Cross the Server-Client Boundary
- What does NOT ship
- Lesson 1933 — What Zero-Runtime Means
- What doesn't work
- Lesson 1528 — Props Must Be Serializable
- What goes wrong
- On first render when `userId` is null, React records zero hooks.
- Lesson 1027 — Calling Hooks After Early Returns
- What happens
- Server renders `className="light"`.
- Lesson 1657 — Common Cause: Conditional Rendering Based on State
- What the transpiler does
- It transforms your clean JSX into these calls
- Lesson 76 — JSX Without a Transpiler: The Raw API
- What to look for
- Lesson 2021 — Measuring Frame Rate with DevTools
- What works
- Lesson 1528 — Props Must Be Serializable
- What's wrong with this
- Lesson 820 — The Component Tree Depth Problem
- when
- it runs, not by **what** it does.
- Lesson 310 — Giant Components and Related Logic ScatteredLesson 658 — The 'Handle Event in Effect' AntipatternLesson 1584 — Cache and Revalidation PatternsLesson 2214 — Recording on Page Load vs On Interaction
- When Context loses
- Lesson 2257 — Comparing Context Overhead to Alternatives
- When prop drilling wins
- Lesson 2257 — Comparing Context Overhead to Alternatives
- When resolved
- , React triggers a re-render of the suspended subtree
- Lesson 1339 — How Suspense Detects 'Not Ready'
- When SEO Doesn't Matter
- Internal tools, browser extensions, desktop-like web apps (Slack, Discord).
- Lesson 1673 — CSR Trade-offs: Interactivity vs Initial Load
- When successful
- Neither boundary activates, content renders normally
- Lesson 1381 — Suspense Boundaries and Error Boundaries Together
- When the component unmounts
- (leaves the screen)
- Lesson 550 — What Cleanup Functions AreLesson 553 — When Cleanup Runs: On UnmountLesson 590 — Wiring AbortController into useEffect Cleanup
- When the Promise resolves
- , React retries rendering the component
- Lesson 1348 — What 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 2388 — Typing useMemo and useCallback
- When to expose
- You want to control which operations are allowed (encapsulation).
- Lesson 728 — Forwarding Refs to Nested Components
- When to forward
- The parent needs full DOM access (measuring, scrolling).
- Lesson 728 — Forwarding Refs to Nested Components
- When to use it
- For user-facing pages where you want the fastest possible First Contentful Paint (FCP).
- Lesson 1668 — The onShellReady and onAllReady Callbacks
- When Valtio's pattern shines
- Lesson 1762 — Direct Mutations vs Immutable Updates
- Which components are slowest
- Look for the widest, brightest bars
- Lesson 2223 — Reading the Profiler Flamegraph
- Which components got memoized
- Verify expensive renders are wrapped
- Lesson 1510 — Debugging Compiler Output
- Which components rendered
- during your interaction
- Lesson 70 — Profiler Tab: Recording Performance SessionsLesson 2211 — Understanding Commit Information
- Which errors
- are happening in production
- Lesson 1330 — Why Log Errors Remotely: Visibility into Production
- Which prop changed
- (and shows old vs new values)
- Lesson 2229 — The 'Record why each component rendered' Setting
- Which props changed
- between renders (with old and new values)
- Lesson 2212 — Identifying Why a Component Rendered
- Which state variable updated
- Lesson 2229 — The 'Record why each component rendered' Setting
- Which users
- are affected (browser, device, location)
- Lesson 1330 — Why Log Errors Remotely: Visibility into Production
- While loading
- Suspense shows the spinner
- Lesson 1381 — Suspense Boundaries and Error Boundaries Together
- Who consumes it
- (Only the header needs user info; only one modal needs form data)
- Lesson 839 — Identifying Independent State Domains
- why
- `useTransition` and `useDeferredValue` exist.
- Lesson 1454 — Synchronous Updates: Legacy Default BehaviorLesson 1462 — Identifying Heavy Renders with ProfilerLesson 2225 — Comparing Renders: Why Did This Update Happen?Lesson 2268 — Profiling Before Adding memo
- Why components rendered
- (props change, state change, parent re-rendered)
- Lesson 70 — Profiler Tab: Recording Performance Sessions
- Why does this happen
- JavaScript methods aren't bound to their object by default.
- Lesson 292 — Binding Event Handlers: The this Problem
- Why each component rendered
- (props change, state change, parent rendered, hooks changed)
- Lesson 2211 — Understanding Commit Information
- Why each property matters
- Lesson 1963 — Conditional Rendering vs Visibility Transitions
- Why it fails
- `"Click me"` is a string, not a `ReactElement`.
- Lesson 2349 — Common Children Typing Pitfalls
- Why JSX exists
- Writing nested UIs this way is brutally verbose
- Lesson 76 — JSX Without a Transpiler: The Raw API
- Why optimization failed
- Look for dynamic dependencies or non-compiler-friendly patterns
- Lesson 1510 — Debugging Compiler Output
- Why pass `props`
- Passing `props` to `super()` ensures that `this.
- Lesson 290 — constructor() and super(props)
- Why the difference
- JSX is JavaScript, not HTML.
- Lesson 96 — camelCase Attributes: style, onClick, onChange
- Why the exception
- Because `use()` reads values (Promises or Context) rather than creating stateful slots.
- Lesson 1475 — Conditional use() Calls: Breaking Hook Rules Intentionally
- Why this happens
- Arrow functions are expressions.
- Lesson 2244 — Callback Props with Inline Arrow Functions
- Why this matters
- Imagine testing how your button looks when the `isLoading` state is `true`.
- Lesson 69 — Editing Props and State Live
- Why this pattern exists
- Lesson 305 — Common Lifecycle Patterns: Fetch on Mount
- 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 1205 — Nested State Structures for Forms
- Wide cascades
- Many components at different tree levels all rendering simultaneously
- Lesson 2322 — Measuring Context Performance Impact
- Wide subtrees
- where many children render because of one parent
- Lesson 2216 — Identifying Cascading Renders in the Flame Graph
- width
- of each bar indicates how long that component took to render—wider bars mean slower renders.
- Lesson 2223 — Reading the Profiler FlamegraphLesson 2269 — Reading Profiler Flamegraphs
- With `React.memo`
- Child components disappear from recordings when their props stay the same (referentially equal)
- Lesson 918 — Demonstrating Skipped Renders with DevTools Profiler
- With controlled components
- Lesson 463 — What 'Single Source of Truth' MeansLesson 513 — Forms with Minimal State Requirements
- With HMR
- You save the file → button text updates instantly → counter *stays at 47*.
- Lesson 43 — Hot 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 282 — Combining 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 282 — Combining Render Props with Other Patterns
- With JavaScript
- React Router intercepts the submission, calls your action function, and updates the UI without reloading.
- Lesson 1849 — Form 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 1601 — Server Actions in Forms: The action Prop
- With memoized children
- Lesson 898 — useCallback for Stable Function References
- With proper keys
- Lesson 150 — What the Key Prop Actually Does
- With Provider
- Atoms get a fresh scope for that subtree
- Lesson 1727 — The 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 1227 — Performance Comparison: RHF vs Controlled
- With Server Components
- , you skip the middle steps entirely:
- Lesson 1551 — Data 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 1254 — Keys and React's Reconciliation Algorithm
- With TypeScript
- , you'll get a compile-time error before your code even runs:
- Lesson 226 — The Error When You Try to Mutate Props
- With useEffect
- Lesson 564 — The Performance Cost of useLayoutEffect
- With useLayoutEffect
- Lesson 564 — The Performance Cost of useLayoutEffect
- Without `React.memo`
- Child components appear in every profiler recording when the parent re-renders
- Lesson 918 — Demonstrating 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 892 — Real Example: Filtering and Sorting Large Lists
- Without controlled components
- Lesson 463 — What 'Single Source of Truth' Means
- Without HMR
- You save the file → browser refreshes → counter resets to 0 → you have to click 47 times again.
- Lesson 43 — Hot Module Replacement (HMR)
- without JavaScript
- (progressive enhancement), and when JS loads, React upgrades it to a smooth, no-refresh experience.
- Lesson 1610 — Server Actions as Form HandlersLesson 1849 — Form Component: Progressive Enhancement
- Without JS
- The browser does a traditional form POST.
- Lesson 1601 — Server Actions in Forms: The action Prop
- Without proper keys
- Lesson 150 — What the Key Prop Actually Does
- Wizards and Onboarding
- Lesson 1758 — When XState Fits: Complex Workflows and Multi-Step Processes
- Works with existing tools
- Tailwind plays nicely with CSS Modules, CSS variables, and even CSS-in-JS for edge cases.
- Lesson 1953 — Tailwind's Rise as the Pragmatic Middle Ground
- Works with progressive enhancement
- even without JavaScript, forms still submit once
- Lesson 1494 — Building Disabled Submit Buttons
- Wrap boundaries around
- Lesson 1380 — Finding the Right Granularity
- Wrap callbacks
- passed to that child with `useCallback`
- Lesson 2286 — Combining memo, useMemo, and useCallback
- Wrap conditional content
- `AnimatePresence` must be the parent of conditionally rendered `motion` elements
- Lesson 1979 — AnimatePresence for Enter/Exit Animations
- Wrap object/array values
- passed to that child with `useMemo`
- Lesson 2286 — Combining memo, useMemo, and useCallback
- 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 193 — Wrapper Components for Shared BehaviorLesson 252 — Wrapper Components with Children
- Wrapper component proliferation
- If everyone creates wrapper components to simplify your API, you've pushed complexity onto users.
- Lesson 1163 — When Inversion Becomes Over-Engineering
- Wrapper components
- `<DialogTitle>`, `<DialogContent>`, etc.
- Lesson 1120 — The Problem Slots Solve: Multiple Content Areas
- Wrapper elimination
- Avoid rendering containers for empty slots
- Lesson 1133 — Optional Slots with Conditional Rendering
- Write Context
- Holds the dispatch function or setter functions
- Lesson 843 — Read-Only vs Write-Only Context Split
- Write your component naturally
- without memoization
- Lesson 875 — Reading the React Docs on When to Memoize
- Writing framework adapters
- Code that bridges React to other systems might require non-standard hook patterns
- Lesson 1040 — Library Authors: When You Actually Need Overrides
- wrong
- .
- Lesson 615 — The Classic Stale Closure BugLesson 629 — The Empty Dependency Array Escape Hatch Gone Wrong
- Wrong abstraction
- You're treating synchronous data (props) as an asynchronous event
- Lesson 683 — The Props-Change-Triggers-Effect Antipattern
- Wrong components update
- When you reorder items, React might update the wrong DOM nodes
- Lesson 142 — The Key Prop Requirement
- Wrong content
- You edit "Item A" but "Item B" changes instead.
- Lesson 161 — Debugging Key-Related Issues
- Wrong solution
- The real issue might be needing `useCallback` or functional updates, but auto-fix just adds the problematic dependency
- Lesson 1023 — Auto-Fix Behavior and Pitfalls
Y
- Yes
- → Controlled is necessary (live character counters, conditional field display, real-time validation)
- Lesson 513 — Forms with Minimal State RequirementsLesson 1447 — useDeferredValue vs useTransitionLesson 1679 — Decision Matrix: Choosing the Right Rendering Strategy
- You catch real bugs
- typos in `mapStateToProps`, wrong context key, broken hooks.
- Lesson 2123 — When Container/Presentational Split Doesn't Matter
- You need GraphQL-specific tooling
- fragment composition, automatic TypeScript generation from schema, Apollo DevTools graph visualization
- Lesson 1830 — When Apollo Fits vs TanStack Query
- You need proven stability
- React Router has years of production use across millions of apps
- Lesson 1885 — When TanStack Router Fits vs React Router
- You need routing flexibility
- Client-only SPAs, hybrid approaches, or custom route organization beyond file-system constraints
- Lesson 1893 — When Next.js Routing Fits vs React Router
- You provide a function
- that returns a dynamic `import()` statement
- Lesson 1348 — What React.lazy() Does Under the Hood
- You validate the values
- (check for empty fields, format, length, etc.
- Lesson 520 — Combining Uncontrolled Inputs with Validation
- You verify the integration
- does the selector work?
- Lesson 2123 — When Container/Presentational Split Doesn't Matter
- You want abundant resources
- More tutorials, Stack Overflow answers, and third-party integrations exist
- Lesson 1885 — When TanStack Router Fits vs React Router
- You want explicit dependencies
- seeing props makes data flow obvious
- Lesson 808 — Context vs Props: Choosing the Right Tool
- You want framework independence
- React Router works with any bundler or backend—no Next.
- Lesson 1893 — When Next.js Routing Fits vs React Router
- You want minimal setup
- for proof-of-concepts or simple apps
- Lesson 1482 — When use() Fits vs TanStack Query or Loaders
- You write normal components
- without thinking about the boundary
- Lesson 1536 — Default is Server: The New Mental Model
- You're animating CSS properties
- like `opacity`, `transform`, `background-color`
- Lesson 2009 — CSS Transitions for Simple State Changes
- You're building library code
- where consumers need maximum flexibility in rendering
- Lesson 284 — Render Props vs Hooks: The Modern Tradeoff
- You're testing integration points
- The value is in how pieces work *together*
- Lesson 2083 — When NOT to Mock: Testing Philosophy
- You're using REST APIs
- or a mix of data sources (REST + WebSockets + custom endpoints)
- Lesson 1830 — When Apollo Fits vs TanStack Query
- Your Build Tool's Output
- Lesson 82 — Inspecting Compiled JSX Output
- Your component
- calls the consumer's reducer with the current state, action, and any changes you were planning to make
- Lesson 1177 — Consumer-Provided Reducer Override
- Your tests survive refactoring
- merge container and presentational?
- Lesson 2123 — When Container/Presentational Split Doesn't Matter
- Yup
- was the de facto standard for schema-based form validation in React.
- Lesson 1232 — Validation with Yup Integration
Z
- zero JavaScript
- to the client.
- Lesson 1523 — The Zero-JS Promise: When It's TrueLesson 1562 — Improved Time to InteractiveLesson 1651 — Resumability: Qwik's Alternative to Hydration
- Zero JavaScript by default
- your component doesn't ship code to the browser unless it needs to
- Lesson 1621 — The Default: Start with Server Components
- Zero-runtime
- means your styling solution extracts all CSS at **build time** and ships static `.
- Lesson 1933 — What Zero-Runtime Means
- Zero-runtime CSS solutions
- like vanilla-extract work fine because they generate CSS at build time—no browser JavaScript needed.
- Lesson 1951 — Server Components Break Runtime CSS-in-JS
- Zod
- is a TypeScript-first schema validation library.
- Lesson 1225 — Schema Validation with Zod Resolver
- Zombie fetch requests
- updating unmounted components
- Lesson 601 — Why React Does This: Finding Missing Cleanup
- Zustand
- and **Jotai** take a different path: they don't use context at all.
- Lesson 863 — Alternatives: Zustand and JotaiLesson 2257 — Comparing Context Overhead to Alternatives