第4节——react 中如何编写样式

news2024/12/23 22:46:07

一、内联样式

内联样式就是在JSX元素中,直接定义行内的样式。与普通的HTML内联样式唯一的区别就是,JSX中的内联样式是一个对象,而不是一个字符串。

import React from 'react'

export default class LearnStyle extends React.Component {


  render () {
    return (
      <div>
        {/* 
          在jsx中变量要使用{}括起来
          对象也是变量 所以要在外层加一个{}
          值是一个字符串
        */}
        <div style={{color: 'red'}}>红色的文字</div>
        {/* 
          如果样式名中带有中划线,则样式的key也要加''
        */}
        <div style={{'margin-top': '10px'}}>距离上面10px</div>
        {/* 
          如果不想加中划线,也可以使用驼峰的形式
        */}
        <div style={{marginTop: '20px'}}> 距离上面20px </div>
      </div>
    )
  }
}

二、CSS样式表

在jsx中定义类名,不能使用class,而是使用className。因为class是JavaScript中的一个保留字。

创建learn-class-name.css文件

这个文件里可以编写任意css代码

.red {
  color: red;
}

在jsx中定义className

import React from "react";

/**
 * 使用es module 语法直接引入css样式
 * 注意:不要忘记后缀
 */
import './learn-className.css'

export default class LearnClassName extends React.Component {

  render () {
    return (
      <div>
        {/* 使用className定义类名 */}
        <div className="red">红色</div>
      </div>
    )
  }
}

三、样式污染问题

1、产生原因

React最终编译打包后都在一个html页面中,如果在两个组件中取一样类名分别引用在自身,那么后者会覆盖前者。默认情况下,只要导入了组件,不管组件有没有显示在页面中,组件的样式就会生效。也就是说并没有自己的局部作用域

2、解决思路

1、手动处理 (起不同的类名,但是项目一大就会导致类名很乱,不利于团队协作)

2、CSS IN JS : 以js的方式来处理css(推荐)

3、CSS IN JS

CSS IN JS是使用 JavaScript 编写 CSS 的统称,用来解决 CSS 样式冲突、覆盖等问题。

CSS IN JS 的具体实现有 50 多种,比如:React常用(CSS Modules、styled-components)、 Vue常用(

推荐使用:CSS Modules (脚手架自动集成)

4、CSS Modules

CSS Modules 通过对 CSS 类名重命名,保证每个类名的唯一性,从而避免样式冲突的问题。也就是说:所有类名都具有“局部作用域”,只在当前组件内部生效。在 React 脚手架中:文件名、类名、hash(随机)三部分,只需要指定类名即可 BEM。

文件名_类名_hash
[filename]_[classname]_[hash]

5、react使用 css module

创建名为 learn-className.module.css 的样式文件(create-react-app中的约定,与普通 CSS 作区分)。文件里可以编写任意css代码

.red {
  color: red;
}

在组件中引入

import React from "react";

/**
 * 使用es module 语法直接引入css样式
 * 注意:不要忘记后缀
 */
// import './learn-className.css'

/**
 * 引入的时候需要设置一个变量接收刚定义的css module模块
 * 并且引入的时候注意写完路径learn-className.module.css
 * Styles是一个对象,里面存放的就是我们定义的样式
 */
import Styles from "./learn-className.module.css";

export default class LearnClassName extends React.Component {
  render() {
    return (
      <div>
        {/* 
          使用Styles.xxx 拿到对应的className然后给
          className进行赋值
          注意:必须使用Styles也就说引入的这个对象给className进行
          赋值,否则脚手架将无法根据规则自动生成模块化cssName
         */}
        <div className={Styles.red}>红色</div>
      </div>
    );
  }
}

img

四、react使用sass

create-react-app内置了sass相关的loader,所以我们可以直接安装并使用

1、安装

npm install sass

2、直接使用

直接创建.scss的文件,在里面就可以使用sass相关的语法

创建learn-className.scss

.learn-className {
  .red {
    color: red;
  } 
}

使用的时候和普通css用法一致,直接在对应组件中引入,并且标签上要加上对应的className

import React from "react";

export default class LearnSass extends React.Component {

  render () {
    return (
      <div className="learn-sass">
        <div className="red">红色</div>
      </div>
    )
  }
}

3、结合css module使用

创建learn-className.module.scss在里面就可以使用sass相关的语法

.learn-sass {
  .red {
    color: red;
  } 
}

在组件中引入

import React from "react";
// import './learn-className.scss'
import Styles from "./learn-className.module.scss";

export default class LearnSass extends React.Component {
  render() {
    return (
      // 如果使用了css module 并且使用了 sass的嵌套语法
      // 那么代码中父级的className也要从Styles中拿到
      // js无法直接使用中划线的key,那么我们就可以使用[]的形式
      <div className={Styles["learn-sass"]}>
        <div className={Styles.red}>红色</div>
      </div>
    );
  }
}
并且使用了 sass的嵌套语法
      // 那么代码中父级的className也要从Styles中拿到
      // js无法直接使用中划线的key,那么我们就可以使用[]的形式
      <div className={Styles["learn-sass"]}>
        <div className={Styles.red}>红色</div>
      </div>
    );
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/938190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS中如何实现文字阴影效果(text-shadow)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现思路⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前…

【Linux操作系统】Linux系统编程中的读写锁

文章目录 1.读写锁的原理2.提供的操作函数示例代码4.示例解释 1.读写锁的原理 读写锁&#xff08;Read-Write Lock&#xff09;是一种特殊的锁机制&#xff0c;用于在多线程环境下对共享资源进行读写操作。与互斥锁不同&#xff0c;读写锁允许多个线程同时读取共享资源&#x…

多图详解VSCode搭建Java开发环境

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

JavaSE学习——异常

目录 一、异常概述 二、异常的体系结果 二、异常的处理&#xff1a;抓抛模型 三、try-catch-finally的使用 四、throws 异常类型 的使用 五、开发中如何选择使用try-catch-finally还是使用throws&#xff1f; 六、自定义异常 自定义异常步骤&#xff1a; 七、总结&a…

Android 13 - Media框架(7)- NuPlayer::Source

Source 在播放器中起着拉流&#xff08;Streaming&#xff09;和解复用&#xff08;demux&#xff09;的作用&#xff0c;Source 设计的好坏直接影响到播放器的基础功能&#xff0c;我们这一节将会了解 NuPlayer 中的通用 Source&#xff08;GenericSource&#xff09;关注本地…

MySQL数据库——多表查询(1)-多表关系(一对多、多对对多、一对一)、多表查询概述(概念、笛卡尔积、分类)

目录 概述 多表关系 一对多&#xff08;多对一&#xff09; 多对多 一对一 多表查询概述 概念 笛卡尔积 分类 多表查询 多表关系多表查询概述内连接外连接自连接子查询多表查询案例 概述 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及…

框架分析(6)-Ruby on Rails

框架分析&#xff08;6&#xff09;-Ruby on Rails 专栏介绍Ruby on Rails核心概念以及组件讲解MVC架构模式约定优于配置强大的ORM支持自动化测试丰富的插件生态系统RESTful路由安全性总结 优缺点优点快速开发简单易学MVC架构强大的ORM支持大量的插件和Gem支持 缺点性能问题学习…

【Go 基础篇】Go语言数组遍历:探索多种遍历数组的方式

数组作为一种基本的数据结构&#xff0c;在Go语言中扮演着重要角色。而数组的遍历是使用数组的基础&#xff0c;它涉及到如何按顺序访问数组中的每个元素。在本文中&#xff0c;我们将深入探讨Go语言中多种数组遍历的方式&#xff0c;为你展示如何高效地处理数组数据。 前言 …

从零做软件开发项目系列之六——软件测试

前言 软件测试是指在软件开发过程中对软件系统进行验证和验证的过程。它的目的是确保软件能够按照设计要求正常运行&#xff0c;同时检测和纠正可能存在的缺陷和问题。软件测试有助于提高软件质量、可靠性和用户满意度。 1 测试阶段 软件测试阶段是软件开发过程中的重要环节…

【电源专题】18650圆柱电芯内部结构及器件

18650圆柱锂离子电池是一种直径为18mm、高度为65mm的锂离子电池,它最大的特点是拥有非常高的能量密度,它是比较成熟的锂离子电池,各方面系统质量稳定性较好,广泛适用于10千瓦时左右的电池容量场合,例如在、在手机、笔记本电脑等小型电器上。 常见的18650电池分为锂离子电池…

【IMX6ULL驱动开发学习】09.Linux之I2C驱动框架简介和驱动程序模板

参考&#xff1a;Linux之I2C驱动_linux i2c驱动_风间琉璃•的博客-CSDN博客​​​​​​ 目录 一、I2C驱动框架简介 1.1 I2C总线驱动 1.2 I2C设备驱动 二、I2C总线-设备-驱动模型 2.1 i2c_driver 2.2 i2c_client 2.3 I2C 设备数据收发和处理 三、Linux I2C驱动程序模板…

自然语言处理: 第十章GPT的API使用

理论基础 现在的以GPT为首的生成类模型&#xff0c;它拥有对话的能力&#xff0c;它会根据你输入的暗示(prompt)或者指令(instruct)生成对应的回答。所以&#xff0c;不同的输入会导致不同的输出(其实由于chatgpt最终生成的答案是beam_search 以及随机采样的机制&#xff0c;所…

自定义Chronometer实现定时器

概述 自定义Chronometer实现定时器,引用方便&#xff0c;操作简单。 详细 前言 在Android开发过程中&#xff0c;计时控件是经常回使用到的&#xff0c;在Android控件库中有一个能快捷实现计时功能的控件&#xff0c;它就是Chronometer&#xff0c;今天我们基于它自定义实现…

LLM - Model Load_in_8bit For LLaMA

一.引言 LLM 量化是将大语言模型进行压缩和优化以减少其计算和存储需求的过程。 博主在使用 LLaMA-33B 时尝试使用量化加载模型&#xff0c;用传统 API 参数控制量化失败&#xff0c;改用其他依赖尝试成功。这里先铺下结论: ◆ Load_in_8bit ✔️ ◆ Load_in_4bit ❌ 二.LL…

基于SpringBoot+MybatisPlus+Shiro+mysql+redis智慧云智能教育平台

基于SpringBootMybatisPlusShiromysqlredis智慧云智能教育平台 一、系统介绍二、功能展示三.其他系统实现五.获取源码 一、系统介绍 声明&#xff1a;Java智慧云智能教育平台源码 前后端分离、 开发语言&#xff1a;JAVA 数据库&#xff1a;MySQL5.7以上 开发工具&#xff…

08 通过从 库1 复制 *.ibd 到 库2 导致 mysql 启动报错

前言 呵呵 最近同事有这样的一个需求 需要将 库1 的一张表 复制到 库2 然后 我想到了 之前一直使用的通过复制这个库的 data 文件来进行数据迁移的思路, 是需要复制这个 库对应的 data 目录下的数据文件, 以及 ibdata1 文件 然后 我又在想 这里的场景能否也使用这里的额方式…

基于树莓派设计的酒店房间号智能识别系统(图像识别)

基于树莓派4B设计的酒店房间号智能识别系统(图像识别) 一、设计需求 酒店房间识别系统的主要目的是:通过图像处理技术,以机器视觉的方式识别光学传感器传回的酒店房间图像中的数字,该系统可以以非接触的方式,以图像的方式获得需要的酒店房间读数,这能极大提高老式的酒店房…

ssp offer技巧 | 面试经验专栏介绍 | 金九银十

前言&#xff1a;欢迎来到我的面试经验专栏&#xff01;在这个专栏中&#xff0c;我将与大家分享我在多个领域的面试经验&#xff0c;涵盖Java、GO、操作系统、Mysql、计算机网络、Redis等领域。作为一名经验丰富的技术人员&#xff0c;我将通过文章的形式&#xff0c;为大家提…

基于SpringBoot的在线聊天系统

基于SpringBoot的在线聊天系统 一、系统介绍二、功能展示三.其他系统实现五.获取源码 一、系统介绍 源码编号&#xff1a;F-S03点击查看 项目类型&#xff1a;Java EE项目 项目名称&#xff1a;基于SpringBoot的在线聊天系统 项目架构&#xff1a;B/S架构 开发语言&#x…

【【萌新的STM32学习-16中断的基本介绍1】】

萌新的STM32学习-16中断的基本介绍1 中断 什么是中断 中断是打断CPU执行正常的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续执行&#xff0c;就叫中断 中断的作用 实时控制 &#xff1a; 就像对温度进行控制 故障控制 &#xff1a; 第一时间对突发情…