如何扩展CSS情感风格的基础组件?

时间:2018-08-30 23:05:42

标签: javascript css styled-components emotion

https://codesandbox.io/s/w242n1vonw

我有一个使用样式系统和React-emotion的项目。

我设计了从基本CSS继承的标题,以实现可重用性。

有时候我希望能够使用如下样式的系统覆盖属性:

<H1 color='green'/>

当我的基本组件为

时,它可以正常工作
const BaseHeading = ({ theme, ...props }) => css`
  color: ${props.color ? props.color : theme.secondary};
`;

但是,如果我想潜在地覆盖十个属性,则需要有条件地重用该道具。这是编写此类功能的惯用方式吗?

2 个答案:

答案 0 :(得分:1)

我认为这是覆盖多个属性的正确方法。如果您有其他固定的属性,例如margin,则可以执行以下操作来帮助澄清“ css”文件。

const marginMap = {
  sm: '4px',
  md: '8px',
  lg: '10px',
  default: '0',
}

const BaseHeading = styled.header`
  margin: ${({ margin = 'default'}) => marginMap[margin]};
`;

您可以将'default'更改为基本主题样式

但是对于您的问题,我还没有找到使用样式化的系统/样式化组件覆盖属性的更好方法

答案 1 :(得分:0)

您可以使用@ emotion / styled中的样式函数创建一个新的自定义样式组件,以扩展其他样式组件。假设您有一个名为BoldText的样式化组件。

const BoldText = styled("div")`
  font-size: 16px;
  font-weight: bold;
`;

您可以通过创建一个新样式的组件来覆盖BoldText的某些属性,该组件是根据BoldText构建的,类似于BoldText是根据div构建的方式。

import styled from "@emotion/styled";
import BoldText from "./BoldText"

const BigBoldText = styled(BoldText)`
  font-size: 20px;
`

<BoldText>I'm bold and 16px</BoldText>
<BigBoldText>I'm bold and 20px</BigBoldText>