Welcome, here's a guide teaching you how to create a simple and powerful reusable button component using ReactJS, Typescript and Styled-components.
Observation: I created this post considering that you know the basics of ReactJS, typescript and styled-components. If you see anything wrong, please tell me!
Let's start creating two files, index.tsx and styles.ts.
Inside index.tsx let's create a functional component called Button and pass the styled-component <Container> inside it:
import React from "react";
import { Container } from "./styles";
export const Button = () => {
return (
<Container>
</Container>
)
};
In order to make this component reusable in different situations, we have to create some properties for it. In this case, let's create a type called ButtonProps, and pass these props:
export type ButtonProps = {
onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void; // to handle onClick functions
children?: React.ReactNode; // make the component able to receive children elements
color?: 'primary' | 'secondary'; // two styling options (you can create as many as you want)
disabled?: boolean; // make the button disabled or not
};
Then, let's call these props in our Button component, using props destructuring and see what we've done so far:
import React from "react";
import { Container } from "./styles";
export type ButtonProps = {
onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void; // to handle onClick functions
children?: React.ReactNode; // make the component able to receive children elements
color?: "primary" | "secondary"; // two styling options
disabled?: boolean; // make the button disabled or not
};
export const Button = ({
onClick,
children,
color = "primary",
disabled,
}: ButtonProps) => {
return (
<Container onClick={onClick} color={color} disabled={disabled}>
{children}
</Container>
);
};
Now, it's time to set the styles properties, let's go to our file styles.ts, import styled and { css } from styled-components and { ButtonProps } from index.tsx:
import styled, { css } from "styled-components";
import { ButtonProps } from ".";
To set different styles to our Button component, let's create a const called COLOR and pass some styles with the css we imported to encapsulate it, using the same name we put on the color property in ButtonProps:
const COLOR = {
primary: css`
color: #fff;
background: linear-gradient(#3f3cfe, #e943d5);
`,
secondary: css`
color: #000;
background: linear-gradient(#c7c7d2, #bcbaba);
`,
};
And a const called DISABLED, to style the Button when it's disabled:
const DISABLED = css`
cursor: not-allowed;
background: #d4d4d4;
color: #f5f5f5;
`;
Now, let's pass some default styles to the Button Container and call the ButtonProps type, in order to use the properties:
export const Container = styled.button<ButtonProps>`
padding: 10px 15px;
cursor: pointer;
border: none;
border-radius: 50px;
font-weight: 500;
outline: none;
transition: all 0.2s;
${(props) => props.color && COLOR[props.color]}
${(props) => props.disabled && DISABLED}
`;
As you can see above, we have to pass some arrow functions to call the properties and match it with our encapsulated css (const COLOR and const DISABLED).
Now, we have a powerful reusable button component!
You can see the results at the beginning of the article!
Thanks for reading this content, I hope it helps you in some way and, if you notice something wrong, feel free to help me leaving a comment bellow or find me on twitter !
You can also find me at:

Top comments (1)
Teu tutorial salvou uma task minha, valeu Hugo!