由第三方 (antd) 风格覆盖的风格化组件

styled components styled overriden by thrid party (antd) style

我有一个简单的 styled-components 正在应用于 antd 组件:

import { Card } from 'antd';

export const UsageCard = styled(Card)`

  box-shadow: 1px 1px;
  padding: 2px;
`

这会创建一个 div 和 class 属性,如下所示:"ant-card edit-style__UsageCard-jsklqS hBLsXc ant-card-bordered"

其中 .hBLsXc 是我的样式组件。不幸的是,我的 styled-componentn 中的 2px 填充被 ant-card (0px) 覆盖了。

知道为什么会这样吗? styled-components 应该放在第一位,因为它是在第三方组件上实现的。这是我多次阅读的来自第三方组件的 className 转发的问题吗?无论如何,我真的不明白这是怎么回事。

感谢您的帮助!

className 必须放在Card Component 中,否则将不起作用。你应该检查 antd 看看他们是否这样做了。它必须看起来像这样:

const Card = ({ className }) => (
  <div className={className}>
    ...
  </div>
)

这是它的文档:

https://www.styled-components.com/docs/basics#styling-any-components

编辑: 我检查了 antd,看起来你可以将 className 传递给它。 https://github.com/ant-design/ant-design/blob/master/components/card/index.tsx中有一段:

const classString = classNames(prefixCls, className, {
      [`${prefixCls}-loading`]: loading,
      [`${prefixCls}-bordered`]: bordered,
      [`${prefixCls}-hoverable`]: this.getCompatibleHoverable(),
      [`${prefixCls}-wider-padding`]: this.state.widerPadding,
      [`${prefixCls}-padding-transition`]: this.updateWiderPaddingCalled,
      [`${prefixCls}-contain-grid`]: this.isContainGrid(),
      [`${prefixCls}-contain-tabs`]: tabList && tabList.length,
      [`${prefixCls}-type-${type}`]: !!type,
    });

您可以通过道具传递类名。所以这实际上应该有效,但传递的 className 先行,所以我猜 antd 样式将始终覆盖 styled-components 样式,如果它们相同的话。也许叉子会有帮助?