从 vue 转到 react 之后,样式这块不太适应,在 create-react-app 中,通常通过 import css 文件直接引入样式,这种方法就会出现全局污染的问题,css 使用全局选择器机制来设置样式,优点是方便重写样式,缺点是所有的样式都是全局生效,样式可能被错误覆盖,为了避免这种情况,就要进行样式隔离,目前流行的有以下两种方式:
css modules
create-react-app 中内置了使用 CSS Modules 的配置,和 vue 的 scoped 原理相似,都是在生成的 class 后面加了 hash 值,创建.css文件时需要以[name].module.css格式创建
/* style.module.css */
.text {
color: blue
}
// app.jsx
import s from "./style.module.css";
class App extends Component {
render() {
return <div className={s.text}>css-module text</div>;
}
}
/* 编译后 */
.text_3FI3s6uz {
color: blue;
}
styled-component
目前社区里最受欢迎的一款 css in js 类库,个人感觉有点别扭,不太喜欢
// 引入styled-components
import styled from 'styled-components'
// 把给定的样式包装成一个组件
const Wrapper = styled.section`
margin: 0 auto;
width: 300px;
text-align: center;
`
const Button = styled.button`
width: 100px;
color: white;
background: skyblue;
`
render(
<Wrapper>
<Button>Hello World</Button>
</Wrapper>
)
最后总结一下,有一说一,还是 vue 的 scoped 好用。
参考资料
https://chinese.freecodecamp.org/news/introduction-to-css-modules-part-one/
https://kuangpf.com/blog/2019/05/12/css-modules/
https://zhuanlan.zhihu.com/p/28876652