通过样式组件中的道具进行映射

时间:2019-06-18 19:10:38

标签: javascript reactjs styled-components

this answer中所述,可以大大简化检查Styled-Components中的道具所需的代码量。例如,比较以下代码:

  ${props =>
    Object.keys(props)
      .filter(key => colors[key])
      .map(color => `color: ${colors[color]};`)
      .join(' ')}

对此:

  ${props => props.white && `color: ${colors.white}`}
  ${props => props.light && `color: ${colors.light}`}
  ${props => props.grey && `color: ${colors.grey.base}`}
  ${props => props.dark && `color: ${colors.dark}`}
  ${props => props.black && `color: ${colors.black}`}

  ${props => props.info && `color: ${colors.info}`}
  ${props => props.success && `color: ${colors.success}`}
  ${props => props.warning && `color: ${colors.warning}`}
  ${props => props.error && `color: ${colors.error}`}
  ${props => props.link && `color: ${colors.link.base}`}

第一行比第二行代码干燥得多。

但是,还有其他一些用例可以简化我的代码,但我不知道该怎么做。

例如,考虑以下代码:

${props => props.small === 'white' && `@media(min-width: 600px) {color: ${colors.white};}`}
${props => props.small === 'light' && `@media(min-width: 600px) {color: ${colors.light};}`}
${props => props.small === 'grey' && `@media(min-width: 600px) {color: ${colors.grey.base};}`}
${props => props.small === 'dark' && `@media(min-width: 600px) {color: ${colors.dark};}`}
${props => props.small === 'black' && `@media(min-width: 600px) {color: ${colors.black};}`}

${props => props.small === 'info' && `@media(min-width: 600px) {color: ${colors.info};}`}
${props => props.small === 'success' && `@media(min-width: 600px) {color: ${colors.success};}`}
${props => props.small === 'warning' && `@media(min-width: 600px) {color: ${colors.warning};}`}
${props => props.small === 'error' && `@media(min-width: 600px) {color: ${colors.error};}`}
${props => props.small === 'link' && `@media(min-width: 600px) {color: ${colors.link.base};}`}

这与我以前的非常相似,除了现在我有一个名为small的道具名称,它具有特定的值。但是,由于专有名称带有值,所以我不能使用上面提到的Object.keys解决方案。

我想知道的是如何将上面的代码简化为简单的javascript语句-与上面提到的第一行代码类似。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这很简单,您检查props.small是否是colors的属性,如果是,则只需返回值colors[props.small]

${props => colors[props.small] && `@media(min-width: 600px) {color: ${colors[props.small]};}`}