CSS and React Components
Learn about styled-components, the library that helps you include CSS and React code together.
Where Stimulus encourages using the markup you are already writing, therefore keeping CSS in its own separate files, React encourages thinking about CSS and code together. Once you get in the habit of thinking of your page as made up as a number of different React components, it’s only a small step to imagine those components as containing their own CSS for features that are specific to that component.
Including CSS with React code is such a common thought that there are oodles of libraries that handle this. I’m going to talk about one of these libraries that has an interesting way to insert CSS into your React code: styled-components.
Introducing styled-components
The styled-components library allows you to define React components that include CSS styles inside the definition of the component. When the component renders, the styled-components library generates CSS code with definitions for these styles and uses those generated CSS class names in the rendered HTML markup.
In practice, what this means is that we are attaching CSS definitions, not to the big components we’ve already defined, but rather, the internal markup of the components that use div
and span
is replaced with styled-components that define their own CSS.
Why would you do such a thing? Isn’t CSS good enough? CSS is great. However, there are a few reasons why it’s helpful to bundle CSS with React components:
- It’s easier to see what CSS applies to a component because the styling is right there in the same file as the component.
- There tends to be a better separation of styling from logic, and as a result, the logic components tend to be a little cleaner.
- The library gives you some protection against style bugs, such as using the wrong CSS class. It also prevents unused CSS from being sent to the page.
- The styled-components library has nice support for global properties.
And there are a few challenges associated with bundling CSS with React components:
- I don’t love the syntax, especially for dynamic properties, and especially with TypeScript. You’ll probably want an editor plugin to help you out.
- It can be a little hard to debug the resulting CSS without additional plugins.
Overall, though, I think styled-components are pretty interesting, and worth considering in your project. Let’s add some to our project.
Installing styled-components
With TypeScript, we have to install two packages, and we’re going to install an optional third package that will give us slightly better tooling in development:
$ yarn add styled-components
$ yarn add @types/styled-components
$ yarn add babel-plugin-styled-components --dev
We need to add the babel plugin to the plugins
section of the babel.config.js
Our first styled component
Let’s look at our React components and see how we can use the styled-components library. As we left it back in the React chapter, we have four components with display elements on our concert view page: a VenueHeader
that adds a header, a VenueBody
that controls the grid, a Row
that manages a row of seats, and a Seat
that actually draws an individual seat.
Our first styled-components change is in VenueHeader
. We want to change the styling of the text prompt and manage the spacing a little bit. Otherwise, the functionality is the same: when the option changes, we pass the new value back to the same ticketsToBuyChanged
handler, stored in the Venue
component and passed to VenueHeader
via a prop:
Get hands-on with 1400+ tech skills courses.