Multiple Props Options for Styled Components Multiple Props Options for Styled Components reactjs reactjs

Multiple Props Options for Styled Components


Keep the passed in prop name the same. Then you can utilize a switch/case statement. For example, passing in a color prop and using it as a type to be matched against a case.

Working example:

Edit Simple Styled Components


For example:

<Button color="primary">Example</Button>

components/Button

import styled from "styled-components";const handleColorType = color => {  switch (color) {    case "primary":      return "#03a9f3";    case "danger":      return "#f56342";    default:      return "#fff";  }};const Button = styled.button`  display: block;  cursor: pointer;  border: 0;  margin: 5px 0;  background: #000;  font-size: 20px;  color: ${({ color }) => handleColorType(color)};  &:focus {    outline: 0;  }`;export default Button;

If you have multiple attributes (like a color and a background pair), then utilizing the same concept as above, alter the handleColorType to return a string with attributes and invoke the handleColorType function without a style property.

For example:

<MultiButton color="primary">Example</MultiButton>

components/MultiButton

import styled from "styled-components";const handleColorType = color => {  switch (color) {    case "primary":      return "color: #03a9f3; background: #000;";    case "danger":      return "color: #fff; background: #f56342;";    default:      return "color: #000; background: #eee;";  }};const MultiButton = styled.button`  display: block;  margin: 5px 0;  cursor: pointer;  border: 0;  font-size: 20px;  ${({ color }) => handleColorType(color)};  &:focus {    outline: 0;  }`;export default MultiButton;


This is the solution I ended up using:

export const Navbar = styled.nav`  width: 100%;  ...  // rest of the regular CSS code  ${props => {    if (props.dark) {      return `        background: ${colors.dark};        color: ${colors.light};    `    } else if (props.light) {      return `        background: ${colors.light};        color: ${colors.dark};    `    } else {      return `        background: ${colors.light};        color: ${colors.dark};    `    }  }}`


Something more elegant (I guess) and modern would be a combination of destructuring the props and using the switch statement such as:

const Button = styled.button`  ${({primary, secondary}) => {      switch(true) {        case primary:          return `background-color : green`        case secondary:          return `background-color : red`      }    }  }`