CSS module和React 中的应用

html-css012

CSS module和React 中的应用,第1张

由于CSS的规则是全局性的,添加任何一个样式,在全局都有效,优点是方便复用,缺点是会根据 权重的计算 造成样式冲突,非常难以管理。

有了钉子,自然就会有锤子。随着前端的发展出现了各种CSS模块解决方案,主要分两种:

一类是采用JS或者JSON 的方式写CSS,比如 jsxstyle , react-style ,虽然可以采用JS成熟方案来管理css, 但是它无法使用postcss ,sass等css预处理器,并且衍生了大批的api, 使用的代价较大。

另一类还是采用css 来写样式, 不过是通过工具生成CSS作用域的方式实现模块化,比如CSS module。常用的BEM命名技巧或者团队中约定的方案来实现命名空间从而实现模块化,不过约定总会出现问题,于是就出现了通过工具,比如webpack的css-loader根据算法,实现css 模块化。

webpack 内置的 css-loader 自带了CSS modoule, 配置如下:

create-react-app 2.0以上的版本中内置启动了CSS module, 如果需要特殊配置,则需要eject操作, 在webpack.config.js 中:

CSS module 默认采用局部样式,即给每个css 名添加上了“:local”, 对应的全局性的写法:

compose 组合样式:

对于样式复用,CSS module提供了唯一的方式 "compose":

多CSS class 的写法:

Sass 变量与JS共享

Css module 作者建议:

1.不使用选择器,只使用 class 名来定义样式

2.不层叠多个 class,只使用一个 class 把所有样式定义好

3.不嵌套

4.使用 composes 组合来实现复用

采用 classnames 来增强CSS module 在react 中的使用,类似Angular 中的样式指令:

参考链接: https://zhuanlan.zhihu.com/p/20495964

最近在写react的时候碰到了一个小问题:现在css样式我通过下图这样的方式直接引进来的时候,发现会和其他组件里面相同className的会有冲突的现象。正常来说吧,是可以通过不同的组件在className前面加上不同组件的标识做区分的,但是这样感觉不舒服。写习惯了vue的,发现vue里面是可以加scoped将样式私有化,那react应该也会有类似的解决方案吧。

然后找了下发现有个叫做css module的。下图里框着的这刚好就是我想要的。这里是它的地址 CSS Module  

然后看看怎么使用。听说npm eject是个坑,还好这个也不用去eject,create-react-app 2的版本就可以直接使用了,方便快捷用起来也爽 ~ 

注意:然后有一个需要注意的。默认文件名是以 [className].module.scss,就是需要加上.module。本来我也在弄了好久发现不生效,我就eject出来看到config文件下面有写着注释默认是需要加上的,当然如果配置的话就自己去百度看怎么配置了,我这就不写了,怎么简单怎么用~

我想~这个都能看懂为啥这么写吧 ~ 

jsx的{}和把className存数组里,然后join函数在中间加个空格,就拼出了下面这样啦

最后 ~ 有写错的地方麻烦可以指出来哦,也是刚接触几天然后做个整理,蟹蟹  ~ 。 ~