如何访问外部组件的内部元素

How to access inner elements of external components

我有一个外部 Select 反应组件,它反过来呈现 li 标签。 我想为所有 li 设置样式,除了第一个 margin-left 为 20px;

代码如下:

const StyledSelect = styled(Select)`
  li {
    margin-left: 20px;
  }
`

知道为什么这不起作用或有其他方法吗?

这应该可行,但是根据外部 Select 应用样式的方式,它们可能具有更高的特异性并且仍然会覆盖您应用的样式。 (请参阅 this article 了解特异性如何工作的入门读物)

不知道你正在使用哪个 Select 组件,调试起来有点困难,但我假设它使用具有非常高特异性的内联样式(即 style 属性)从而覆盖您应用的样式。

有两种方法可以提高样式的特异性,如果外部组件不使用内联样式,则不推荐使用这两种方法

提高特异性的第一种方法是使用!important:

const StyledSelect = styled(Select)`
  li {
    margin-left: 20px!important;
  }
`

在某些情况下,这可能还不够,而且一旦您拥有更多需要强行覆盖的属性,这也非常乏味。一种更好的方法,但仍然不推荐使用 class hack:(注意&符号)

const StyledSelect = styled(Select)`
  &&& li {
    margin-left: 20px;
  }
`

这里 styled-components 所做的是用生成的 class 替换每个 &,这意味着生成的 CSS 看起来像这样:

.sc-asdf123.sc-asdf123.sc-asdf123 li {
  margin-left: 20px;
}

这三个 classes 极大地提高了块内样式的特殊性。这应该可以解决问题![​​=23=]


要不设置第一个子项的样式,您可以将 first-childnot 伪选择器一起使用:

const StyledSelect = styled(Select)`
  &&& li:not(:first-child) {
    margin-left: 20px;
  }
`

您可以使用 CSS 伪 类:

const StyledSelect = styled(Select)`
  li:not(:first-child) {
    margin-left: 20px;
  }
`

详细了解 CSS 伪 类:https://developer.mozilla.org/en/docs/Web/CSS/Pseudo-classes