styled-components - styled-components:基于其他样式的动态css属性(margin基于font-size)
问题描述
我想将我的边距基于组件的字体大小,就像这样:
const H1 = styled.h1`
font-size: ${props => props.theme.fontSizes.large + 'px'};
margin: ${props => props.theme.fontSizes.large * 3 + 'px'};
`
但是,我不想在页边空白处重复对 ThemeProvider 主题道具的引用,但我想做这样的事情:
const H1 = styled.h1`
font-size: ${props => props.theme.fontSizes.large + 'px'};
margin: ${H1.styles['font-size'] * 3 + 'px'};
`
我这样做的原因不仅是为了避免重复自己,还因为在我的设计系统中我多次扩展组件,因此手动重复当前组件的 font-size 容易出错(可能来自一些一个完全不同的文件中的早期扩展组件)。
任何想法如何优雅地解决这个问题?谢谢!
解决方案
我找到了一个解决方案,不是很优雅,但很有效。我使用允许手动将道具传递给样式化组件的.attrs
构造函数:
const H1 = styled.h1.attrs({
fontSize: props => props.theme.fontSizes.large
})`
font-size: ${props => props.fontSize + 'px'};
margin: ${props => props.fontSize * 3 + 'px'};
`
或者看一个更复杂的例子,它的用处变得更加清晰(当我们定义一个具有特定字体大小的组件时,稍后扩展这个组件,然后添加基于之前的字体大小的边距):
const Heading = styled.h1.attrs({
fontSize: props => props.theme.fontSizes.large
})`
font-size: ${props => props.fontSize + 'px'};
`
const HeadingWithMargin = Heading.extend`
margin: ${props => props.fontSize * 3 + 'px'}; // this extended component still has access to the passed props
`
推荐阅读
- azure-devops - Azure DevOps (SAAS)、自托管代理和 GitHub Enterprise Server 之间的数据流
- ios - StackView 添加了一个跨越边界约束,它弄乱了我的视图高度
- javascript - 反应:下拉菜单没有在外面的水龙头上关闭
- java - 通过k8s作业文件将cmd参数传递给docker容器中的java应用程序
- julia - 在 Julia 中将日期时间格式“1/22/20”转换为“2020-01-22”
- sql-server - 使用 outerapply 填充
- linux - 后台 docker 容器在哪里运行?(苹果系统)
- c++ - 应该急切地或懒惰地评估 c++ 约束吗?
- snakemake - 带有生成许多中间文件的脚本的 Snakemake
- flutter - 如何使文本在颤动中转到下一行