React Isn’t the Hard Part, Designing for Change Is

Published: (January 6, 2026 at 11:37 PM EST)
2 min read
Source: Dev.to

Source: Dev.to

Introduction

Most React tutorials teach you how to use hooks. Fewer teach you how to think in React.
After building and maintaining real‑world React applications, I’ve learned that the hardest part isn’t writing components—it’s designing systems that don’t fight you six months later.
This post isn’t about syntax. It’s about mindset.

Components Are Contracts, Not Just UI

When I design a component, I think of it as a contract:

  • What does it promise to do?
  • What does it deliberately not do?
  • How hard is it to misuse?

Patterns like compound components exist because they guide usage naturally.

// Example placeholder for a compound component pattern

This isn’t clever; it’s defensive design. It limits misuse while keeping flexibility.

State Is a Liability

Every piece of state has a cost:

  • More re‑renders
  • More edge cases
  • More bugs

Rule of thumb: If state can be derived, don’t store it.

Instead of reaching for useEffect, ask:

  • Can this be calculated?
  • Can it live closer to where it’s used?
  • Can it be moved into a hook?

Custom Hooks Are How You Tell a Story

Hooks aren’t just for reuse; they’re for meaning.

// Low‑level
useEffect(() => { /* ... */ }, []);

// High‑level
useUserSession();

The second tells future developers why something exists, not just how it works. Good hooks read like sentences.

Hook Best Practices

  • Avoid premature useMemo.
  • Favor simpler component boundaries.
  • Keep components small, with clear ownership and fewer props.
  • Performance problems often disappear when design improves.

If a useEffect feels clever, it’s probably wrong. Effects should be:

  • Small
  • Predictable
  • Easy to delete

Anything complex belongs in a hook or service layer.

Folder Structure Reflects System Thinking

Organizing by feature rather than by technical concern makes the codebase more adaptable.

features/
  auth/
  billing/
  dashboard/

Features change together, so they should live together.

Goal

My goal isn’t to write “advanced React”. My goal is to write code that:

  • Explains itself
  • Survives change
  • Makes the next feature easier, not harder

React gives us the tools. Design is what makes them work.

Back to Blog

Related posts

Read more »

Optimizing Re-Renders by Moving State

Introduction One way to improve performance and reduce unnecessary re‑renders is by lowering the state, especially if it only affects a specific part of the co...