If you're starting your journey to conquer React, there's one concept you'll encounter repeatedly, a foundational idea that shapes the entire architecture of this library. That is the Component.
Imagine you're playing with LEGO blocks. Instead of building a complex castle from a single plastic block, you assemble it from hundreds of smaller bricks: walls, windows, watchtowers, gates... Each of these bricks is an independent unit with its own function and can be reused.
In the React world, Components are those LEGO blocks. They are the basic building blocks, independent and reusable, to create user interfaces (UI) for your applications. From a simple button, a search bar to an entire complex website, all are composed of Components.
This article will help you understand "What is a React Component", why they are important and how to use them most effectively.
1. Core Definition: What is a React Component?
Technically, a Component in React is a JavaScript function or class that receives input data (called props) and returns a React element. This element describes what will be displayed on the screen.
In simpler terms:
A Component is an independent UI piece. It manages its own logic, state, and HTML structure. By combining multiple Components together, we create a complete application.
For example, a product information page can be divided into Components:
NavigationBar
ProductImageGallery
ProductDetails
AddToCartButton
CustomerReviews
2. Why are Components so Important?
React's power doesn't lie in displaying data, but in how it organizes and manages interfaces through Components. This philosophy brings enormous benefits:
- Reusability: You can write a
Button
Component once and use it in 20 different places in your application. If you need to change the design of all buttons, you only need to modify it in one place. This follows the DRY principle (Don't Repeat Yourself). - Divide and Conquer: Instead of working with a huge, messy HTML/JS file, you break down the interface into simple, manageable Components. Debugging, maintenance, and upgrades become much easier. One developer can work on the
SearchBar
Component while another focuses onUserProfile
without affecting each other. - Independent Thinking: Each Component can have its own "memory" (called state). For example, the
SearchBar
Component can manage the text the user is typing without bothering other parts of the application. This helps reduce complexity and unwanted errors.
3. Two Main Types of Components in React
In React, there are two main ways to create a Component: Function Component and Class Component.
a. Class Component (Traditional Approach)
This is the original way to create Components in React. They are classes that inherit from React.Component
and must have a render()
method to return JSX (syntax that looks like HTML in JavaScript).
Characteristics:
- Uses
class
to define. - Manages state through
this.state
. - Accesses props through
this.props
. - Uses lifecycle methods like
componentDidMount
,componentDidUpdate
.
Example of Class Component:
import React from 'react'
class WelcomeMessage extends React.Component {
constructor(props) {
super(props)
this.state = {
message: 'Welcome to the React world!',
}
}
render() {
// Return JSX to display UI
return <h1>{this.state.message}</h1>
}
}
export default WelcomeMessage
b. Function Component (Modern and Recommended Approach)
Initially, Function Components were just simple functions that received props
and returned JSX (also called "stateless functional components"). However, with the introduction of React Hooks (from version 16.8), they can now manage state and other features without using class
.
Characteristics:
- Is a regular JavaScript function.
- Shorter, more readable and easier to write syntax.
- Uses
useState
Hook to manage state. - Uses
useEffect
Hook to handle side effects (replacing lifecycle methods). - This is the recommended approach for new React projects.
Example of equivalent Function Component:
import React, { useState } from 'react'
function WelcomeMessage(props) {
// Use useState Hook to create and manage state
const [message, setMessage] = useState('Welcome to the React world!')
// Return JSX to display UI
return <h1>{message}</h1>
}
export default WelcomeMessage
Which type should you use? > Use Function Components with Hooks. The React community has been and is strongly shifting in this direction due to simplicity, efficiency, and better logic reusability. You should only learn Class Components to be able to read and maintain old projects.
4. "Communication" Between React Components: props and state
If Components are buildings, then props
and state
are the electrical and water systems that help them operate and interact with each other.
a. Props
Props
(short for properties) is the way to pass data from parent Component to child Component. Think of them as function parameters.
- Data flows in one direction: from top to bottom (one-way data flow).
- Props are immutable: Child Components can only read
props
but cannot change them.
// Parent Component: App.js
function App() {
return (
<div>
{/* Pass 'name' prop to child Component 'UserProfile' */}
<UserProfile name="Alice" age={28} />
<UserProfile name="Bob" age={32} />
</div>
)
}
// Child Component: UserProfile.js
function UserProfile(props) {
// Receive and use props from parent
return (
<div className="user-profile">
<h2>Name: {props.name}</h2>
<p>Age: {props.age}</p>
</div>
)
}
b. State
State
is data managed by the Component itself and can change over time (e.g., user interactions). When state
changes, React will automatically re-render that Component to update the interface.
State
is private and completely controlled by that Component.- It is the "memory" of the Component.
// A countdown timer Component
import React, { useState, useEffect } from 'react'
function CountdownTimer() {
// Initialize 'seconds' state with initial value of 60
const [seconds, setSeconds] = useState(60)
useEffect(() => {
// If 'seconds' is greater than 0, set up a timer
if (seconds > 0) {
const timerId = setTimeout(() => {
// Update state, causing Component to re-render
setSeconds(seconds - 1)
}, 1000)
// Clean up timer when component is destroyed
return () => clearTimeout(timerId)
}
}, [seconds]) // useEffect will run again each time 'seconds' changes
return (
<div>
<h1>Time remaining: {seconds} seconds</h1>
</div>
)
}
In this example, every second the seconds
state is updated, causing the <h1>
tag to display the new value.
Summary: Mastering Components is the Key to Conquering React
Understanding Components is not just learning one part of React, but grasping its core philosophy.
- What is a Component? Independent, reusable UI building blocks, written as Class or Function.
- Why use them? Because they make applications easier to develop, maintain and scale.
- How do they interact? Through
props
(passing data from parent to child) andstate
(Component's internal data). - Where to start? Focus on Function Components and learn to use basic Hooks like
useState
anduseEffect
.
When you start seeing every web interface as a tree of nested Components, that's when you truly begin to "think in React". And from there, building modern, powerful, and flexible web applications will be within your reach.
Good luck on your journey to conquer React!