Combining already-existing components will make it simple to add new functionality as your website expands. Your code becomes more flexible and scalable as a result.
Your reusable code can be applied to new projects without having to be written from scratch.
How to Write Clean, Reusable React Components
Here are the two most important things to keep in mind while writing clean reusable React components:
1. Avoid Side Effects. Don’t put logic that interacts with external data (like making API calls) directly inside a reusable component. Instead, pass this logic as props
to the component.
For example, if a button does more than just looking pretty, like fetching data from the internet, it might not be reusable.
I am not going to show you an example of this until you grasp the concept of passing props with best practices. Keep reading.
This is a reusable button component. But it lacks best practices. I will show you why in the example section.
// This is a reusable button component (bad practice!)
const Button = () => {
return (
<button> Click Me </button>
);
}
2. Use Props. Props are arguments you pass to a component to customize its behavior and appearance. This allows you to use the same component for different purposes.
// This is a button component that can change its color
const Button = ({ color }) => {
return (
<button style={{ backgroundColor: color }}> Click Here </button>
);
}
This is still a bad practice because you have a fixed label called “Click Here”. If you want to change the text on your button, let say – “Sign Up”, then you would have to go back to the button component and make that change.
That means every time we want to use a different text, we’d have to go back and edit the code. In other words, it’s no longer reusable.
Challenge: So what’s the solution?
You already have the answer. But if you don’t, I am going to show you in the example section.
Hint: Think about how you might want to use the component in different situations and design it to be flexible and adaptable.
Examples of Reusable React Components
Here are some common examples of reusable React components, along with some code examples to get you started:
1. Buttons: Basic buttons with different styles and functionalities.
// Button component
import React from "react";
const Button = ({ color, label, onClick }) => {
return (
<button
className={`padding-2 shadow-none hover:shadow background-light-${color} hover:background-dark-${color}`}
onClick={onClick}
>
{label}
</button>
);
};
export default Button;
// Using the Button component
<Button color="blue" label="Click Here" onClick={() => console.log("Button clicked!")} />
As you can see, I did not write “Click Here” in the button component. I want to make my button reusable, and thus it doesn’t know anything about custom styles or texts.
So, I passed them as props (e.g., color, label, onClick) to change them in the future without touching the original button components. Hope that makes it clear.
Solution: You need to pass EACH functionality as
props
in the reusable component – that’s it.
2. Navbars: Navigation bars that provide consistent navigation across your website.
// Navbar component
import React from "react";
const Navbar = ({ isLoggedIn }) => {
return (
<div className="navbar">
<div className="navbar-container">
<div className="navbar-logo">
<img src={logo} alt="logo" />
</div>
<div className="navbar-links">
<a href="/">Home</a>
<a href="/about">About</a>
<a href="/contact">Contact</a>
{isLoggedIn ? (
<a href="/profile">Profile</a>
) : (
<a href="/login">Login</a>
)}
</div>
</div>
</div>
);
};
export default Navbar;
// Using the Navbar component
<Navbar isLoggedIn={true} />
As you can see, I passed <Navbar isLoggedIn={true} />
This line utilizes the Navbar
component and passes the isLoggedIn
prop with a value of true, indicating the user is logged in. This will display the “Profile” link and hide the “Login” link.
Similar to the button component, the Navbar component is reusable and accepts props to customize its behavior. Perfect!
3. Why API call in button component is a bad practice
Now, you understand everything about reusable component in React.
Let’s dig deeper by solving a complex problem.
Consider the scenario, where you have a button that does an API call. The code for the button component can be the following:
import React from "react";
import doAPICall from "../api"
const SaveButton = () => {
return (
<button
onClick={() => {
doAPICall();
}}
>
Save
</button>
);
}
export default SaveButton
It is quite clear that you can’t reuse the above button in multiple places as this button component contains a side-effect (doAPICall()
) inside it.
To make this component reusable, first, you will have to extract out the side-effect and pass that as a prop to the button component like the following:
const App = () => {
function doAPICall() {
// Does an API call to save the current state of the app.
}
return (
<div>
<SaveButton onClick={doAPICall}/>
</div>
)
}
The button component will look like the following:
const SaveButton = ({
onClick
}) => {
return (
<button
onClick={onClick}
>
Save
</button>
);
}
As you can see, the above button can now be reused in all places where you want to save data on click of a button. The button can now be used like this in multiple places:
const App = () => {
function saveUser() {
// Does an API call to save the user.
}
function saveProject() {
// Does an API call to save the project.
}
return (
<div>
<SaveButton onClick={saveUser}/>
<SaveButton onClick={saveProject}/>
</div>
)
}
You can also make the button component more reusable by using a prop to control the label like the following:
const App = () => {
function saveUser() {
// Does an API call to save the user.
}
function saveProject() {
// Does an API call to save the project.
}
return (
<div>
<SaveButton onClick={saveUser} label="Save user" />
<SaveButton onClick={saveProject} label="Save project" />
</div>
)
}
The button component will look like the following:
const SaveButton = ({
onClick,
label
}) => {
return (
<button
onClick={onClick}
>
{label}
</button>
);
}
Conclusion
Congratulations! You’ve successfully learned how to build clean reusable React component with BEST practices.
Remember, reusable components are the building blocks of robust React development. By practicing reusable components, you can build cleaner, more efficient, and more maintainable React applications.
salvatore_sed
Its like you read my mind You appear to know so much about this like you wrote the book in it or something I think that you can do with a few pics to drive the message home a little bit but other than that this is fantastic blog A great read Ill certainly be back
clip downloader
I have been browsing online more than three hours today yet I never found any interesting article like yours It is pretty worth enough for me In my view if all website owners and bloggers made good content as you did the internet will be a lot more useful than ever before
temp.mail
Thank you for the auspicious writeup It in fact was a amusement account it Look advanced to far added agreeable from you However how can we communicate
Free URL Shortener
Hey, Jack here. I’m hooked on your website’s content – it’s informative, engaging, and always up-to-date. Thanks for setting the bar high!
smorter giremal
I envy your work, thanks for all the good blog posts.
drover sointeru
Having read this I thought it was very informative. I appreciate you taking the time and effort to put this article together. I once again find myself spending way to much time both reading and commenting. But so what, it was still worth it!
Gustavobew
Good article but short you should create a seriese for this.
Lineage_mvor
instead of login = true in Navbar
Navbar isLoggedIn={true}
can i do this by middleware only
Pushpendra
No. middleware is for routes.
klinika_txma
Секреты молодости кожи от косметологовэпиляция волос зоне бикини https://popunderinfo.com/ .
hvac_tfki
Please create a seperate blog for props.
Liugka
Create a article for NextJs too