当前位置: 首页 > Web前端 > CSS

本文了解react中定义样式(css-less-sass)的常用方法

时间:2023-03-30 13:30:55 CSS

react使用jsx语法将html标签和js语法链接在一起,css的写法没有明确规定的写法。目前有很多不同的方法,每种方法都有自己的优点和缺点。我们来看看常用的定义方法。最基本最简单的方法就是直接内联使用,就像在html中写样式一样。不同的是jsx中的内联样式需要用小驼峰命名,不能使用破折号。{},而定义的样式是以对象的形式存在的,也是通过{}的方式存在的,所以样式标签中好像用了两个大括号{}return(helloreact

)这种方法的好处是代码不会冲突,定义的代码作用于当前元素,如果需要动态获取state的值来设置样式,可以也要做。劣势也很明显。当样式较多时,即使将样式作为一个整体抽取出来,作为一个变量赋值给style,仍然会和业务逻辑混在一起,一些伪类等语法是写不出来的。第二种方式可以将css代码和业务逻辑代码分离,在jsx标签中定义className属性,自定义css样式文件,然后通过import引入css/scss/less等样式文件,就是Native使用的css写法,定义伪类等高级选择器写法都支持。return(helloreact
)//在单独的样式文件中定义。title{color:'blue'}这样可以让代码更清晰,并且将css样式和jsx文件分开。当需要使用多个className,或者通过state改变className时,可以用+连接字符串,或者用数组,然后用toString()转换成字符串constisActive=trueIamheading1//activefoobarIamheading2//活动我在标题3//foo,activeIamheading4//foo,activeIamheading5//fooavtive可以直接使用classnames库动态使用类名,方便使用。类名默认公开一个函数。传入的参数可以是字符串、对象和数组,null/undefined/boolean值也不会显示在页面上importclassNamesfrom'classnames'constisShow=falseconstlist=['foo','bar']我是标题6//activefoo我是Title7//activeIamheading8//activefoobar我正在前进8//100但是用react开发的页面叫单页应用,整个项目只有一个页面,样式是在a组件中引用的,即使没有引用b组件,定义了同名的类名,就会有样式,这样,如果c组件和d组件都定义了className属性,分别引入css样式来定义字体颜色,但是最后是字体两者呈现的颜色是后面导入的css文件中的字体颜色,即同名的样式会被覆盖为了解决这个问题,我们需要在根标签处定义一个className来包裹所有的标签当前组件的,这样css样式的层数就多了,也可能是因为selector的优先级(定义在外层id选择器中),导致样式冲突,不支持获取state属性来动态设置样式。return(helloreact
)这个时候就产生了第三种写法,css的模块化,可以区分各组件样式互不覆盖,还可以定义伪类。css模块的配置是在react脚手架中构建的。我们可以直接将css文件定义为xxx.module.css。在xxx.module.css文件中,还是按照之前的css写法写的。不同的是className是在jsx页面中定义的,先导入css文件,然后定义class名称以对象的形式定义importstylefrom'./index.module.css'return(helloreact)这样定义的样式是一个不会重复的字符。这种定义样式的方式可以有效解决样式重叠的问题。麻烦的是每次写样式都需要通过对象的语法来定义,而且不支持动态设置样式。然后就是第四种方式,js中的css,这是一个代码的概念。在react中,html和js是不分离的,所以css也是可以分离的。用js写css让css写起来更灵活,可以像以前的css一样写,可以动态获取属性。这种写法需要依赖其他库。这里我们使用常用的styled-components来进行演示。在使用styled-components之前,我们需要了解es6模板字符串的语法。我们可以使用模板字符串来拼接字符串和属性。拼接前可能需要使用+constname='kiki'constage='18'constuser=`mynameis${name},ageis${age}`console.log(user)//mynameiskiki,ageis18但是模板字符串还有一个用法,就是可以像括号一样调用函数,参数按照一定的规则传递给函数letname='kiki',age=18functionfoo(...args){console.log(args)}foo`hello`foo`mynameis${name},ageis${age}`基于模板字符串的使用,我们来看看如何使用styled-components,首先从styled-components默认暴露的函数中引入功能,并创建一个div标签,并在模板字符串中定义样式,最后将div标签替换为创建的组件。js定义的组件可以提取到一个单独的js文件中,为了方便演示,写在这里。importReact,{PureComponent}from'react'importstyledfrom'styled-components'constDivStyle=styled.div`background-color:gray;颜色:#fff;font-size:20px;`exportdefaultclassProfileextendsPureComponent{render(){return(
我是Profile组件的内容
)}}好像写的方法比较复杂,但其实它有很多有用的方法,除了使用样式,我们可能还需要为一些标签设置一些其他的属性,需要通过当前维护的state属性来区分样式的显示页。定义样式时,value值以函数的形式从props中获取AttributeimportReact,{PureComponent}from'react'importstyledfrom'styled-components'constInputStyle=styled.input.attrs({type:'text',placeholder:'请输入内容',})`color:${props=>props.color}`exportdefaultclassDeliverextendsPureComponent{constructor(props){super(props)this.state={color:'purple'}}render(){return(

)}}在样式中,如果有重复定义样式的方式,要么需要定义多个类名,要么必须重复定义。样式组件提供继承的方式使得样式可以复用。通过styled-components中默认暴露的导出函数,直接传入定义样式的组件;颜色:#fff;font-size:14px;`constRecommondStyle=styled(DivStyle)`font-size:20px;`exportdefaultclassProfileextendsPureComponent{render(){return(
hellostyled-components样式属性的继承
}样式子元素可以从props//父组件中获取import{ThemeProvider}from'styled-components'exportdefaultclassHomeextendsPureComponent{render(){return()}}//子组件导入React,{PureComponent}from'react'importstyledfrom'styled-组件的constDivStyle=styled.div`color:${props=>props.theme.color};`exportdefaultclass关于extendsPureComponent{render(){return(stylesettheme)}}这种css的写法让css的代码更像js,非常灵活,更可重用。以上四种样式在react中的定义比较通用,可以根据情况组合使用~