React中Css几种实现方案
全局样式
与传统 html 标签类属性不同,react 中 class 必须编写为 className,比如
全局 css
.box {
background-color:red;
width:300px;
height:300px;
}
js
function Hello() {
return <div className='box'>hello react</div>
}
ReactDOM.render(<Hello />, document.getElementById('root'))
与传统在 html 标签定义 css 样式不同,因为这不是传统的 html 代码,而是 JSX,由于 class 作为关键字,无法作为标识符出现,比方说下面的代码将会报错。
const { class } = { class: 'foo' } // Uncaught SyntaxError: Unexpected token }
const { className } = { className: 'foo' }
const { class: className } = { class: 'foo' }
关于官方也有对此问题回答
有趣的话题,为什么 jsx 用 className 而不是 class
所以把传统的 html 代码强行搬运到 react 中,如果带有 class 与 style 属性,那么将会报错。
内联样式
内联样式也得写成对象 key-value 形式,遇到-连字符,则需要大写,如
function Hello() {
return (
<div className='box' style={{ fontSize: '32px', textAlign: 'center' }}>
hello react
</div>
)
}
CSS 的font-size
属性要写成fontSize
,这是 JavaScript 操作 CSS 属性的约定。
其实 可传入表达式,比方这里传入的就是{ fontSize: "32px",textAlign: "center" }
对象,也可以将其定义为一个变量传入。
但是写内联样式显得组丑陋影响阅读,并且样式不易于复用,同时伪元素与媒体查询无法实现,但是封装成类样式,又会影响到全局作用域,所以便有了局部样式styles.module.css
。
局部样式 CSS Modules
Css Modules 并不是 React 专用解决方法,适用于所有使用 webpack 等打包工具的开发环境。以 webpack 为例,在 css-loader 的 options 里打开modules:true
选项即可使用 Css Modules。一般配置如下
{
loader: "css-loader",
options: {
importLoaders: 1,
modules: true,
localIdentName: "[name]__[local]___[hash:base64:5]" // 为了生成类名不是纯随机
},
},
然后通过 import 引入
import styles from './styles.module.css'
function Hello() {
return <div className={styles.box}>hello react</div>
}
但如果是有多个局部样式,直接拼接是无效的(毕竟是个无效的表达式)
// 错误
<div className={style.class1 style.class2}</div>
// 正确
<div className={`${style.class1} ${style.class2}`}</div>
<div className={style.class1+ " " +style.class2}</div>
<div className={[style.class1,style.class2].join(" ")}</div>
classnames
还可以通过 npm 包 classnames 来定义类名,如
import classnames from 'classnames'
import styles from './styles.module.css'
;<div className={classnames(styles.class1, styles.class2)}></div>