React 进阶(四)CSS 方案
内联样式
伪类和伪元素不支持。
import { PureComponent } from 'react'
class InLine extends PureComponent {
render() {
return <div style={{ color: 'red' }}>Hello World</div>
}
}
export default InLine
CSS 文件
容易造成样式冲突,需要特别注意。
CSS Modules
不能使用连接符(可以使用驼峰),不方便动态修改。
import { PureComponent } from 'react'
import style from './CSSModules.module.css'
class CSSModules extends PureComponent {
render() {
return <div className={style.title}>CSSModules</div>
}
}
export default CSSModules
.title {
color: red;
}
Less
不建议修改 webpack 配置(需要 eject 后配置),建议使用 craco(Ant Design 使用的也是这个)。
npm install @craco/craco craco-less
修改启动和打包脚本:
"scripts": {
"start": "craco start",
"build": "craco build",
"test": "craco test",
"eject": "react-scripts eject"
}
创建配置文件 craco.config.js:
const CracoLessPlugin = require('craco-less')
module.exports = {
plugins: [
{
plugin: CracoLessPlugin,
options: {
lessLoaderOptions: {
lessOptions: {
modifyVars: { '@success-color': '#1DA57A' },
javascriptEnabled: true
}
}
}
}
]
}
@primary-color: red;
.title {
color: @primary-color;
}
CSS in JS(styled-components)
流行的库:styled-components、emotion、glamorous
npm install styled-components
import { PureComponent } from 'react'
import { DivWrapper } from './StyledComponents'
class StyledComponents extends PureComponent {
constructor(props) {
super(props)
this.state = { backgroundColor: 'green' }
}
render() {
const { backgroundColor } = this.state
return (
<DivWrapper backgroundColor={backgroundColor}>
<p className="title">Hello World</p>
</DivWrapper>
)
}
}
export default StyledComponents
import styled from 'styled-components'
const dangerColor = 'red'
export const DivWrapper = styled.div.attrs({
bColor: (props) => props.borderColor || 'blue'
})`
color: ${dangerColor};
background-color: ${(props) => props.backgroundColor};
border: 1px solid ${(props) => props.bColor};
.title {
font-size: 20px;
}
`
动态添加 className
使用 classnames 库:
import { PureComponent } from 'react'
import classNames from 'classnames'
class ClassNames extends PureComponent {
constructor(props) {
super(props)
this.state = { isB: true }
}
render() {
const { isB } = this.state
return <div className={classNames('a', { b: isB })}>Hello World</div>
}
}
export default ClassNames