styled-components

styled-components 是一个常用的 css in js 类库。使得css代码也有了作用域。和所有同类型的类库一样,通过 js 赋能解决了原生 css 所不具备的能力,比如变量、循环、函数等。诸如 sass&less 等预处理可以解决部分 css 的局限性,但还是要学习新的语法,而且需要对其编译,其复杂的 webpack 配置也总是让开发者抵触。而 styled-componens 很好的解决了这些问题,很适合 React 技术栈的项目开发。

安装和使用

1
npm install styled-components 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import React from 'react';
import styled from 'styled-components'
class InfoNav extends React.Component {
render() {
const H1 = styled.h1`
background-color: #a1a;
text-align: center;
>span{
color:blue;
}
`;
return (
<React.Fragment>
<H1>
<span>信息完善页面</span>
</H1>
</React.Fragment>
)
}
}
export default InfoNav;

代码提示和高亮

ide 貌似没能做到代码高亮和提示
官网有vscode的插件

1
vscode-styled-components

组件样式继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import React from 'react';
import styled from 'styled-components'
class InfoNav extends React.Component {
render() {
const H1 = styled.div`
background-color: #a1a;
text-align: center;
font-size:20px;
`;
const SPAN = H1.extend`
color: white;
`;
return (
<React.Fragment>
<H1>
<SPAN>{this.props.name}信息完善页面</SPAN>
</H1>
</React.Fragment>
)
}
}
export default InfoNav;

组件内部使用 className

1
2
3
4
<Wrapper>
<h4>Hello Word</h4>
<div className="detail"></div>
</Wrapper>

对于这种 styled-components 和 className 混用,或者是一些伪类的情况同样是支持的:

1
2
3
4
5
6
7
8
9
10
11
12
13
import styled from 'styled-components';
const Wrapper = styled.div`
display: block;
h4 {
font-size: 14px;
&:hover {
color: #fff;
}
}
.detail {
color: #ccc;
}
`;

当然还可以通过 injectGlobal 的方式将通用的样式注入到全局中:

1
2
3
4
5
6
7
8
9
10
11
import styled, { injectGlobal } from 'styled-components';
injectGlobal`
@font-face {
font-family: 'Operator Mono';
src: url('../fonts/Operator-Mono.ttf');
}

body {
margin: 0;
}
`;

CSS 动画支持

styled-components 同样对 css 动画中的 @keyframe 做了很好的支持。

1
2
3
4
5
6
7
8
9
10
11
12
13
import { keyframes } from 'styled-components';
const fadeIn = keyframes`
0% {
opacity: 0;
}
100% {
opacity: 1;
}
`;

const FadeInButton = styled.button`
animation: 1s ${fadeIn} ease-out;
`;

keyframes 方法会生成一个唯一的 key 作为 keyframes 的名称,保证它的作用域是在单个文件内,非全局的。

总结

下面简单总结一下 styled-components 在开发中的表现:

  • 提出了 container 和 components 的概念,移除了组件和样式之间的映射关系,符合关注度分离的模式;
  • 可以在样式定义中直接引用到 js 变量,共享变量,非常便利;
  • 支持组件之间继承,方便代码复用,提升可维护性;
  • 兼容现有的 className 方式,升级无痛;
  • 在实际应用中我们完全可以将 style 和 jsx 分开维护

原文链接:https://juejin.im/entry/59a57a2b5188252445327ac1

参考 : https://www.jianshu.com/p/f188f7ea59b3


styled-components
http://example.com/2018/02/26/使用 styled-components/
作者
shoukailiang
发布于
2018年2月26日
许可协议