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中的状态

那么怎样解决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 ]

test1, 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;
相关推荐
糕冷小美n5 小时前
elementuivue2表格不覆盖整个表格添加固定属性
前端·javascript·elementui
小哥不太逍遥6 小时前
Technical Report 2024
java·服务器·前端
沐墨染6 小时前
黑词分析与可疑对话挖掘组件的设计与实现
前端·elementui·数据挖掘·数据分析·vue·visual studio code
anOnion6 小时前
构建无障碍组件之Disclosure Pattern
前端·html·交互设计
threerocks6 小时前
前端将死,Agent 永生
前端·人工智能·ai编程
问道飞鱼7 小时前
【前端知识】Vite用法从入门到实战
前端·vite·项目构建
爱上妖精的尾巴7 小时前
8-10 WPS JSA 正则表达式:贪婪匹配
服务器·前端·javascript·正则表达式·wps·jsa
shadow fish8 小时前
react学习记录(三)
javascript·学习·react.js
Aliex_git8 小时前
浏览器 API 兼容性解决方案
前端·笔记·学习
独泪了无痕8 小时前
useStorage:本地数据持久化利器
前端·vue.js