使用 Styled-Components 在 React Bootstrap 中覆盖嵌套样式

Posted

技术标签:

【中文标题】使用 Styled-Components 在 React Bootstrap 中覆盖嵌套样式【英文标题】:Overwriting nested styles in React Bootstrap using Styled-Components 【发布时间】:2018-04-29 07:55:28 【问题描述】:

我正在使用带有 React Bootstrap 的样式化组件。我们希望根据状态对选项卡(本示例中的选项卡 3)进行着色。当标签未激活时,它运行良好,但在它处于活动状态时,Bootstrap风格会覆盖样式。

我已经确定了在控制台中覆盖我的颜色的样式。当我使用控制台关闭样式时,我看到了我想要的标签颜色。

我只是不确定如何使用样式组件来定位这种样式。我已经尝试过与官方doc 不同的想法,但无法让它发挥作用。

我的样式化组件:

 export const TabNavItem = styled(NavItem)`
      background-color: $props => (props.colorize ? 'orange' : 'white');
      
    `;

用法:

  render() 
    const  children, active, colorize  = this.props;
    return (
      <TabNavItem onClick=this.handleChangeLocation active=active colorize=colorize>
        children
      </TabNavItem>
    );
  

标签页不活动时颜色可以正常工作:

When tab is active, color is covered by Bootstrap styles:

这是我需要覆盖的样式(背景色):

【问题讨论】:

【参考方案1】:

我通常不会将styled-components 直接应用于每个react-bootstrap 组件,而是创建一个单独的组件来包装整个组件范围并更多地依赖CSS 类来完成工作。

例如,在您的情况下,我会这样做:

const StyledWrap = styled.div`
  & .nav-tabs > .active > li 
    background: white;
  

  & .nav-tabs > .active.colorize > li 
    background: orange;
  
`
const MyCustomNavbar = (props) => 
  return (
    <StyledWrap>
      /* ... */
        <NavItem active=true />
        <NavItem className="colorize"/>
        <NavItem active=true className="colorize" />
      /* ... */
    </StyledWrap>
  )

在我看来,它是一种更简洁的模式,可以使特定于组件的 CSS 保持适当的范围、集中和全面。

一般来说,我发现每个组件范围只应用一次styled-components 可以让事情变得简单和易于管理。当你在多个地方应用它时,你最终会做很多前缀,最终得到如下代码:

<StyledNavbar>
  <StyledNav>
    <StyledNavItem active=true />
    <StyledNavDropdown>
      <StyledMenuItem eventKey=1.1>Action 1</StyledMenuItem>
      <StyledMenuItem eventKey=1.2>Action 2</StyledMenuItem>
    </StyledNavDropdown>
  </StyledNav>
</StyledNavbar>

这是一个极端的例子,但你明白了。

【讨论】:

【参考方案2】:

对于如何解决此特定问题,我有一些建议。你可能不喜欢它们中的任何一个,因为它们都不是很优雅,但是就这样吧。

方法 1

使用更具体的选择器覆盖样式。您知道样式化组件如何利用 Sass 发挥其优势吗?好吧,您可以使用它为您的选项卡创建一个选择器,该选择器至少与 Bootstrap 中的选择器一样具体。假设你正在设计的组件是这个等式中的li,你可以做这样的事情(我知道这很糟糕)。

body .nav-tabs > & 
    &.active > a 
        background-color: blue; // whatever
    
    

最初的&amp;当然是指有问题的li,所以会给你一个像body .nav-tabs &gt; li.active &gt; a这样的选择器

方法2

在 CSS 规则末尾使用 !important 标志会更简单一些,如下所示:

export const TabNavItem = styled(NavItem)`
  background-color: $props => (props.colorize ? 'orange' : 'white') !important;
`;

【讨论】:

以上是关于使用 Styled-Components 在 React Bootstrap 中覆盖嵌套样式的主要内容,如果未能解决你的问题,请参考以下文章

使用 Styled-components 修改 SVG (react / next)

Styled-components vs Emotion - 如何在 Styled-components 上重新应用 css`style` 函数

在 react-native 中使用 styled-components 不会覆盖样式

styled-components - 为啥在组件样式之后注入全局样式?

如何使用v4版本styled-components的全局样式?

在反应中使用 Material Icon 和 Styled-Components