React-CSS

1. React中的样式
React并没有像Vue那样提供特定的区域给我们编写CSS代码
所以你会发现在React代码中, CSS样式的写法千奇百怪

2. 内联样式

  • 内联样式的优点:
    • 内联样式, 样式之间不会有冲突
    • 可以动态获取当前state中的状态
  • 内联样式的缺点:
    • 写法上都需要使用驼峰标识
    • 某些样式没有提示
    • 大量的样式, 代码混乱
    • 某些样式无法编写(比如伪类/伪元素)
class App extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            color: 'red'
        }
    }
    render(){
        return (
            <div>
                <p style={{fontSize:'50px', color: this.state.color}}>我是段落1</p>
                <p style={{fontSize:'50px', color:'green'}}>我是段落2</p>
                <button onClick={()=>{this.btnClick()}}>按钮</button>
            </div>
        );
    }
    btnClick(){
        this.setState({
            color: 'blue'
        })
    }
}
export default App;

3. 外链样式
将CSS代码写到一个单独的CSS文件中, 在使用的时候导入进来

  • 外链样式的优点:
    • 编写简单, 有代码提示, 支持所有CSS语法
  • 外链样式的缺点:
    • 不可以动态获取当前state中的状态
    • 属于全局的css,样式之间会相互影响
//Home.tsx文件
import React from 'react';
import './Home.css'
class Home extends React.Component{
    render() {
        return (
            <div id={'home'}>
                <p>我是home段落</p>
                <a href={'www.it666.com'}>我是home超链接</a>
            </div>
        )
    }
}
export default Home;
/*Home.css文件*/
#home p{
    font-size: 50px;
    color: red;
}
#home a{
    color: yellow;
}

4.Css Module

  • React的脚手架已经内置了css modules的配置:
    • .css/.less/.scss 等样式文件都修改成 .module.css/.module.less/.module.scss 等;
  • Css Modules优点
    • 编写简单, 有代码提示, 支持所有CSS语法
    • 解决了全局样式相互污染问题
  • Css Modules缺点
    • 不可以动态获取当前state中的状态
      image.png

      那么怎样解决Css Modules缺点不可以动态获取当前state中的状态的问题呢?
      先来了解一下模板字符串
      拓展点——模板字符串
      ES6中的模板字符串
const str = `my name is ${name}, my age is ${age}`;
console.log(str); // my name is yiya_xiaoshan, my age is 18

除此之外,react中还有一些ES6中没有的特性
在JS中除了可以通过()来调用函数以外,,其实我们还可以通过模板字符串来调用函数

function test(...args) {
    console.log(args);
}
test(1, 3, 5); // [ 1, 3, 5 ]
test`1, 3, 5`; // [ [ '1, 3, 5' ] ]

通过模板字符串调用函数规律:

  • 参数列表中的第一个参数是一个数组, 这个数组中保存了所有不是插入的值
  • 参数列表的第二个参数开始, 保存的就是所有插入的值
    总结结论
    我们可以拿到模板字符串中所有的内容\所有非插入的内容
    =>我们可以拿到模板字符串中所有插入的内容
    所以我们就可以对模板字符串中所有的内容进行单独的处理
test`1, 3, 5, ${name}, ${age}`; 
// [ [ '1, 3, 5, ', ', ', '' ], 'yiya_xiaoshan', 18 ]

4. CSS-in-JS
1. 使用CSS-in-JS的原因

  • 在React中, React认为结构和逻辑是密不可分的,所以在React中结构代码也是通过JS来编写的
    正是受到React这种思想的影响, 所以就有很多人开发了用JS来编写CSS的库——styled-components / emotion
  • 利用JS来编写CSS, 可以让CSS具备样式嵌套、函数定义、逻辑复用、动态修改状态等特性, 也就是说, 从某种层面上, 提供了比过去Less/Scss更为强大的功能,所以Css-in-JS, 在React中也是一种比较推荐的方式

2.styled-components使用

  • 安装styled-components
    npm install styled-components --save
  • 导入styled-components
    import styled from 'styled-components';
  • 利用styled-components创建组件并设置样式
    styled.divxxx:xxx
import React from 'react';
import styled from 'styled-components';
// 注意点:
// 默认情况下在webstorm中编写styled-components的代码是没有任何的代码提示的
// 如果想有代码提示, 那么必须给webstorm安装一个插件
const StyleDiv = styled.div`
    p{
        font-size: 50px;
        color: red;
    }
    a{
       font-size: 25px;
       color: green;
    }
`;
class Home extends React.Component{
    render() {
        return (
            <StyleDiv>
                <p>我是home段落</p>
                <a href={'www.it666.com'}>我是home超链接</a>
            </StyleDiv>
        )
    }
}
export default Home;

5. styled-components
5.1 styled-components特性之- props(回调函数)和- attrs

import React from 'react';
//1.导入style-components库
import styled from 'styled-components';
//2.通过回调函数调用props里头的数据
// 通过回调函数调用attrs设置样式
const StyleDiv = styled.div`
    p{
        font-size: 50px;
        color: ${props => props.color};
    }
`;
const StyleInput = styled.input.attrs({
    type:'password'
})``
class Home extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            color: 'red'
        }
    }
    render() {
        return (
            <StyleDiv color={this.state.color}>
                <p>我是home段落</p>
                <a href={'www.it666.com'}>我是home超链接</a>
                <button onClick={()=>{this.btnClick()}}>按钮</button>
                <StyleInput></StyleInput>
            </StyleDiv>
        )
    }
    btnClick(){
        this.setState({
            color: 'green'
        })
    }
}
export default Home;

5.2 如何通过style-components统一设置样式——ThemeProvider

// 在App.js引入ThemeProvider
import { ThemeProvider } from 'styled-components';
<!--通过需要应用样式的组件用ThemeProvider包裹-->
 <ThemeProvider theme={{size:'100px',color:'green'}}>
          <Header/>
          <Header name={"sjl"} age={20}></Header>
 </ThemeProvider>

高阶组件会自动将其ThemeProvider提供的数据保存到子代的props

import React from 'react'
import ReactTypes from 'prop-types'
import styled from 'styled-components'
const StyleDiv1 = styled.div`
  p{
    color:${props=>props.theme.color};
    font-size:${props=>props.theme.size}
  }
`
function Header(props) {
  console.log(props)
  return (
    <div>
      <div className={'header'}>我是头部</div>
    <StyleDiv1>我的世界</StyleDiv1>
    </div>
  )
}
export default Header;

5.3 style-components的继承关系

import React from 'react';
import styled from 'styled-components'
/* const StyleDiv1 = styled.div`
  font-size: 100px;
  color: red;
  background: blue;
`;
const StyleDiv2 = styled.div`
  font-size: 100px;
  color: green;
  background: blue;
`; */
const BaseDiv = styled.div`
  font-size: 100px;
  background: blue;
`;
const StyleDiv1 = styled(BaseDiv)`
  color: red;
`;
const StyleDiv2 = styled(BaseDiv)`
  color: green;
`;
class App extends React.Component{
    render(){
        return (
            <div>
                <StyleDiv1>我是div1</StyleDiv1>
                <StyleDiv2>我是div2</StyleDiv2>
            </div>
        );
    }
}
export default App;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容