Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

idiomatic way to share styles in styled-components?

trying to port some code from jss to styled-components, jss code looks something like:

//... const styles = {   myStyles: {     color: 'green'   } }  const {classes} = jss.createStyleSheet(styles).attach()  export default function(props) {   return (      <div>        <Widget1 className={classes.myStyles}/>        <Widget2 className={classes.myStyles}/>      </div>   ) } 

my question is what would be the idiomatic way to accomplish this sharing of the same styles across multiple components?

like image 357
tony_k Avatar asked Apr 02 '18 21:04

tony_k


People also ask

Do companies use styled-components?

Who uses styled-components? 329 companies reportedly use styled-components in their tech stacks, including Revolut, Graphy, and Shelf.

Is Emotion better than styled-components?

The biggest advantage of Emotion is its easily handled object styles for writing CSS. Take, for example, the case of styled-components, wherein the developer must create unique names for different components, all while avoiding identical naming styles.

Is it good to use styled-components?

Advantages of using Styled-components Below are some of benefits of using styled-components: Eliminates class name bugs: styled-components provide unique class names for your styles, thus eliminating the problems with class names duplications, misspellings, and overlaps.


1 Answers

You can either share actual CSS strings or share styled-components components:

  • Share CSS strings:
import {css} from 'styled-components' const sharedStyle = css`   color: green `  // then later  const ComponentOne = styled.div`   ${sharedStyle}   /* some non-shared styles */ ` const ComponentTwo = styled.div`   ${sharedStyle}   /* some non-shared styles */ ` 
  • Share actual styled-components:
const Shared = styled.div`   color: green; `  // ... then later  const ComponentOne = styled(Shared)`   /* some non-shared styles */ ` const ComponentTwo = styled(Shared)`   /* some non-shared styles */ ` 

Update: Based on questions in the comments, I created an example to show that passing props to styled-components's css function works the same way as passing props to the components themselves: https://codesandbox.io/s/2488xq91qj?fontsize=14. The official recommendation from styled-components is to always wrap strings you will pass to styled-components in the css tag function. In this example, the Test component receives it background and foreground colors through passed-in props embedded in the cssString variable created by invoking the css function.

like image 51
Huy Nguyen Avatar answered Oct 09 '22 19:10

Huy Nguyen