【问题标题】:Making Styled Components DRYer制作样式化的组件 DRYer
【发布时间】:2019-11-01 09:56:04
【问题描述】:

在检查 Styled Components 中的 props 时,在我看来,事情可能会非常干燥。

例如,让我们看看下面的代码:

  ${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}`}

这是针对我正在创建的<Text> 组件 - 它只是根据我使用的道具检查文本颜色的变化。例如:<Text light> 将赋予它light 我在变量文件中的colors 对象中设置的颜色。

现在,这段代码相当重复。每行唯一变化的是颜色名称——否则完全相同。

关于如何使此代码更干燥的任何想法?

【问题讨论】:

    标签: javascript reactjs styled-components


    【解决方案1】:

    这里的问题是,如果用户将whiteblack 添加到props 会发生什么?应该是什么颜色的?

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

    这样,您正在过滤colors 中的道具,将样式文本添加到其中,.join 是将数组转换为字符串。

    如果只传递一个颜色的道具,它会正常工作,但如果传递多个,它将​​进入.map的最后一个颜色。

    【讨论】:

    • 谢谢——我要去看看这个。
    • 在添加两个道具方面——我不太担心。一个文本组件应该只有一种颜色——所以用户(在这种情况下是我)应该确保不要添加超过一种颜色属性。如果他们不小心这样做了,那么他们将不得不返回并选择他们想要的颜色。我认为这与不小心将color: white; color: black; 添加到样式表没有什么不同。
    • 效果很好——谢谢。话虽如此,我想知道我怎么能做类似的事情,但道具是有价值的。例如size=xs(我可以有多个选项,xs、sm、md、lg、xl 等)。知道如何处理吗?
    • but with props that take a value 是什么意思?如果你愿意,你可以提出一个新问题,我会尝试回答。
    • 对不起 - 意味着标记为已接受(我刚刚做到了)。关于我的另一个问题,我将发布一个新问题。再次感谢。
    猜你喜欢
    • 2020-01-24
    • 2021-08-16
    • 2020-10-27
    • 2020-09-26
    • 2020-09-22
    • 2019-04-21
    • 2021-07-02
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多