Search code examples
reactjsreact-hooksstyled-components

Reusability with Styled-Components in React


I need to use my custom spinner in other components. So I made a reusable spinner? How do I copy its styles and customize other styles? I want to change just the stroke or the color of the loading. Pls check my code here

Spinner.js

import styled from 'styled-components'

const StyledSpinner = styled.svg`
  animation: rotate 1s linear infinite;
  width: 50px;
  height: 30px;

  & .path {
    stroke: #000000;
    stroke-linecap: round;
    animation: dash 1.5s ease-in-out infinite;
  }

  @keyframes rotate {
    100% {
      transform: rotate(360deg);
    }
  }
  @keyframes dash {
    0% {
      stroke-dasharray: 1, 150;
      stroke-dashoffset: 0;
    }
    50% {
      stroke-dasharray: 90, 150;
      stroke-dashoffset: -35;
    }
    100% {
      stroke-dasharray: 90, 150;
      stroke-dashoffset: -124;
    }
  }
`

const Spinner = () => (
  <StyledSpinner viewBox="0 0 50 50">
    <circle className="path" cx="25" cy="25" r="20" fill="none" strokeWidth="4" />
  </StyledSpinner>
)

export default Spinner

NewComponent.js

import CustomSpinner from '../Spinner'

const Spinner = styled(CustomSpinner)`
   & .path {
     stroke: #fff;
  }
`

Solution

  • You can add custom style inside the Spiner.js component and then export that. In NewComponent.js you export custom spiner style and put it same way like in Spiner.js

    Spinner.js

    import styled from 'styled-components';
    
    export const StyledSpinner = styled.svg`
     animation: rotate 1s linear infinite;
     width: 50px;
     height: 30px;
    
     & .path {
      stroke: ${({ colorValue }) => colorValue}; // color props 
      stroke-linecap: round;
      animation: dash 1.5s ease-in-out infinite;
     }
    
     @keyframes rotate {
       100% {
         transform: rotate(360deg);
       }
     }
     @keyframes dash {
       0% {
         stroke-dasharray: 1, 150;
         stroke-dashoffset: 0;
       }
       50% {
         stroke-dasharray: 90, 150;
         stroke-dashoffset: -35;
       }
       100% {
         stroke-dasharray: 90, 150;
         stroke-dashoffset: -124;
       }
     }
    `;
    
    const Spinner = ({ colorValue }) => (
      <StyledSpinner viewBox="0 0 50 50" colorValue={colorValue}>
        <circle
         className="path"
         cx="25"
         cy="25"
         r="20"
         fill="none"
         strokeWidth="4"
       />
     </StyledSpinner>
    );
    
    export default Spinner;
    

    NewComponent.js

    import Spinner from '../Spinner';
    
    const CustomSpiners = () => (
      <Spinner colorValue="white" />
      <Spinner colorValue="red" />
    );
    
    export default CustomSpiner