react中通过jsx的语法方式,将html标签和js语法联系在一起,而css的编写方式,没有明确的指定编写方式,目前就有很多不同方法,每个方式各有其优缺点,我们一起来看看常用的定义方式有哪些。
最基础也是最简单的方式就是如html当中编写样式一样,直接内联使用,区别在于jsx中内联使用样式需要用小驼峰命名,不可使用短横线 -,jsx中编写js的表达式需要使用 {},而定义的样式是以对象的形式存在,也是通过{},所以看起来style标签里面使用了两个大括号{}
return(<div style={{color: ‘blue‘}}> hello react </div>)
return(<div className="title"> hello react </div>) // 定义在单独的样式文件 .title { color: ‘blue‘ }
当需要使用多个className,或者通过状态来变更className时,可以通过+来进行字符串拼接,或者使用数组,再通过toString()转成字符串
const isActive = true <h2 className="active foo bar">我是标题1</h2> // active foo bar <h2 className={"foo", (isActive ? "active" : "") }>我是标题2</h2> // active <h2 className={"foo" + (isActive ? " active" : "") }>我是标题3</h2> // foo, active <h2 className={["foo",(isActive ? "active" : "")]}>我是标题4</h2> // foo, active <h2 className={["foo",(isActive ? "active" : "")].join(" ")}>我是标题5</h2> // foo avtive
为了解决这一问题,我们就需要在跟标签处再定义一个className,来包裹当前组件的所有标签,这样css样式的层级就比较多,并且还可能因为选择器优先级的问题(在外层定义了id选择器),而产生样式冲突,同时它不支持获取state属性动态设置样式。
return(<div className="homeComponent">
<div className="title">hello react</div>
</div>)
此时就产生了第三种编写方式,css的模块化,这样的方式可以区分各个组件的样式,不会相互覆盖,而且还能定义伪类,react脚手架当中内置了css modules的配置,我们可以直接将css的文件定义为 xxx.module.css,在xxx.module.css文件中,还是按照以前的css编写方式编写,不同点在于jsx页面中定义className,先引入该css文件,然后定义类名以对象的形式定义
这样一种定义样式的方式能够比较有效的解决样式重叠的问题,麻烦之处就是每次编写样式的时候需要通过对象的语法来定义,并且不支持动态的设置样式。
那么就有了第四种方式,css in js,这是一种代码的理念,react中html和js没有分离,那么css也可以不分离,以js的方式来编写css,使css的编写更加的灵活,既可以像之前写css一样编写,又可以动态的获取属性。这种编写方式需要依赖其它库,这里使用常用的 styled-components来演示。
使用 styled-components之前需要对es6模板字符串的一种语法有了解,我们可以使用模板字符串来对字符串和属性进行拼接,在此之前的拼接可能都需要使用 +
const name = ‘kiki‘ const age = ‘18‘ const user = `my name is ${name}, age is ${age}` console.log(user) // my name is kiki, age is 18
let name = ‘kiki‘, age = 18 function foo(...args){ console.log(args) } foo`hello` foo`my name is ${name}, age is ${age} `
import React, { PureComponent } from ‘react‘ import styled from ‘styled-components‘ const DivStyle = styled.div` background-color: gray; color: #fff; font-size: 20px; ` export default class Profile extends PureComponent{ render(){ return(<div> <DivStyle>我是Profile组件的内容</DivStyle> </div>) } }
import React, { PureComponent } from ‘react‘ import styled from ‘styled-components‘ const InputStyle = styled.input.attrs({ type: ‘text‘, placeholder: ‘请输入内容‘, })` color: ${props => props.color} ` export default class Deliver extends PureComponent{ constructor(props){ super(props) this.state = { color: ‘purple‘ } } render(){ return(<p> <InputStyle type="password" color={this.state.color}/> </p>) } }
以上四种样式在react当中的定义方式是比较常用的,可以根据情况结合使用~