
我们的团队使用
样式化组件来对
React组件进行样式化。
Habré上已经有关于样式化组件的文章,因此我们将不对其进行详细介绍。
引入样式化组件更好,更快,更强大:样式化组件v4编写了许多组件之后,我们发现几乎在每个组件中都复制了重复的属性。
例如,在许多组件中,我们这样写:
padding-top: ${props => props.paddingTop || '0'}; padding-bottom: ${props => props.paddingBottom || '0'}; padding-right: ${props => props.paddingRight || '0'}; padding-left: ${props => props.paddingLeft || '0'};
样式系统
复制重复的属性开始变得很烦人,我们将重复的代码段拉入了单独的可重用函数中。 但是我认为也许有人已经在我们之前实现了这样的功能,并且可能更精美,更通用。 我开始使用Google并发现了
样式化的系统 。
带样式的系统提供了一组样式功能。 每个样式函数提供了自己的一组属性,这些属性根据应用程序主题中定义的值来设置元素的样式。 样式化的系统具有丰富的API,该API具有大多数CSS属性的功能。
基于样式化组件的样式化系统示例
import { space, width, fontSize, color } from 'styled-system'; import styled, { ThemeProvider } from 'styled-components'; import theme from './theme'; const Box = styled.div` ${space} ${width} ${fontSize} ${color} `; render( <ThemeProvider theme={theme}> <Box p={3} bg="whites.10" color="orange"> This is a Box </Box> </ThemeProvider>, );
主要好处
连接主题
上面,我提供了使用ThemeProvider的代码示例。 我们将主题传递给提供者,样式化的系统通过props访问它。
我们主题的一个例子
export const theme = { fontSizes: [ 12, 14, 16, 18, 24, 32, 36, 72, 96 ], space: [
样式的系统将尝试根据组件传递的属性在主题对象中查找值。 支持深度嵌套属性,如果在主题中找不到所传输的值,则该值将按原样解释。
例如,我们传递了组件color =“ red”。 主题对象中没有color.red值,但红色值将转换为红色的css。 因此,在检查员中进行翻译后,我们将看到
color: red;
使用主题值的其他示例
响应式
要快速描述响应式属性,只需传递一组值
<Box width={[ 1,
变体
样式化的系统使我们能够在主题中定义包含颜色,文本样式等集合的可重用对象。 例如,在上面的主题中,我们
我们使用按钮的大小和颜色的选项。
buttonSizes: { xs: ` height: 16px; padding: 0 16px; font-size: 10px; `, sm: ` height: 24px; padding: 0 24px; font-size: 13px; `, default: ` height: 24px; padding: 0 30px; font-size: 13px; `, }, buttonColors: { green: ` background-color: #a2d628; color: ${colorToRgba('#a2d628', 0.5)}; `, blue: ` background-color: #507bfc; color: ${colorToRgba('#507bfc', 0.5)}; `, lightBlue: ` background-color: #10aee7; color: ${colorToRgba('#10aee7', 0.5)}; `, default: ` background-color: #cccccc; color: ${colorToRgba('#cccccc', 0.5)}; ` }
选项的实现:
export const buttonSize = variant({ prop: 'size', key: 'buttonSizes' }); export const buttonColor = variant({ prop: 'colors', key: 'buttonColors' });
按钮组件
export const Button = styled(Box.withComponent('button'))` ${buttonSize} ${buttonColor} `; Button.propTypes = { ...buttonSize.propTypes, ...buttonColor.propTypes, }
使用中型蓝色按钮的示例
<Button size="md" colors="blue" />
办公室中样式系统的更详细的描述和文档
。 github页面UPD:撰写文章时,样式化的系统具有自己的页面,其中包含文档和示例
https://styled-system.com/ 。