[转载]css modules使用方法

原文链接:https://www.cnblogs.com/kugeliu/p/7889018.html

css modules调研

css模块化解决方案

  • 抛弃css (Radium,jsxstyle,react-style)
  • 利用js来管理样式依赖(css Modules)

css模块化面临的问题

  • 全局污染
  • 命名混乱
  • 依赖管理不彻底
  • 无法共享变量
  • 代码压缩不彻底

启用CSS Modules,webpack配置

...
{
    test: /\.css$/,
    use: [
        {
            loader: 'style-loader'
        },
        {
            loader: 'css-loader?modules&localIdentName=[name]-[hash:base64:5]'
        }
    ]
},
...

在项目当中使用

Test.jsx

import React, { Component } from 'react';
// 将样式文件当成模块引入
import styles from "./test.css";


export default class Test extends Component {
    render() {
        return (
            <div>
                <div className={styles.test}>测试</div>
            </div>
        )
    }
}

test.css

.test {
    color: red;
}

以上就是CSS Modules的基本用法

用法进阶

全局样式和局部样式

开启CSS Modules之后默认的样式都为局部样式

// css 样式
(:global)(.test1) {
    color: blue;
}
或者如下(定义多个全局样式)
:global {
    .test1 {
        color: blue;
    }
    .test2 {
        color: red;
    }
}

// 全局样式写法和之前一样
import React, { Component } from 'react';
import styles from "./test.css";
export default class Test extends Component {
    render() {
        return (
            <div>
                <div className="test1">测试</div>
            </div>
        )
    }
}

Compose 组合样式

// 样式文件
.base { 
    font-size: 20px;
 }

.normal {
  composes: base;
  color: #333;
}

.disabled {
  composes: base;
  color: #ddd;
}
// 组件中
import React, { Component } from 'react';
import styles from "./test.css";
export default class Test extends Component {
    render() {
        return (
            <div>
                <div className="normal">测试</div>
            </div>
        )
    }
}
// 编译后的html文件
<d class="div--base-daf62 div--normal-abc53">测试</div>
// 由于在 .normal 中 composes 了 .base,编译后会 normal 会变成两个 class。

CSS Modules 使用技巧

  • 不使用选择器,只使用class名来定义样式
  • 不叠加多个class
  • 所有样式通过composes组合来实现复用
  • 不嵌套

CSS Modules React 项目实践

import classNames from 'classnames';
import styles from './dialog.css';

export default class Dialog extends React.Component {
  render() {
    const cx = classNames({
      [styles.confirm]: !this.state.disabled,
      [styles.disabledConfirm]: this.state.disabled
    });

    return <div className={styles.root}>
      <a className={cx}>Confirm</a>
      ...
    </div>
  }
}

关于样式覆盖问题

因为CSS Modules 不会覆盖属性选择器,所以可以利用属性选择器来解决这个问题

// 组件中
...
return (
    <div data-role='test'>
        测试
    </div>
)
...
// 样式
[data-role="test"] {
    color: red;
}

如何与全局样式共存

import Component from './view/Component'
// 全局样式
import './styles/app.scss';
// 以下为组件相关样式(局部样式)
import './Component.scss';

SASS与CSS Modules配合使用

module: {
  loaders: [{
    test: /\.jsx?$/,
    loader: 'babel'
  }, {
    test: /\.scss$/,
    exclude: path.resolve(__dirname, 'src/styles'),
    loader: 'style-loader!css-loader?modules&localIdentName=[name]__[local]!sass?sourceMap=true'
  }, {
    test: /\.scss$/,
    include: path.resolve(__dirname, 'src/styles'),
    loader: 'style-loader!css-loader!sass-loader?sourceMap=true'
  }]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值