Skip to main content

State Management, Data Fetching & Caching

THE REAL PROBLEM: TOO MUCH STATE​

State is the hardest problem in frontend engineering.

Why?

  • state changes over time

  • state comes from many sources

  • state can be stale

  • state can be duplicated

  • state can conflict

Average engineers add state until things “work”.

Elite engineers remove state until correctness remains.


THE 4 TYPES OF FRONTEND STATE​

Elite engineers classify state explicitly.

1️⃣ UI State​

Examples:

  • modal open/closed

  • selected tab

  • dropdown expanded

  • loading spinner visible

Characteristics:

  • local

  • ephemeral

  • resets easily

👉 Keep this local to components.


2️⃣ Client State​

Examples:

  • form input values

  • wizard progress

  • temporary drafts

Characteristics:

  • user-owned

  • often mutable

  • sometimes persisted

👉 Use local state or scoped stores.


3️⃣ Server State​

Examples:

  • user profile

  • application data

  • lists, feeds

  • permissions

Characteristics:

  • source of truth is backend

  • async

  • cacheable

  • can be stale

👉 Never manage this manually.


4️⃣ Derived State​

Examples:

  • computed totals

  • filtered lists

  • validation flags

Characteristics:

  • should be derived, not stored

👉 If you store derived state, bugs multiply.


Elite Rule​

If state can be derived, don’t store it.


SERVER STATE IS NOT CLIENT STATE​

This is one of the most important frontend insights.

Server state:

  • comes from APIs

  • can be refetched

  • can be invalidated

  • can be cached

  • can be stale

Treating server state like local state causes:

  • race conditions

  • stale UIs

  • duplicate logic

  • massive complexity


Correct Approach​

Use a server-state library (React Query / TanStack Query / SWR).

They handle:

  • caching

  • refetching

  • deduplication

  • retries

  • background refresh

  • stale data

Elite engineers delegate server state management.


DATA FETCHING AS A STATE MACHINE​

Every API call has states:

Elite engineers model this explicitly.

They do not:

  • guess loading states

  • mix multiple requests blindly

  • assume order of arrival


Race Condition Example​

User types fast → multiple requests fire → responses return out of order.

Elite solutions:

  • cancel previous requests

  • ignore stale responses

  • use query keys correctly


CACHING IN FRONTEND SYSTEMS​

Caching is not optional.

Without caching:

  • UIs flicker

  • network usage explodes

  • performance feels bad


What Frontend Should Cache​

  • server state

  • lists

  • read-heavy data

  • reference data


Cache Invalidation (Frontend Reality)​

Cache invalidation happens when:

  • mutation succeeds

  • user logs out

  • context changes (org, account)

  • time-based staleness

Elite engineers think:

“What must be invalidated when this changes?”


Elite Rule​

Stale data is better than broken UI.


MUTATIONS & OPTIMISTIC UPDATES​

Mutations change server state.

They introduce complexity:

  • latency

  • failure

  • retries

  • UI consistency


Optimistic Update Model​

  1. Update UI immediately

  2. Send request

  3. If success → keep

  4. If failure → rollback

Used for:

  • likes

  • toggles

  • reordering

  • quick feedback actions


Elite Rule​

Optimistic updates require easy rollback.

If rollback is complex → don’t do optimistic updates.


PREVENTING FRONTEND RACE CONDITIONS​

Race conditions happen when:

  • multiple requests overlap

  • state updates interleave

  • async effects collide

Elite prevention techniques:

  • request cancellation

  • versioning requests

  • scoping effects

  • avoiding shared mutable state


Example Technique​

Store a request ID and only apply the latest response.


ERROR HANDLING AS A UX FEATURE​

Errors are not edge cases.

They are part of normal operation.


Elite Error UX​

  • visible but calm

  • actionable

  • retryable

  • non-destructive

Never:

  • crash entire app

  • show raw error text

  • hide failures silently


Error Boundaries​

Elite engineers:

  • isolate failure

  • prevent cascade

  • show fallbacks


FORMS: THE HARDEST FRONTEND PROBLEM​

Forms combine:

  • client state

  • validation

  • async calls

  • error handling

  • accessibility

Elite form principles:

  • validate early

  • validate often

  • separate UI vs validation logic

  • treat submission as a workflow


Form State Machine​

Same pattern as backend workflows — just smaller.


COMMON STATE MANAGEMENT TRAPS​

❌ Global store for everything

❌ Storing derived state

❌ Manual server state handling

❌ Mixing UI and business logic

❌ Multiple sources of truth

❌ Over-fetching

Elite engineers actively remove these.


HOW ELITE FRONTEND ENGINEERS WORK​

They:

  • sketch state diagrams before coding

  • choose minimal state

  • separate concerns ruthlessly

  • let libraries handle hard problems

  • test failure paths

  • optimize for clarity over cleverness


SIGNALS YOU’VE MASTERED STATE & DATA​

You know you’re there when:

  • your UIs rarely desync

  • loading/error states feel natural

  • bugs reduce dramatically

  • code becomes simpler over time

  • new features don’t destabilize old ones