October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsWindows FixRecommendedWindows errors stealing your time? Find the fix fastScan stability, cleanup and performance issues.Fix NowOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
World desk6 min

Component-Based Architecture in React: A Practical Guide to Components and State

A practical way to decompose a React interface, decide what belongs in state, and choose between local state, lifted state, context, and custom Hooks.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Structure a React app by separating distinct UI responsibilities, rendering a static version from data and props, and adding interaction only after you know what must change. Keep each piece of state in the closest component that can coordinate all of its users; use props for direct relationships, context when forwarding a value through the tree becomes cumbersome, and custom Hooks to reuse stateful logic.

Build the component hierarchy before adding interaction

Start with the interface you need to build, then divide it into components according to distinct responsibilities and the shape of the data they display. A component should represent a useful part of the UI, not merely a fragment created to make the file shorter. React’s Thinking in React tutorial recommends moving from a mockup to a component hierarchy, then building a static version before connecting interactions.

  1. Identify the visual and functional regions. Look for parts that have their own purpose, repeated structure, or distinct data. A product list, for example, may contain a search bar, category controls, and product rows.
  2. Choose component boundaries. Make a parent responsible for coordinating its parts and children responsible for rendering or handling a focused concern. If a component grows to handle unrelated responsibilities, divide it along those concerns.
  3. Render the static interface from data and props. Pass data into components and make them display it. This exposes the data shape and parent-child relationships without mixing in interaction logic too early.
  4. Add state and event handling. Once the static structure is clear, identify what changes and connect user actions to those changes.

This sequence is useful because component boundaries and data flow become easier to reason about when they are not entangled with every interaction from the beginning.

Decide what belongs in state

State is for information that changes over time and cannot be obtained from props or calculated from other existing data. Before adding a state variable, ask whether the UI can derive the value during rendering. Keeping both a source value and a separately stored copy of something calculated from it creates two values that can drift out of sync. React’s Managing State guide recommends minimizing state and avoiding redundant or duplicated information.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • Keep it in state when it changes in response to interaction or another event and the UI needs to remember it between renders.
  • Pass it as a prop when a parent already owns the value and a child needs it to render or respond.
  • Calculate it when it can be derived from props or other state, such as a filtered view of a list.

For each state value, list the components whose output depends on it. That set of consumers determines where ownership should live.

Choose where state ownership belongs

When multiple components must stay coordinated, place their shared state in their closest common parent and pass the value and event handlers to the children that need them. This is lifting state up: the parent becomes the single source of truth for that particular piece of state, while children receive the current value and can request changes through callbacks.

React’s accordion example illustrates the choice. If two panels must coordinate so only one is active at a time, their parent can own the active panel index and pass each panel its active status and a handler. If each panel keeps its own independent open/closed state, both could remain open. The right owner follows from the behavior the interface requires, not from a rule that all state belongs high in the tree. See Sharing State Between Components.

Local state: keep independent behavior close

Use local state when a component can manage its own behavior without coordinating with siblings or distant parts of the interface. This often makes a component straightforward to use because the parent does not need to configure every detail.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Parent-controlled state: coordinate consumers

Lift state when a parent must coordinate multiple children, enforce a shared rule, or decide how a child’s state changes. The parent supplies values and handlers, which gives it control but means it has more configuration to provide.

Controlled and uncontrolled are not strict categories

These terms describe useful design tendencies, not mutually exclusive component types. As React’s documentation puts it: “In practice, ‘controlled’ and ‘uncontrolled’ aren’t strict technical terms—each component usually has some mix of both local state and props.” A component may receive some behavior through props while managing other details locally. Choose the balance that supports its consumers, then refactor if the coordination needs change.

Use props or context according to the tree

Props are the direct parent-to-child channel. They make data dependencies visible at the point where a component is used, and are generally the clearest choice when a parent passes information to its child or a nearby descendant.

Context is an alternative for making a value available deeper in a component tree when many intermediate components would otherwise forward it without using it, or when many consumers need the same value. It changes how a consumer reads that value; it does not change the principle that each unique piece of state should have one source of truth. Different values can have owners at different levels. React explains the trade-offs in Managing State.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Approach Use it when Trade-off
Local state One component owns a value and can manage it independently. Simple to use locally, but other components cannot coordinate through it without moving ownership.
Props and lifted state A parent and its children, or several siblings, need to stay coordinated. Coordination is explicit, but the parent must provide values and handlers.
Context Many consumers or a deep tree need a value, and forwarding it through intermediate components is inconvenient. Consumers can read a shared value without every intermediate component passing it along; context is not a reason to globalize unrelated state.

The context explanation is on React’s Passing Data Deeply with Context page. Select the narrowest approach that fits the number of consumers and the coordination required.

Reuse logic with custom Hooks, not duplicate state

A custom Hook lets components share logic, including stateful behavior and Effects. For example, a Hook can encapsulate state plus an Effect that subscribes to browser connectivity events. Components can reuse that behavior without becoming the same component or automatically sharing one state instance. A Hook shares logic; context makes a value available through a component tree. React’s Reusing Logic with Custom Hooks guide discusses this distinction.

Use an Effect to synchronize with an external system, such as a browser event subscription, rather than as a general mechanism for moving ordinary application data between components. React’s Built-in React Hooks reference describes state Hooks such as useState and useReducer, useContext for reading context, and Effects for connecting to external systems.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Keep component identity and rendering behavior predictable

React associates state with a component’s position in the render tree. Component type and keys also affect whether React preserves that state or resets it. Moving a component, changing its type, or changing its key can therefore affect state lifetime; keys are not just labels for list items. When state resets unexpectedly, inspect the component’s identity and position in the rendered tree. See Preserving and Resetting State.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Predictable architecture also depends on rendering discipline. Components should be pure with respect to their inputs: rendering the same props and state should produce the same result. Do not mutate props or state, and keep side effects out of render. Call Hooks only at the top level of React components or other Hooks, following the Rules of React.

A practical ownership check

When deciding where a value or behavior belongs, work through these questions in order:

  1. Is it genuinely changing data? If it can be calculated from existing props or state, derive it instead of storing another copy.
  2. Which components depend on it? If just one component does, local ownership is usually sufficient.
  3. Must multiple components stay coordinated? Put the state in their closest common parent and pass the value and handlers down.
  4. Is forwarding the value through intermediate components becoming awkward? Consider context for that value and its consumers, rather than moving every state value into a global layer.
  5. Is the same behavior being implemented in multiple components? Extract reusable logic into a custom Hook; use context only if those components also need to read a shared value.
  6. Does state reset or rendering behave unexpectedly? Check component type, tree position, keys, mutations, and whether effects are being used to coordinate ordinary data flow.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Windows Errors? Fix Them Before They SpreadFree repair scan
Outdated Drivers Are Slowing You DownFree scan - exact matches

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.