Styled Components
上一篇《CSS Modules》仍然是在CSS文件里写CSS。
随着JSX的出现,前端开始在JS里写HTML。那么更进一步,JS里也可以写CSS。
Styled Components
styled-components
是一个JS库,它利用ES6新增的标签模板语法,将用户在JS中写的样式字符串,转换为JSX能够使用的组件。
jsx
import React from 'react';
import styled from 'styled-components';
const StyledCounter = styled.div`
display: flex;
/* ... */
`;
const Paragraph = styled.p`
/* ... */
`;
const Button = styled.button`
/* ... */
`;
export default class Counter extends React.Component {
state = { count: 0 };
increment = () => this.setState({ count: this.state.count + 1 });
decrement = () => this.setState({ count: this.state.count - 1 });
render() {
return (
<StyledCounter>
<Paragraph>{this.state.count}</Paragraph>
<Button onClick={this.increment}>+</Button>
<Button onClick={this.decrement}>-</Button>
</StyledCounter>
);
}
}
除了使用styled
其自带的HTML标签函数,也可以为JSX组件附加样式
jsx
const Link = ({ className, children }) => (
<a className={className}>
{children}
</a>
);
const StyledLink = styled(Link)`
color: #BF4F74;
font-weight: bold;
`;
render(
<div>
<Link>Unstyled, boring Link</Link>
<br />
<StyledLink>Styled, exciting Link</StyledLink>
</div>
);
优缺点
Styled Components和Tailwind一样是一个有争议的开发CSS的解决方案。
Tailwind是什么,一言以蔽之:在html class里写样式。
优点
- 可以在JSX中实现单文件组件了
- 更好的跨平台支持。HTML、CSS是不能跨平台的,JS可以,例如weex、小程序
缺点
- 通过JS操作动态样式,牺牲了一些性能
- 不可提取为css文件,无法在构建时去除未使用到的样式
- 更复杂的语义管理问题,组件命名时需要描述这是什么样式的什么组件
- 如果书写错误,会报JS错误,且难以定位错误位置
小结
Styled Components是一种CSS in JS
解决方案,它有着 CSS in JS 通用的跨平台支持特性,也具有 CSS in JS 造成性能下降的通病。
如果应用性能要求不高的话,我还是推荐使用Styled Components或其他 CSS in JS 方案,因为单文件组件是体验过就回不去的,也具有可扩展跨平台的潜力,适应未来需求迭代。