Nwose Lotanna Web Developer and Writer

8 reasons to use styled-components

6 min read 1809

TL;DR: In this article, we will be looking at some of the various benefits of styled-components and why you should consider adopting it as your preferred CSS-in-JS framework.

What is styled-components?

Styled components is a CSS-in-JS styling framework that uses tagged template literals in JavaScript and the awesome power of CSS to provide a platform that allows you to write actual CSS to style react components.

In essence, styled components are easy-to-make react components you write with the styled-components library where you can style your components with plain CSS inside your javascript code. On the official documentation page you would see the example below:

const Button = styled.a`
  display: inline-block;
  border-radius: 3px;
  padding: 0.5rem 0;
  margin: 0.5rem 1rem;
  width: 11rem;
  background: transparent;
  color: white;
  border: 2px solid white;


  ${props => props.primary && css`
    background: white;
    color: palevioletred;
  `}
`

render(
  <div>
    <Button
      href="https://github.com/styled-components/styled-components"
      target="_blank"
      rel="noopener"
      primary>
      GitHub
    </Button>

    <Button as={Link} href="/docs" prefetch>
      Documentation
    </Button>
  </div>
)

We can clearly see the button as a JavaScript variable and the styles defined in back-ticks are plain CSS styles. We also see the nested style property also with plain CSS styles. This is how styled-components render CSS in JavaScript.

I know the subject of CSS-in-JS is heavily debated in the front-end community especially among react developers so I’d ask that you keep an open mind.

Styling React components

There are many ways to style a react component:

  • Traditionally — with CSS in external CSS files, which then pass a string as the className prop to reference them like so:
    render() {
      return <span className="menu navigation-menu">Menu</span>
    }

    If you have worked with a large web application, you can attest to the fact that the CSS files begin to get really bulky, clumsy and very complex. One great solution to this is the introduction of SASS and although that helps, it starts to become the same thing with the sheer number of SCSS files a project can have and the abstraction starts to even become complex in itself.

  • Inline CSS inside your react components:
    const divStyle = {
      color: 'blue',
      backgroundImage: 'url(' + imgUrl + ')',
    };
    
    function HelloWorldComponent() {
      return <div style={divStyle}>Hello World!</div>;
    }

    This is highly discouraged by React as it is neither sustainable nor scalable (more on this later).

  • CSS-in-JS is a technique where JavaScript is used to style components. When this JavaScript is parsed, CSS is generated as a style element and attached directly on top of the DOM. There are a host of CSS-in-JS frameworks out there: styled-components, emotion, jss, radium, aphrodite and a lot more. You can see a comparison table here. Styled-components is, however, arguably the most popular. This option looks promising — it’s no wonder there is a very fast, widespread adoption, with over 600k downloads in the past month.

Why you should use styled-components

Freedom to build custom components with CSS

With styled-components, the user interface design focus shifts from just merely styling HTML elements or React components through className to defining styled components that contain their own styles and are so easily reusable across the entire project. So initially, a sub-heading declaration that looked like this:

<h2 className="subTitle">Gucci Snakes </h2>

With the styles defined like this:

h2.subTitle{
  font-size: 2em;
  color: blue;
}

Would become something like this:

import styled from 'styled-components';
const Subtitle = styled.h2`
  font-size: 2em;
  color: blue;
`;
<Subtitle>Gucci Snakes</Subtitle>

The styles become an integral part of the component here, thereby eliminating the key part the CSS classes initially played by removing the mapping between styles and components. This is all built with plain CSS, there is always this feeling of familiarity you get when working with something you are already used to. This feeling has been carefully preserved for every user of styled-components as the syntax is still largely plain CSS.

Inline styling on steroids

Ordinarily, inline styling is discouraged by the react team, a concern that is very valid because inline styles do not allow the use of pseudos and media queries. Also, inline styles should not be used due to a lot of concerns about browser compatibility, camel-casing, and automatically appended scalar quantities.

But with styled-components, we can see a kind of inline styling but without all the aforementioned inline styling baggage, I call it vibranium power. Here is sample code to demonstrate:

const paragraphStyles = {
color: red,
backgroundColor: black,
padding: 2px
}
<p style={paragraphStyles}> inline styles applied here </p>

Compile output:

<p style="color: red; background-color: black;">
inline styles applied here </p>

But with styled-components…

import styled from 'styled-components';
const Text = styled.div`
color: red,
background: black
`
<Text>Styled with CSS-in-JS </Text>

Compiled output:

<style>
.hash12345tf {
background-color: black;
color: red;
}
</style>
<p class="hash12345tf">Styled with CSS-in-JS</p>

We also see how the styled-component attached a style tag on top of the DOM while an inline style just works with the properties of the DOM node instead.

Native mobile support

For teams with a React codebase who also use React Native for mobile development, styled-components is one of the best-unified solutions out there for you. If consistency across platforms is a priority, then you would be glad to find out that styled-components can be bundled into React Native.

In React Native with styled-components, you can just assign alias names to comments making your JSX code very legible. Also, you can convert any component even custom components to a styled component by simply invoking styled().

Scoped styles

In the front-end tooling world, the team at Vue were (in my opinion) the very first to perfect this concept of scoping styles. There is one very annoying thing about using CSS, and that is the fact that for a non-expert CSS user, it gets really frustrating when you change the style of a particular element or class in your stylesheet and it inversely affects another seemingly unrelated element or behavior in the DOM. This is a great reason to use styled-components as it is component-based and very scoped, like Vue.

No-class policy

Styled-components enforces the use of props in the place of classes. This no-class policy has helped them make more developers tow the route of best practices for controlling the behavior of a component.

Initially, you would write:

<h2 className="title primary">Hello World</h2> 
h2.Subtitle{
  font-size: 2em;
  color: green;
  
  &.primary{
    color: red;
  }
}

But now, it should be like this:

const Subtitle = styled.h2`
  font-size: 2em;
  color: ${props => props.primary ? 'red' : 'green'};
`;
<Subtitle primary>Hello World</Subtitle>

We see how we have managed to keep HTML and CSS manipulations out of the component.

Alternatively, you can always go right back to className, the same results will be achieved.

const Subtitle = styled.h2`
  font-size: 2em;
  color: green;
  
  &.primary{
    color: red;
  }
`;
<Subtitle className="primary">Hello World</Subtitle>

Server-side rendering

styled-components supports concurrent server-side rendering, with stylesheet rehydration. The basic idea is that every time you render your app on the server, you can create a ServerStyleSheet and add a provider to your react tree, that accepts styles via a context API.

This doesn’t interfere with global styles, such as keyframes or createGlobalStyle and allows you to use styled-components with React DOM’s various SSR APIs.

CSS unit and snapshot testing

Owing to the fact that styled-components are indeed components, unit testing can be run on them. This is a major CSS breakthrough and there is already a jest integration support by the styled-component team.

Jest Styled Components is a set of utilities for testing styled-components with Jest. This package improves the snapshot testing experience and provides a brand new matcher to make expectations on the style rules. It can be installed like this:

npm install --dev jest-styled-components

Here’s an example of a test:

import React from 'react'
import styled from 'styled-components'
import renderer from 'react-test-renderer'
import 'jest-styled-components'
const Button = styled.button`
  color: red;
`
test('it works', () => {
  const tree = renderer.create(<Button />).toJSON()
  expect(tree).toMatchSnapshot()
})

And here’s an example of the resulting snapshot:

exports[`it works 1`] = `
.c0 {
  color: green;
}
<button
  className="c0"
/>
`

Sass and polished support

If you followed this article to this point, you must have noticed some nested styles, Sass, and even Polished, a toolset created by the team to further stretch the powers of Sass:

const Link = styled.a`
  cursor: pointer;
  text-decoration: none;
  &:hover {
    color: blue;
    text-decoration: underline;
  }
`;

Supporting Sass exposes the core mission of styled-components and that is to create the perfect CSS-in-JS experience without losing touch with everything we already love about CSS which includes reducing the lines of code and other optimization features of Sass.

Arguments against styled-components

It’s hard for me to come up with very many reasons not to use styled-components (especially given the title of the post), but it would be unfair if I did not also point out some (valid) concerns about CSS-in-JS frameworks in this article.

The lock-in

There is a kind of nested lock-in that exists for every user of styled-components and you should be very aware and comfortable with it. You are locked into JavaScript then into the React library then finally into styled-components. If any of them goes away, you would have to painfully refactor your codebase.

Learning curve

Some people also indicate the learning curve of styled-components is steep and also the unique differences among CSS-in-JS frameworks. I would strongly recommend using and sticking to styled-components.

Continuity concerns

Styled-components started about two years ago and React developers always ask what if it stops being supported. You have to make sure you aware of this before using them in production.

Personal preferences

People do not like change. This is, in fact, a valid argument as CSS in a separate document is still one of the longest lasting standards in web development.

Community concerns

Some people feel that the styled-components community is small and they might not get enough support and as fast as they might need it when they run into difficult bugs, use cases or errors. This is also valid but you have to put the lock-in nature of styled-components into consideration to understand why.

Conclusion

There is a massively growing community around styled-components with over 22,000 ⭐️on GitHub, mostly coming from React developers, which is very encouraging and speaks to the prospects of longevity.

It is also very regularly maintained, you can check out the releases page here. If you are a CSS enthusiast, you can check out this State of CSS Survey that is currently all over the internet. Happy coding!

Full visibility into production React apps

Debugging React applications can be difficult, especially when users experience issues that are difficult to reproduce. If you’re interested in monitoring and tracking Redux state, automatically surfacing JavaScript errors, tracking slow network requests and component load time, try LogRocket. https://logrocket.com/signup/

LogRocket is like a DVR for web apps, recording literally everything that happens on your React app. Instead of guessing why problems happen, you can aggregate and report on what state your application was in when an issue occurred. LogRocket also monitors performance of your app with metrics like client CPU load, client memory usage, and more.

The LogRocket Redux middleware package adds an extra layer of visibility into your user sessions. LogRocket logs all actions and state from your Redux stores.

Modernize how you debug your React apps - .

Nwose Lotanna Web Developer and Writer

3 Replies to “8 reasons to use styled-components”

  1. Reasons not to use styled components
    Extra page weight as you add lots of extra divs to style your components
    More page weight as you need to include a library to replace something you get for free in all browsers
    Less code -re-use compared to using proper CSS
    Slower than using stylesheets as there is no caching ~ bad for the user
    Slower as you have to create inject the styles into the head on each page load
    Hard to get a consistent style across a site.

    I interview a lot of devs who cannot think of a single reason why styled components have any issues/downside, I don’t mind if people want to use them but no library comes without some downside. I really wish people would focus on the user before using any library, rather than focus on what is comfortable for them as a developer.

  2. Thanks so much for this. Performance and caching are huge. Another developer-related issue that I have is complex functions written directly within the css in style-components. You end up troubleshooting code just to get a style to load in some cases.

Leave a Reply