Yes, I have always been like you, I've been styling my html elements in my React apps using classNames, because, that was the only available way in React.๐
After completing a project, going back to maintain or edit the recently completed project is always stressfulโน๏ธ.
I was also introduced to BEM syntax. BEM was quite helpful, but it wasn't still the best for me with React. Problem Unsolved! ๐
Write Structured CSS using BEM syntax
David Asaolu ใป Jul 24 '21
Not until few weeks ago, I was watching a tutorial video and I came across styled components. Sounds cool, but what is it all about?
Is it going to solve my problem? Is it less stressful?
Let's find out! ๐
So what exactly is styled-components?
According to the official website, styled components is the result of wondering how we could enhance CSS for styling React component systems. It uses the best bits of ES6 and CSS to style your apps without STRESS.๐
So how can you use styled-components in your React apps.
Install it via NPM
npm install --save styled-components
Once, it is installed that's all.๐
Let's build this simple design using styled-components
In order to use styled-components in your react app, you will have to import styled-components, like this
import styled from "styled-components"
Now, for the example above here is how the component looks like
import React from "react"
import styled from "styled-components" //The styled import
//In styled-components, every element is declared as a variable
//and you are free to use any variable name you like.
//styled.main: main represents the html tag <main></main> that's
//what Container is representing
const Container = styled.main`
width: 90%;
background-color: #fff;
padding: 30px;
border-radius: 15px
`
//Header represents the h2 tag
const Header = styled.h2`
color: #192041;
font-weight: 700;
margin-bottom: 15px;
font-family: "Merriweather", serif;
`
//Form represents the form tag
const Form = styled.form`
width: 100%;
margin: 15px 0px;
display: flex;
align-items: center
`
//InputContainer represents the input tag
const InputContainer = styled.input`
flex: 0.8;
margin-right: 10px;
height: 35px;
background-color: #e6e9fb;
border: 1px solid #ddd;
outline: none;
padding: 15px
`
//SubHeader represents the p-tag
const SubHeader = styled.p`
color: #000;
font-weight: 500;
font-size: 14px
`
//What happened here is that ParagraphCommon inherits the style of
//SubHeader, just like giving them the same styles. You can also
//add specific styles within the quotes
const ParagraphCommon = styled(SubHeader)``
const SearchButton = styled.button`
height: 35px;
background-color: #192041;
flex: 0.2;
border: none;
color: #fff`
const ButtonGroup = styled.div`
width: 100%;
margin: 15px 0px;
display: flex;
align-items: center
`
const Button = styled.button`
margin-right: 15px;
width: 100px;
padding: 7px;
border: none;
cursor: pointer;
border-radius: 5px;
color: ${props => props.textColor};
background-color: ${props => props.bgColor}
//Here, styled-components receive props from the elements in the
//components, which are then accessed using this syntax, which
//gives you the opportunity to do conditional styling.
`
//The React component
function App() {
return (
<Container>
<Header>
Free and Pro website templates for your business
</Header>
<SubHeader>
Choose from over 300 fully responsive portfolio, blog and ecommerce templates
</SubHeader>
<Form>
<InputContainer placeholder="Search all templates"/>
<SearchButton>Search</SearchButton>
</Form>
<ParagraphCommon>
Common searches
</ParagraphCommon>
<ButtonGroup>
<Button bgColor="#f1c0de" textColor="#F037A5">Blog</Button>
<Button bgColor="#e0c3fa" textColor="#8C5EB8">Business</Button>
<Button bgColor="#d0fccd" textColor="#77D970">Portfolio</Button>
<Button bgColor="#F9E4C8" textColor="#F78812">Ecommerce</Button>
</ButtonGroup>
</Container>
);
}
export default App;
More interesting view:
There are still a lot about styled-components, which you will love to check out. Click here for more
Feel free to follow and Connect with me on
๐ Linkedin
๐ Twitter
Thank you for reading!๐



Oldest comments (37)
Styled components really push the component driven ideology in react, โค๏ธ nice post
Thank you, glad you enjoyed it.
I do not suggest styled components at all. The syntax is more complex and hinder the reuse of code. Moreover you're using javascript to style your components instead of using pure css or SASS
It's actually pure CSS but just covered with JavaScript to reference the elements to be styled.
For the syntax, I actually find it very easy to install and use quickly.
Concerning the reuse of code, I don't really get that part, if you don't mind may be you can explain.
Cos, I think it's very reusable, with the passing of props into the styles, just like I did in the example above, thereby reducing the number of CSS styles you write.
Also, styled-components optimizes your webpages by loading only the required number of styles you need per component
Hi David. I think Andrรฉs means that with styled components you have all the styling code in the component, which is great to have that component as standalone, but means that you have to rewrite or copy the common styles that are more global or part of the theme when you are working on an app.
Also, the component file may end up being huge, with most of the content being style. Annoying to maintain.
Personally I'm trying a mix between Sass for common styles, and styled components for specific component styles. I won't recommend this yet because I'm still trying it out.
Oh! now I get it. I agree with you on this. Rewriting the styles can be timing consuming and huge components๐
Nice, I actually use my index.css file for common styling or copy the styles sometimes.
Yeah, after 6 years as fullstack dev I found SASS the best tool for frontend styling, taking into consideration syntax, size, performance and maintainability. In any way, it's a matter of preference, if you like styled components and works for you then go ahead
There's also:
Imprt {css} from 'styled-component'
Where you can assign to a variable a definite style.
If you style the same component in different ways you can do:
const example = styled(CustomButton)
background-color:blue;
Wow, thanks for sharing.
I will check that out also.
What about performance?
It's actually optimizes the loading of your webpages, by only loading the required css per page.
I didn't mean file sizes. I mean rendering time.
P.S. CSS modules also work with code splitting.
SC is old now people. It's just CSS-in-JS.
cssinjs.org
It's cool, I love it in some projects but can cause problems in others with homebrew static publishing solutions that give FOUC using it.
Also homeboy and others, please stop using "Stop using/doing" in these post titles. It's annoying!!!
Some would argue class names is back in a major way with Tailwind.
Alright noted. Thanks for sharing your thoughts on this.
How is this approach differ from just using Vue?
How is this approach differ from just using Vue?
If you're using something that supports CSS modules like Next JS I recommend trying out SCSS modules.
I am not exactly sure what you mean when you say you've been styling using classNames. Have you just been providing a raw object to classNames or have you tried CSS modules?
I think it's good to know the available styling options, I've used pure css, sass, styled-components and now I've decided to use css modules with sass and the classnames lib to facilitate conditional styles, and I'm really enjoying it, I believe there is no silver bullet, yes, there are tools that make the development much easier, finally, using one or the other depends a lot on the project and the dev's decision-making power.
Some comments may only be visible to logged-in visitors. Sign in to view all comments.