我想要一个用Emotion设置样式的组件,它采用最终控制样式的道具。例如,考虑一个GridCol
具有各种改变填充和宽度的道具的组件(宽度可以在不同的视口宽度上改变)。
我想使用这样的 API:
<GridCol gutter size="2>
// or alternatively, like this:
<GridCol gutter size={{
m: 2,
l: 4
}}>
这里发生了三件事:
- the
gutter
是一个布尔属性,它为列添加一些水平填充 size
prop 可以是字符串或对象。如果它是一个字符串,我们只需添加几行 CSS 就可以了,但是,如果它是一个对象,我们需要根据在别处设置的断点对象插入一些媒体查询。
Emotion 的文档不清楚如何处理这种性质的样式,至少我没有看到它,所以我希望能找到一个通用的解决方案。
对于gutter
道具,这是微不足道的:
const GridCol = props => styled('div')`
display: block;
box-sizing: border-box;
flex: 1 0 0;
min-width: 0;
padding: ${props.gutter ? `0 10px` : '0'};
`
对于size
道具,它变得更加复杂,我希望生成的 CSS 看起来像这样:
const GridCol = props => styled('div')`
display: block;
box-sizing: border-box;
flex: 1 0 0;
min-width: 0;
padding: ${props.gutter ? `0 10px` : '0'};
/* styles here if `size` is a string */
width: 10%;
/* styles here if `size` is an object */
@media screen and (min-width: 500px) {
width: 20%;
}
@media screen and (min-width: 800px) {
width: 30%;
}
@media screen and (min-width: 1100px) {
width: 40%;
}
`
这些width
值将由 prop 的 key 确定,它对应于breakpoints
object 中的一个 value,这部分并不简单,但我不知道如何动态生成所需的 css。
我确信我可以添加更多信息,我已经做了一些尝试,但目前没有一个有效。我的感觉是我应该创建一个无状态功能组件,为每个条件生成 css,然后在最后加入 css..