在样式开发过程中,有两个问题比较突出:
为了解决上述问题,我们的脚手架默认使用 CSS Modules 模块化方案,先来看下在这种模式下怎么写样式。
// example.tsimport styles from './example.less';export default ({ title }) => <div className={styles.title}>{title}</div>;
/* example.less */.title {margin-bottom: 16px;color: @heading-color;font-weight: 600;}
用 less 写样式好像没什么改变,只是类名比较简单(实际项目中也是这样),js 文件的改变就是在设置 className 时,用一个对象属性取代了原来的字符串,属性名跟 less 文件中对应的类名相同,对象从 less 文件中引入。
在上面的样式文件中,.title
只会在本文件生效,你可以在其他任意文件中使用同名选择器,也不会对这里造成影响。不过有的时候,我们就是想要一个全局生效的样式呢?可以使用 :global
。
/* example.less */.title {margin-bottom: 16px;color: @heading-color;font-weight: 600;}/* 定义全局样式 */:global(.text) {font-size: 16px;}/* 定义多个全局样式 */:global {.footer {color: #ccc;}.sider {background: #ebebeb;}}
CSS Modules 的基本原理很简单,就是对每个类名(非 :global 声明的)按照一定规则进行转换,保证它的唯一性。如果在浏览器里查看这个示例的 dom 结构,你会发现实际渲染出来是这样的:
<div class="title___3TqAx">title</div>
类名被自动添加了一个 hash 值,这保证了它的唯一性。
除了上面的基础知识,还有一些关键点需要注意:
className
以及 id
进行转换,其他的比如属性选择器,标签选择器都不进行处理,推荐尽量使用 className。上面只对 CSS Modules 进行了最基础的介绍,有兴趣可以参考其他文档: