React-CSS

简介: 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 ]
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;
目录
相关文章
|
3天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
278 116
|
18天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
378 38
Meta SAM3开源:让图像分割,听懂你的话
|
12天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
667 219
|
21小时前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
128 95
|
10天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1611 157
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
899 61