🧬 What's a Component?
In React, components are like building blocks that help you create the user interface in a clean and organized way. Each component handles a small part of the screen—like a button, a navbar, or a footer.
You can reuse components wherever needed.
They help in dividing the UI into smaller, manageable parts.
The root component (usually
App.js) holds all the other components.
So instead of writing all your UI in one place, React lets you break it into smaller chunks (components) and combine them to build your full application.
🔍 Understanding React Components
Each component in React is either a function or a class (in older versions). It returns JSX, which looks like HTML but works inside JavaScript.
Components can receive data using something called props (short for properties).
They can also maintain their own data internally (known as state, which you'll learn later).
Components can also call other components, which makes your UI modular and scalable.
For example, a Navbar component can be used on every page of your app, and you can still customize it by passing different props.
React reads these components, processes the JSX, and renders the actual HTML in the browser.
So in simple terms, React components turn your code (JSX + logic) into real UI that users see and interact with.
<div class="infographic-components" id="rc">
<style>
.infographic-components {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-deep: #1942a8;
--accent-soft: #e3ebfd;
--line: #ddd6c9;
--radius: 8px;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', system-ui, sans-serif;
--mono-font: 'IBM Plex Mono', monospace;
max-width: 880px;
padding: 2rem;
margin: 0 auto;
box-sizing: border-box;
background: transparent;
color: var(--ink);
font-family: var(--body-font);
}
.infographic-components[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #13171f;
--paper-alt: #1c212b;
--accent: #5b8def;
--accent-deep: #8fb4ff;
--accent-soft: #20293f;
--line: #2c313d;
}
.infographic-components * { box-sizing: border-box; }
.rc-eyebrow {
font-family: var(--mono-font); font-size: 0.72rem; letter-spacing: 0.1em;
text-transform: uppercase; color: var(--accent); margin: 0 0 0.45rem;
display: flex; align-items: center; justify-content: center; gap: 0.4rem;
}
.rc-eyebrow::before { content: ""; width: 14px; height: 2px; background: var(--accent); display: inline-block; }
.rc-title {
font-family: var(--display-font); font-size: clamp(1.5rem, 4vw, 2.3rem); text-align: center;
margin: 0 0 0.4rem; line-height: 1.12; letter-spacing: -0.01em;
}
.rc-sub { color: var(--ink-soft); font-size: 0.9rem; text-align: center; margin: 0 0 1.6rem; }
/* ===== tabs ===== */
.rc-tabs { display: flex; justify-content: center; gap: 0.4rem; margin-bottom: 1.8rem; }
.rc-tab {
font: inherit; font-size: 0.78rem; font-weight: 600; font-family: var(--mono-font);
background: var(--paper-alt); border: 1.5px solid var(--line); border-radius: 100px;
padding: 0.45rem 1.1rem; cursor: pointer; color: var(--ink-soft); transition: all 0.2s;
}
.rc-tab:hover { border-color: var(--accent); color: var(--ink); }
.rc-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.rc-tab.is-active { background: var(--accent); border-color: var(--accent); color: #fff; }
/* ===== mockup ===== */
.rc-stage { display: flex; justify-content: center; margin-bottom: 1.9rem; }
.rc-mockup {
display: grid; grid-template-columns: 78px 1fr; grid-template-rows: 44px 48px 48px 48px 36px;
gap: 0px; width: 100%; max-width: 460px; padding: 34px 22px; transition: gap 0.35s ease;
}
.rc-mockup.is-exploded { gap: 13px; }
.rc-block { position: relative; border-radius: 6px; transition: box-shadow 0.35s ease, border-radius 0.35s ease; }
.rc-mockup.is-exploded .rc-block { box-shadow: 0 10px 20px -8px rgba(0,0,0,0.3); border-radius: 8px; }
.rc-navbar { grid-column: 1 / -1; grid-row: 1; background: #6366f1; }
.rc-sidebar { grid-column: 1; grid-row: 2 / 5; background: #14b8a6; }
.rc-card1 { grid-column: 2; grid-row: 2; background: #f59e0b; }
.rc-card2 { grid-column: 2; grid-row: 3; background: #f59e0b; }
.rc-card3 { grid-column: 2; grid-row: 4; background: #f59e0b; }
.rc-footer { grid-column: 1 / -1; grid-row: 5; background: #94a3b8; }
.rc-tag {
position: absolute; top: -20px; left: 0; font-family: var(--mono-font); font-size: 0.62rem;
font-weight: 600; color: #fff; background: #1a1a1a; padding: 0.18rem 0.45rem; border-radius: 4px;
white-space: nowrap; opacity: 0; transform: translateY(3px); pointer-events: none;
transition: opacity 0.15s ease, transform 0.15s ease;
}
.rc-block:hover .rc-tag { opacity: 1; transform: translateY(0); }
.rc-mockup.is-exploded .rc-tag { opacity: 1; transform: translateY(0); }
.rc-sidebar .rc-tag { top: -20px; }
@media (max-width: 480px) {
.rc-mockup { grid-template-columns: 56px 1fr; padding: 28px 12px; }
.rc-mockup.is-exploded { gap: 9px; }
}
.rc-takeaway {
text-align: center; font-family: var(--display-font); font-style: italic; font-size: 1.05rem;
color: var(--ink); max-width: 480px; margin: 0 auto; line-height: 1.5;
}
.rc-takeaway b { font-style: normal; }
@media (prefers-reduced-motion: reduce) {
.infographic-components *, .infographic-components *::before, .infographic-components *::after {
transition-duration: 0.001ms !important; animation-duration: 0.001ms !important;
}
}
</style>
<div class="rc-eyebrow">Building Blocks</div>
<div class="rc-tabs" id="rcTabs">
<button class="rc-tab is-active" data-state="assembled" type="button">Assembled</button>
<button class="rc-tab" data-state="exploded" type="button">Exploded</button>
</div>
<div class="rc-stage">
<div class="rc-mockup" id="rcMockup">
<div class="rc-block rc-navbar"><span class="rc-tag"><Navbar /></span></div>
<div class="rc-block rc-sidebar"><span class="rc-tag"><Sidebar /></span></div>
<div class="rc-block rc-card1"><span class="rc-tag"><Card /></span></div>
<div class="rc-block rc-card2"><span class="rc-tag"><Card /></span></div>
<div class="rc-block rc-card3"><span class="rc-tag"><Card /></span></div>
<div class="rc-block rc-footer"><span class="rc-tag"><Footer /></span></div>
</div>
</div>
<p class="rc-takeaway"><b>Same pieces</b>, endlessly rearranged into different pages.</p>
</div>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Fraunces:wght@500;600&family=Inter:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">
<script>
(function () {
var root = document.getElementById('rc');
if (!root) return;
/* --- dark mode detection: body attribute > cookie > postMessage > light --- */
function applyDark(dark) {
if (dark) root.setAttribute('data-theme', 'dark');
else root.removeAttribute('data-theme');
}
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') dark = true;
else if (bodyAttr === 'false') dark = false;
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
applyDark(dark);
window.addEventListener('message', function (e) {
if (e.data && e.data.type === 'darkMode') applyDark(!!e.data.value);
});
/* --- assembled / exploded toggle --- */
var tabs = root.querySelectorAll('.rc-tab');
var mockup = root.querySelector('#rcMockup');
tabs.forEach(function (t) {
t.addEventListener('click', function () {
tabs.forEach(function (o) { o.classList.remove('is-active'); });
t.classList.add('is-active');
mockup.classList.toggle('is-exploded', t.getAttribute('data-state') === 'exploded');
});
});
})();
</script>🧬 Types of Components in React
1. Functional Components
These are JavaScript functions that return JSX (which looks like HTML).
Easy to write, read, and understand.
They can receive props (data passed from a parent component).
Most commonly used type in modern React.
2. Class Components
These are built using JavaScript ES6 classes and extend from
React.Component.They have access to more built-in features like state and lifecycle methods.
Used more in older versions of React.
Now less common because functional components can handle most use cases more easily.