Discover why mixing small parts beats copying big chunks in your code!
Composition vs inheritance in NextJS - When to Use Which
Imagine building a website where you copy and paste code to reuse features, then try to fix bugs in many places.
Copying code everywhere makes updates slow and causes mistakes. Inheritance chains can get tangled and hard to follow.
Composition lets you build small pieces and combine them flexibly, avoiding complex inheritance and making code easier to manage.
class Button extends BaseButton { render() { return <button>{this.props.label}</button>; } }
function Button({ label }) { return <button>{label}</button>; }Composition enables building UI from simple, reusable parts that fit together cleanly and adapt easily.
Think of a car made from parts like wheels and engine instead of inheriting from a generic vehicle; you can swap parts easily.
Inheritance can create rigid, complex code structures.
Composition builds flexible, reusable components.
Next.js apps benefit from composition for clearer, maintainable UI.
Practice
composition over inheritance when building components?Solution
Step 1: Understand composition in Next.js
Composition means building components by combining smaller, reusable parts to create complex UI.Step 2: Compare with inheritance
Inheritance extends existing components but can lead to complex and less clear code structures.Final Answer:
It allows combining small components for better reuse and clarity. -> Option AQuick Check:
Composition = combining parts for clarity [OK]
- Thinking inheritance is simpler for UI reuse
- Confusing lifecycle management with composition
- Assuming inheritance is preferred in Next.js
Solution
Step 1: Identify JSX syntax for composition
Composition uses JSX tags to include child components inside parent components.Step 2: Check options for correct JSX usage
function Parent() { return <Child></Child>; }correctly uses<Child></Child>tags, which is valid JSX.function Parent() { return <Child>; }uses opening tag but missing closing tag.class Parent extends Child {}uses inheritance syntax, not composition.function Parent() { return Child(); }calls Child as a function, which is not standard JSX.Final Answer:
<Child></Child> JSX tags for composition -> Option BQuick Check:
JSX tags = composition [OK]
- Using class extends syntax for composition
- Calling components as plain functions without JSX
- Missing closing tag for JSX element
function Button({ label }) {
return <button>{label}</button>;
}
function Toolbar() {
return <div><Button label="Save" /></div>;
}Solution
Step 1: Analyze Button component output
The Button component returns a button element with the label text inside it.Step 2: Analyze Toolbar component output
Toolbar renders a div containing the Button component with label "Save", so the button with text "Save" appears inside the div.Final Answer:
<button>Save</button> -> Option AQuick Check:
Button label = Save [OK]
- Confusing parent div content with button content
- Assuming Toolbar text appears inside button
- Thinking syntax error exists due to JSX
class BaseButton extends React.Component {
render() {
return <button>Base</button>;
}
}
function SubmitButton() {
return <BaseButton label="Submit" />;
}Solution
Step 1: Check BaseButton usage of props
BaseButton receives a label prop but does not use it in the render method, so label is ignored.Step 2: Check SubmitButton usage
SubmitButton returns BaseButton with label prop, but since BaseButton ignores label, the button always shows "Base".Final Answer:
BaseButton does not use the label prop in render method. -> Option DQuick Check:
Unused prop = bug [OK]
- Thinking functional components can't use class components
- Assuming inheritance is disallowed in Next.js
- Confusing extending with composing
function Card({ children }) {
return <div className="card">{children}</div>;
}
function Profile() {
return (
<Card>
<h2>User Name</h2>
<p>User details here</p>
</Card>
);
}Solution
Step 1: Understand composition with children prop
The children prop allows passing any nested JSX inside Card, making it reusable for different content.Step 2: Compare other options
Extending with inheritance is less flexible and not recommended. Passing content as string limits flexibility. Duplicating code reduces reuse.Final Answer:
Use children prop to pass nested components inside Card. -> Option CQuick Check:
children prop = composition [OK]
- Trying to extend components with class inheritance
- Passing content as plain strings instead of JSX
- Duplicating component code instead of composing
Ready to prove it?
Pass the test and this pattern moves unknown
