React05-样式隔离

news2025/2/5 2:49:04

一、样式隔离方案

css 的样式是全局样式,在书写react组件时,如果写了相同的样式类名,很容易造成样式污染。

在 vue 中,vue 官方提供了样式隔离方法,在组件代码中的 style 标签中加入 scoped,可以让这部分样式代码只在当前作用域(也就是这个组件)中生效。而 react 官方并没有给出样式隔离方案,我们可以采用自定义命名规范,也可以使用第三方库来进行样式隔离。

react 中的样式隔离方案主要有以下三种:

(1) 自定义样式类命名规范,也可以直接使用 BEM 规范;

(2) css module;

(3) css-in-js。

二、BEM 规范

BEM是一种 css 命名方法论,样式类命名为块(Block)、元素(Element)、修饰符(Modifier)的简写。统一的样式类命名方法让 css 便于统一团队开发规范,方便维护。

样式类以 .block__element--modifier 的形式命名,即模块名 + 元素名 + 修饰名

如 .tab-container__item--active,代表 tab 页组件中激活的 tab 页。

三、css module

1. css module 简介

css module 是一种将 css 文件和组件关联起来的方案。它使用不同的命名约定,将 CSS 类名转换为局部作用域的类名,以确保样式仅应用于当前组件。使用 css module,我们可以在组件中导入样式文件,并使用导出的类名来应用样式。这种方式避免了全局样式冲突的问题。

css module 不是官方标准,也不是浏览器的特性,而是在构建步骤(如使用 webpack)中对 css 类名和选择器限定作用域(类似于命名空间)的一种方式。现在 webpack 已经默认开启 css module 功能。

2. css module 使用方法

使用 css module 需要新建一个 css 文件,命名为 组件名.moudle.css,在其中以类选择器和标签选择器的形式写样式代码。在组件代码中以模块的形式引入,然后用 className 使用样式类。

如下面是一个使用 css module 设置样式后的计数器组件:

// Counter.jsx
import {useState} from 'react';
import styles from './Counter.module.css';

export default function Counter() {
  const [count, setCount] = useState(0);
  return (
      <div className={styles.container}>
        <h3>这是一个计数器</h3>
        <span className={styles.number}>{count}</span>
        <button onClick={() => setCount(c => c + 1)}>+</button>
      </div>
  );
}
/* Counter.module.css */
.container {
    margin-top: 20px;
}
h3 {
    color: red;
}
.number {
    color: red;
    font-weight: bold;
    margin-right: 10px;
}

注意:

(1) 类名最好使用驼峰命名,因为最终类名会生成 styles 的一个属性。

(2) css 文件后缀一定要是 .module.css。

3. 效果演示

以下是上述计数器组件的效果展示:

四、emotion

css-in-js 是一种将样式直接写入组件代码中的方案。它通过在组件内部定义样式对象或使用特定的css-in-js 库,将样式与组件紧密集成在一起。这种方式通常使用 JavaScript 对象或模板字面量语法来描述样式,并在运行时将其转换为相应的 css。一些常见的 css-in-js 库有 styled components 和 emotion。这里详细介绍如何使用 emotion。

1. 引入 emotion

(1) 安装 emotion 依赖

yarn add @emotion/react

(2) 在组件代码中使用

/** @jsxRuntime classic */
/** @jsx jsx */
import {jsx, css} from '@emotion/react';

2. 简单使用

可以用 emotion 的语法,直接以行内样式的形式写样式代码。如:

/** @jsxRuntime classic */
/** @jsx jsx */
import {jsx, css} from '@emotion/react';
import {useState} from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);
  return (
      <div css={css`margin-top: 20px;`}>
        <h3 css={css`color: red`}>这是一个计数器</h3>
        <span css={css`
          color: red;
          font-weight: bold;
          margin-right: 10px;
        `}>{count}</span>
        <button onClick={() => setCount(c => c + 1)}>+</button>
      </div>
  );
}

效果和上面使用 css module 一样。

3. 样式定义

使用样式定义的方法,可以实现样式的复用,写法更类似于 css 中得类选择器。

/** @jsxRuntime classic */
/** @jsx jsx */
import {jsx, css} from '@emotion/react';
import {useState} from 'react';

export default function Counter() {
  const styles = {
    container: css`
      margin-top: 20px;
    `,
    h3: css`
      color: red;
    `,
    number: css`
      color: red;
      font-weight: bold;
      margin-right: 10px;
    `
  }
  const [count, setCount] = useState(0);
  return (
      <div css={css`${styles.container}`}>
        <h3 css={css`${styles.h3}`}>这是一个计数器</h3>
        <span css={css`${styles.number}`}>{count}</span>
        <button onClick={() => setCount(c => c + 1)}>+</button>
      </div>
  );
}

可以先在 js 代码中进行样式定义,在 jsx 代码中使用,实现了样式复用。

4. 样式嵌套

emotion 支持样式嵌套,在一个组件的样式上定义其后代组件的样式。

/** @jsxRuntime classic */
/** @jsx jsx */
import {jsx, css} from '@emotion/react';
import {useState} from 'react';

export default function Counter() {
  const styles = {
    container: css`
      margin-top: 20px;
      h3 {
        color: red;
      }
      .number {
        color: red;
        font-weight: bold;
        margin-right: 10px;
      }
    `
  }
  const [count, setCount] = useState(0);
  return (
      <div css={css`${styles.container}`}>
        <h3>这是一个计数器</h3>
        <span className="number">{count}</span>
        <button onClick={() => setCount(c => c + 1)}>+</button>
      </div>
  );
}

5. 样式层叠

emotion 支持在一个组件上使用多个样式定义,相同样式后定义的会覆盖先定义的。

/** @jsxRuntime classic */
/** @jsx jsx */
import {jsx, css} from '@emotion/react';
import {useState} from 'react';

export default function Counter() {
  const styles = {
    container: css`
      margin-top: 20px;
    `,
    h3: css`
      color: red;
    `,
    number: css`
      color: red;
      font-weight: bold;
      margin-right: 10px;
    `,
    blue: css`
      color: blue;
    `
  }
  const [count, setCount] = useState(0);
  return (
      <div css={css`${styles.container}`}>
        <h3 css={css`${styles.h3} ${styles.blue}`}>这是一个计数器</h3>
        <span css={css`${styles.number} ${styles.blue}`}>{count}</span>
        <button onClick={() => setCount(c => c + 1)}>+</button>
      </div>
  );
}

如上所示,我们定义了样式 blue 将 color 设置为蓝色,覆盖了上面定义的红色样式。

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

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

相关文章

Python案例分析|使用Python图像处理库Pillow处理图像文件

本案例通过使用Python图像处理库Pillow&#xff0c;帮助大家进一步了解Python的基本概念&#xff1a;模块、对象、方法和函数的使用 使用Python语言解决实际问题时&#xff0c;往往需要使用由第三方开发的开源Python软件库。 本案例使用图像处理库Pillow中的模块、对象来处理…

Java中的JDBC编程(数据库系列6)

目录 前言&#xff1a; 1.什么是Java的JDBC编程 2.JDBC的数据库驱动包的导入过程 3.JDBC代码的编写 3.1创建并初始化一个数据源 3.2和数据库服务器建立连接 3.3构造SQL语句 3.4执行SQL语句 3.5释放必要的资源 3.6整体代码的展示及演示 3.7代码的优化 3.8 查询操作的…

「深度学习之优化算法」(十四)麻雀搜索算法

1. 麻雀搜索算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   麻雀搜索算法(sparrow search algorithm)是根据麻雀觅食并逃避捕食者的行为而提出的群智能优化算法。提出时间是2020年,相关的论文和研究还比较少,有可能还有一些正在发表中,受疫情影响需要论…

关于学习过程中的小点

nfev : 函数求值次数njev : Jacobian 评估的数量nit :算法的迭代次数 permute(dims)#维度转换 torch.split #[按块大小拆分张量] Pytorch.view Pytorch中使用view()函数对张量进行重构维度&#xff0c;类似于resize()、reshape()。用法如下&#xff1a;view(参数a,参数b,...)&a…

Nacos1.4.2单机与集群的安装部署

CentOS 部署Nacos1.4.2 下载 nacos 下载链接&#xff1a;https://github.com/alibaba/nacos/tags 如何选择我们下载的 nocas 版本&#xff1f; 查看 Spring Cloud Alibaba 与 nacos 版本对应关系&#xff1a;SpringCloudAlibaba 组件对应关系说明 本项目使用 nacos 1.4.2 …

Python(十七)数据类型转换——str()函数和int()函数

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

2023年上半年:C#、Python和一些实用语言

文章目录 C#Pythonerlang和exilirfortranR语言 最近半年的开发任务主要集中在C#和Python上&#xff0c;所以博客内容也几乎围绕这两个部分&#xff0c;偶尔会穿插一些其他语言。下面就对2023年上半年的博客做一个总结。 C# 主要用C#写了一个文本阅读器&#xff0c;提供生成目…

学C的第二十八天【字符串函数和内存函数的介绍(一)】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第二十七天【指针的进阶&#xff08;三&#xff09;】_高高的胖子的博客-CSDN博客 前言&#xff1a; &#xff08;1&#xff09;. C语言中对于字符和字符串的处理很是频繁&…

linux驱动开发:驱动开发框架,linux内核字符设备驱动开发过程

一、驱动框架 1.Linux内核模块和字符驱动的关系 模块是Linux进行组建管理的一种方式, 结构体:对设备的管理内核需要抽象出来一个结构体来描述设备所有的共性信息写驱动需要申请一个结构体并赋值(初始化),然后注册给内核让内核统一管理 驱动:由内核统一管理,所以驱动…

NUXT3学习笔记2

1、配置Ant design Vue (两个安装方式随便选一种&#xff0c;yarn会安装的更快) npm i ant-design-vue --save yarn add ant-design-vue 2、使⽤的 Vite&#xff0c;你可以使⽤ unplugin-vue-components 来进⾏按需加载。 yarn add unplugin-vue-components --save 在nuxt.…

设计模式——享元模式

享元模式 定义 享元模式&#xff08;Flyweight Pattern&#xff09;是池技术的重要实现方式。 使用共享对象可以有效地支持大量的细粒度对象。 优缺点、应用场景 优点 可以大大减少应用程序创建对象的数量&#xff0c;降低程序内存占用。 缺点 提高了系统的复杂度&…

5分钟上手IP代理服务

一 IP代理服务 在网上找了一个性价比高的IP代理服务&#xff0c;一个IP地址1分钱。 二 API协议 调用方式为http协议&#xff0c;响应数据格式支持JSON和txt&#xff0c;都是比较常用的方式。 三 源码范例 包括一些主流的编程语言&#xff0c;一分钟上手。 我用的python比较…

【Redis应用】查看附近(五)

&#x1f697;Redis应用学习第五站~ &#x1f6a9;本文已收录至专栏&#xff1a;Redis技术学习 查看附近的XXX在我们的实际应用中非常广泛&#xff0c;能支持该功能的技术有很多&#xff0c;而在我们的Redis中主要依靠GEO数据结构来实现该功能&#xff01; 一.GEO用法引入 GE…

问题解决:win10连接手机热点总是频繁自动断开

问题描述:尝试解决 问题解决:win10连接手机热点总是频繁自动断开 问题描述: 在使用win10笔记本电脑连接手机热点上网时,是不是的网络自动就断掉了,而且重新连上后,用着用着又断了, 这就让人有点恼火了, 尝试解决 重启电脑与手机 以前没出现过而现在有这种情况,可能是电脑或手机…

Spark复习笔记

文章目录 Spark在Hadoop高可用模式下读写HDFS运行流程构成组件作业参数RDD机制的理解算子map与mapPartition区别Repartition和Coalesce区别reduceBykey 与 groupByKeyreduceByKey、foldByKey、aggregateByKey、combineByKey区别cogroup rdd 实现原理宽窄依赖为什么要划分stage如…

Elasticsearch:语义搜索、知识图和向量数据库概述

结合对你自己的私有数据执行语义搜索的概述 什么是语义搜索&#xff1f; 语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。 这种方法基于这样的想法&#xff1a;搜索引擎不仅应该匹配查询中的关键字&#xff0c;还应该尝…

LINUX命令:update-alternatives(软件版本管理工具)

前言   在基于 LINUX 操作系统之上安装所需开发环境组件时&#xff0c;可能会遇到无可避免的场景是&#xff1a;同一个组件&#xff0c;我们需要同时使用到两个或者更多的版本&#xff0c;比如 Java 有 1.6、1.7、1.8 等多版本&#xff0c;又比如 Python 有 2、3 等等&#x…

「2024」预备研究生mem-数学强化-整数、因数与倍数

一、整数、因数与倍数 二、带余除数 三、奇数与偶数 四、不定方程

Nature子刊-柔性薄膜上3D电极的直接激光写入

美国俄勒冈大学研究员设计了一种集成在柔性薄膜上的3D微电极阵列&#xff0c;其制造过程结合了传统的硅薄膜处理技术和双光子光刻在微米分辨率下的3D结构的直接激光书写技术&#xff0c;首次提出了一种产生高深宽比结构的方法。 发表在《自然通讯》杂志上的这项研究&#xff0c…

js实现控制台格式化打印版权信息(2023.7.16)

js代码在控制台格式化打印版权信息 2023.7.16 1、需求分析2、js实例&#xff08;浏览器版权信息&#xff09;2.1 百度一下2.1.1 js代码2.1.2 浏览器控制台输出效果 2.2 京东官网2.2.1 js代码2.2.2 浏览器控制台输出效果 2.3 EarthSDK地球页面2.3.1 js代码2.3.2 浏览器控制台输出…