将 Material 图标与样式化组件一起使用

Using Material Icons with Styled Components

刚开始玩 Styled Components。有没有办法设置第三方图标的样式,例如 Material Design Icons?这是我到目前为止的代码,但显然它不起作用。 相关代码在内容组件下方谢谢!

const MaterialIcon = (props) => <i className="material-icons">account_balance</i>;

const Icon = styled(MaterialIcon)`
  background-color: green;
  font-size: 50px;
`;

const CheckThisOut = props => (
  <Wrapper>
    <Header>
      <h5>{props.title}</h5>
      <Icon />
    </Header>
    <Divider />
    <Content>
      <p>5% of all participants in this campaign were first time users.</p>
    </Content>
  </Wrapper>
);

export default CheckThisOut;

要使 styled(AnyComp) 符号正常工作,AnyComp 需要接受传入的 className 属性并将其附加到 DOM 节点。

要使您的示例正常工作,MaterialIcon 必须使用传入的 className,否则样式会被注入但没有 DOM 节点被定位:

const MaterialIcon = (props) => (
  <i className={`material-icons ${props.className}`}>account_balance</i>
);

// WORKS 
const Icon = styled(MaterialIcon)`
  background-color: green;
  font-size: 50px;
`;

查看我们的 documentation page about styling any component 了解更多信息!

我知道这是一个旧的 post,但这里有另一种将其写为单个表达式的方法。使用样式组件的 .attrs() (see docs) 作为 class 名称和 CSS ::after 选择器作为图标名称。

const ThumbUp = styled.i.attrs(() => ({ className: "material-icons" }))`
  background-color: green;
  font-size: 50px;
  &:after {
    content: "thumb_up";
  }
`;

以更通用的方式编写它可以让您将它用于任何可用的图标。这利用了样式组件的能力来根据道具进行调整(有关详细信息,请参阅 styled components docs)。

const MaterialIcon = styled.i.attrs(() => ({ className: "material-icons" }))`
  background-color: green;
  font-size: 50px;
  &:after {
    content: ${props => props.iconName || "help"};
  }
`;

你可以这样使用:

<MaterialIcon iconName="check" />