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

Overwriting nested styles in React Bootstrap using Styled-Components

我在 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>
    );
  }

标签未激活时颜色正常:

当tab处于活动状态时,颜色由Bootstrap样式覆盖:

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

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

方法一

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

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

开头的&当然指的是有问题的li,所以会给你一个像body .nav-tabs > li.active > a

这样的选择器

方法二

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

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

我通常不会将 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>

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