0401react中使用css-react-css-仿低代码平台项目
文章目录
- 1、普通方式-内联使用css
- 2、引入css文件
- 2.1、示例
- 2.2、classnames
- 3、内联css与引入css文件对比
- 3.1、内联css
- 3.2、 外部 CSS 文件(External CSS)
- 4、css module
- 5、sass
- 6、classnames组合scss modules
- 7、css-in-js
- 7.1、CSS-in-JS 的核心特性
- 7.2、主流 CSS-in-JS 库对比
- 7.3、在 React 中的使用示例
- 7.3.1、使用 styled-components
- 7.3.2、 使用 Emotion(推荐)
- 7.4、CSS-in-JS 的优缺点
- 7.4.1、优点
- 7.4.2、缺点
- 7.5、性能优化策略
- 7.6、与传统 CSS 方案对比
- 7.7、如何选择?
- 7.8、最佳实践
- 结语
1、普通方式-内联使用css
使用规则:
- 和HTML元素的style类似
- 必须是JS对象的写法,不能是字符串
- 样式名要驼峰式写法,如fontSize
优缺点:
- 优点:优先级最高,适合临时调试或覆盖特定样式。
- 缺点:难以维护,样式与内容混杂,无法复用。
- 适用场景:快速测试、临时修复或需要强制覆盖其他样式的场景。
2、引入css文件
2.1、示例
- 使用css文件
- JSX中使用className
- 可使用clsx或者classnames做条件判断
给已发布的div添加额外的样式,QuestionCard.css如下
.list-item {border: 1px solid #ccc;padding: 10px;margin-bottom: 16px;
}.published {border-color: green;
}
QuestionCard.tsx如下所示:
import { FC, useEffect } from "react";import "./QuestionCard.css";...const QuestionCard: FC<PropsType> = (props) => {
...// 已发布的添加样式let itemClassName = "list-item";isPublished && (itemClassName = itemClassName + " published");return (<div key={id} className={itemClassName}>...</div>);
};export default QuestionCard;
这种情况,逻辑稍微复杂的话,代码繁琐,不方便维护,这里我们用第三方库classnames来解决,clsx类似,不在演示。
2.2、classnames
详细安装使用可以参考下面链接1github中介绍,这里直接改造上面样式,QuestionCard.tsx代码如下:
import classnames from "classnames";
import "./QuestionCard.css";const QuestionCard: FC<PropsType> = (props) => {...let itemClassName = classnames("list-item", { published: isPublished });...
3、内联css与引入css文件对比
3.1、内联css
优点:
-
组件化作用域:样式天然限定在当前组件,无需担心全局污染。
-
动态样式灵活:可直接基于
props或state动态计算样式:jsx
复制
<div style={{ opacity: isActive ? 1 : 0.5 }}> -
无类名冲突:无需处理类名命名问题。
-
适合快速原型开发:简单场景下无需维护额外 CSS 文件。
缺点:
- 可维护性差:样式与逻辑混合,代码臃肿,难以复用。
- 功能限制:无法直接使用伪类(
:hover)、媒体查询、动画等 CSS 高级特性。 - 性能问题:频繁更新的动态样式可能触发不必要的重渲染。
- 优先级混乱:内联样式优先级较高,可能意外覆盖外部样式。
适用场景:
- 简单的动态样式(如条件显隐、动态尺寸)。
- 小型组件或临时调试。
- 需要快速验证样式效果的场景。
3.2、 外部 CSS 文件(External CSS)
优点:
- 样式与逻辑分离:代码更清晰,符合关注点分离原则。
- 完整 CSS 功能:支持伪类、媒体查询、动画等所有 CSS 特性。
- 复用性强:可跨组件复用样式(如全局主题、工具类)。
- 性能优化:浏览器可缓存 CSS 文件,减少重复加载。
- 工具链支持:与预处理器(Sass/Less)、PostCSS 无缝集成。
缺点:
- 全局污染风险
4、css module
基本使用,css文件默认命名格式 xxx.module.css,QuestionCard.module.css如下
.list-item {border: 1px solid #ccc;padding: 10px;margin-bottom: 16px;
}.published {border-color: green;
}
QuestionCard.tsx如下:
...
import styles from "./QuestionCard.module.css";const QuestionCard: FC<PropsType> = (props) => {...return (<div key={id} className={styles["list-item"]}>...</div>);
};export default QuestionCard;
效果如下图所示:
5、sass
-
css语法比较原始,如不能嵌套。
-
现在开发一般使用less、sass等预处理语言
-
Vite等工具原生支持Sass Module,后
第一步:安装sass
yarn add sass -D
第二步:编辑样式文件,命名格式 xxxx.module.scss
.list-item {border: 1px solid #ccc;padding: 10px;margin-bottom: 16px;.published-span {color: green;}
}.published {border-color: green;
}
第三步:引入tsx
...
import styles from "./QuestionCard.module.scss";const QuestionCard: FC<PropsType> = (props) => {
...return (<div key={id} className={styles["list-item"]}><strong>{title}</strong> {/* 条件判断 */}{isPublished ? (<span className={styles["published-span"]}>已发布</span>) : (<span>未发布 </span>)}...</div>);
};export default QuestionCard;
效果如下图所示;
6、classnames组合scss modules
以上面为例,给已发布的div设置绿色边框,QuestionCard.tsx如下所示:
...
import styles from "./QuestionCard.module.scss";const QuestionCard: FC<PropsType> = (props) => {
...// 已发布的添加样式const listItemClass = styles["list-item"];const publishedClass = styles["published"];const itemClassName = classnames({[listItemClass]: true,[publishedClass]: isPublished,});return (<div key={id} className={itemClassName}><strong>{title}</strong> {/* 条件判断 */}{isPublished ? (<span className={styles["published-span"]}>已发布</span>) : (<span>未发布 </span>)}...);
};export default QuestionCard;
效果如下所示:

7、css-in-js
在 React 和现代前端开发中,CSS-in-JS 是一种将 CSS 样式直接编写在 JavaScript/JSX 中的技术方案,它通过组件化的方式管理样式,解决了传统 CSS 的全局作用域污染、类名冲突等问题。以下是 CSS-in-JS 的核心解析和主流方案对比:
7.1、CSS-in-JS 的核心特性
| 特性 | 说明 |
|---|---|
| 组件化作用域 | 样式与组件绑定,天然隔离,避免全局污染 |
| 动态样式 | 基于 props 或 state 动态生成样式,无需手动切换类名 |
| 自动厂商前缀 | 自动为 CSS 属性添加浏览器前缀(如 -webkit-) |
| 主题支持 | 通过 Provider 模式轻松实现主题切换 |
| SSR 支持 | 支持服务端渲染(Server-Side Rendering) |
| 原子化 CSS | 部分库(如 Emotion)支持生成原子化 CSS 类,优化性能 |
7.2、主流 CSS-in-JS 库对比
| 库名 | 语法风格 | 优势 | 缺点 | 适用场景 |
|---|---|---|---|---|
| styled-components | 模板字符串 | 生态成熟,社区活跃 | 运行时开销较大 | 通用场景 |
| Emotion | 模板字符串/Object | 高性能,支持原子化 CSS | 配置较复杂 | 性能敏感型项目 |
| JSS | Object 样式 | 轻量级,框架无关 | 可读性较差 | 需要高度定制化的场景 |
| Linaria | 模板字符串 | 零运行时,编译时生成 CSS | 动态样式受限 | 追求极致性能的静态站点 |
7.3、在 React 中的使用示例
7.3.1、使用 styled-components
bash
yarn add styled-components
jsx
import { FC } from "react";
import styled from "styled-components";// 基础组件
const Button = styled.button`padding: 12px 24px;background: ${(props) => (props.primary ? "#1890ff" : "#f5f5f5")};color: ${(props) => (props.primary ? "white" : "#333")};border-radius: 4px;&:hover {opacity: 0.8;}
`;// 继承样式
const LargeButton = styled(Button)`padding: 16px 32px;font-size: 18px;
`;const Demo: FC = () => {return (<div><Button>默认按钮</Button><Button primary>主按钮</Button><LargeButton>大按钮</LargeButton></div>);
};export default Demo;
7.3.2、 使用 Emotion(推荐)
bash
yarn add @emotion/react @emotion/styled
jsx
/** @jsxImportSource @emotion/react */
import { css } from '@emotion/react';
import styled from '@emotion/styled';// 1. 使用 css prop
function DynamicComponent({ isActive }) {return (<divcss={css`padding: 20px;background: ${isActive ? '#1890ff' : '#f5f5f5'};&:hover {opacity: 0.8;}`}>动态样式</div>);
}// 2. 使用 styled API
const StyledButton = styled.button`padding: 12px 24px;border-radius: 4px;${props => props.variant === 'primary' && css`background: #1890ff;color: white;`}
`;function App() {return (<StyledButton variant="primary">Emotion 按钮</StyledButton>);
}
7.4、CSS-in-JS 的优缺点
7.4.1、优点
- 样式与组件共存:无需在多个文件间跳转,提升开发体验。
- 动态样式简便:直接基于组件状态或 props 驱动样式变化。
- 自动作用域隔离:避免类名冲突,适合大型项目。
- 主题和设计系统:通过 Context API 实现跨组件主题传递。
7.4.2、缺点
- 运行时开销:动态生成 CSS 可能影响性能(可通过原子化 CSS 优化)。
- 学习成本:需要熟悉新的 API 和模式。
- 调试困难:生成的类名哈希化,开发者工具中可读性差。
- 包体积增加:引入额外的运行时库(约 10-20 KB)。
7.5、性能优化策略
-
原子化 CSS
使用@emotion/css生成原子类,复用样式声明:jsx
复制
import { css } from '@emotion/css';const flexCenter = css`display: flex;justify-content: center;align-items: center; `;function Component() {return <div className={flexCenter}>居中内容</div>; } -
编译时提取 CSS
使用 Linaria 或 Compiled 在构建时生成静态 CSS 文件:jsx
复制
// 使用 Linaria import { css } from 'linaria';const title = css`font-size: 24px;color: #333; `;function Component() {return <h1 className={title}>标题</h1>; } -
避免频繁样式更新
对于高频更新的样式(如动画),优先使用 CSS 原生动画或transform属性。
7.6、与传统 CSS 方案对比
| 场景 | CSS-in-JS | CSS Modules | 普通 CSS |
|---|---|---|---|
| 作用域管理 | ✅ 自动隔离 | ✅ 哈希类名隔离 | ❌ 需手动管理 |
| 动态样式 | ✅ 基于 props/state | ❌ 需类名切换 | ❌ 需类名切换 |
| 伪类/媒体查询 | ✅ 完整支持 | ✅ 完整支持 | ✅ 完整支持 |
| SSR 支持 | ✅ 完善 | ✅ 支持 | ✅ 支持 |
| 性能 | ⚠️ 运行时开销 | ✅ 高效 | ✅ 高效 |
| 适用项目规模 | 中大型动态项目 | 中大型项目 | 小型项目或遗留系统 |
7.7、如何选择?
- 选择 CSS-in-JS 的场景:
- 项目需要高度动态的样式(如主题切换、复杂交互状态)。
- 团队偏好组件化开发模式,希望样式与逻辑紧密耦合。
- 项目规模较大,需严格避免样式冲突。
- 避免 CSS-in-JS 的场景:
- 追求极致性能(如低端设备或动画密集型应用)。
- 需与非 React 生态共享样式(如跨框架组件库)。
- 项目已稳定使用 CSS Modules 或 Tailwind CSS。
7.8、最佳实践
-
统一样式模式:团队约定使用单一方案(如 Emotion),避免混用多种 CSS 方案。
-
主题规范化:使用 ThemeProvider 管理颜色、间距等设计系统变量:
jsx
复制
// 定义主题 const theme = {colors: { primary: '#1890ff' },spacing: { md: '16px' } };// 在根组件传递主题 import { ThemeProvider } from '@emotion/react';function App() {return (<ThemeProvider theme={theme}><ChildComponent /></ThemeProvider>); }// 子组件中使用主题 const Button = styled.button`padding: ${props => props.theme.spacing.md};background: ${props => props.theme.colors.primary}; `; -
结合静态样式提取:对首屏关键 CSS 使用编译时工具生成,减少运行时开销。
CSS-in-JS 是现代 React 生态中强大的样式方案,尤其适合动态化、组件化的项目需求。根据团队习惯和性能要求选择合适的库,并遵循最佳实践,可显著提升开发效率和可维护性。
结语
❓QQ:806797785
⭐️仓库地址:https://gitee.com/gaogzhen
⭐️仓库地址:https://github.com/gaogzhen
[1]github classnames[CP/OL].
[2]styled-component官网[CP/OL].
[3]Classnames[CP/OL].
相关文章:
0401react中使用css-react-css-仿低代码平台项目
文章目录 1、普通方式-内联使用css2、引入css文件2.1、示例2.2、classnames 3、内联css与引入css文件对比3.1、内联css3.2、 外部 CSS 文件(External CSS) 4、css module5、sass6、classnames组合scss modules7、css-in-js7.1、CSS-in-JS 的核心特性7.2、…...
Devops之GitOps:什么是Gitops,以及它有什么优势
GitOps 定义 GitOps 是一种基于版本控制系统(如 Git)的运维实践,将 Git 作为基础设施和应用程序的唯一事实来源。通过声明式配置,系统自动同步 Git 仓库中的期望状态到实际运行环境,实现持续交付和自动化运维。其核心…...
蓝桥杯真题-危险系数DF
抗日战争时期,冀中平原的地道战曾发挥重要作用。 地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。 我们来定义一个危险系数DF(x,y): 对于两个站点x和…...
《线性表、顺序表与链表》教案(C语言版本)
🌟 各位看官好,我是maomi_9526! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C语言的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更…...
[ctfshow web入门] web33
信息收集 相较于上一题,这题多了双引号的过滤。我猜测这一题的主要目的可能是为了不让使用$_GET[a]之类的语句,但是$_GET[a]也是一样的 没有括号可以使用include,没有引号可以使用$_GET 可以参考[ctfshow web入门] web32,其中的所…...
三、TorchRec中的Optimizer
TorchRec中的Optimizer 文章目录 TorchRec中的Optimizer前言一、嵌入后向传递与稀疏优化器融合如下图所示:二、上述图片的关键步骤讲解:三、优势四、与传统优化器对比总结 前言 TorchRec 模块提供了一个无缝 API,用于在训练中融合后向传递和…...
C++算法之代码随想录(链表)——基础知识
(1)什么是链表 链表是一种线性数据结构。常见的单链表由两部分组成,value(存储节点的值)和next(存储指向下一个节点地址的指针)。链表的头节点称为head。创建链表一般使用结构体(str…...
oracle update 原理
Oracle 11g 中的 UPDATE 操作是数据库修改数据的关键机制,其核心原理涉及事务管理、多版本并发控制(MVCC)、Undo/Redo 日志、锁机制等 1. 执行前的准备 SQL 解析与执行计划: Oracle 解析 UPDATE 语句,生成执行计划&…...
蓝桥杯 15g
班级活动 问题描述 小明的老师准备组织一次班级活动。班上一共有 nn 名 (nn 为偶数) 同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 nn 以内的正整数作为 idid,第 ii 名同学的 idid 为…...
webrtc pacer模块(一) 平滑处理的实现
Pacer起到平滑码率的作用,使发送到网络上的码率稳定。如下的这张创建Pacer的流程图,其中PacerSender就是Pacer,其中PacerSender就是Pacer。这篇文章介绍它的核心子类PacingController及Periodic模式下平滑处理的基本流程。平滑处理流程中还有…...
基于角色个人的数据权限控制
一、适用场景 如何有效控制用户对特定数据的访问和操作权限,以确保系统的安全性和数据的隐私性。 二、市场现状 权限管理是现代系统中非常重要的功能,尤其是对于复杂的B端系统或需要灵活权限控制的场景,可以运用一些成熟的工具和框架&…...
河北工程大学e2e平台,python
题目,选择题包100分! 题目,选择题包100分! 题目,选择题包100分! 联系🛰:18039589633...
BeautifulSoup 踩坑笔记:SVG 显示异常的真正原因
“这图是不是糊了?”以为是样式缺了?试试手动复制差异在哪?想用对比工具一探究竟……简单到不能再简单的代码,有问题吗?最后的真相:viewBox vs viewbox,preserveAspectRatio vs preserveaspectr…...
【AI提示词】创业导师提供个性化创业指导
提示说明 以丰富的行业经验和专业的知识为学员提供创业指导,帮助其解决实际问题并实现商业成功 提示词 # Role: 创业导师## Profile - language: 中英文 - description: 以丰富的行业经验和专业的知识为学员提供创业指导,帮助其解决实际问题并实现商业…...
【OpenCV 对图片做旋转操作】仿射=旋转+平移+缩放+剪切
OpenCV 中的旋转相关函数详解 OpenCV 提供了多种函数用于图像的旋转操作,主要分为 任意角度旋转 和 固定角度旋转。以下是常用函数及详细使用说明: 一、任意角度旋转 1. cv2.getRotationMatrix2D() 生成旋转矩阵,用于定义旋转参数。 函数原…...
【browser-use+deepseek】实现简单的web-ui自动化
browser-use Web-UI 一、browser-use是什么 Browser Use 是一款开源Python库,专为大语言模型设计的智能浏览器工具,目的是让 AI 能够像人类一样自然地浏览和操作网页。它支持多标签页管理、视觉识别、内容提取,并能记录和重复执行特定动作。…...
django数据迁移操作受阻
错误信息: django.db.utils.OperationalError: (1227, Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation)根据错误信息分析,该问题是由于MySQL用户 缺乏SYSTEM_VARI…...
MOS管的发热原因和解决办法
发热来源 如上图,MOS管的工作状态有4种情况,分别是开通过程,导通过程,关断过程和截止过程。 导致发热的损耗主要有两种:开关损耗、导通损耗。 导通损耗 导通损耗比较好计算,根据驱动电压VGS值可以得到MOS…...
4月11日随笔
本来以为大风会很厉害,本来今天早八的微积分不想去了。但是起床发现并没有很大的风,还是去了。 中午回来的路上突然变天,雷阵雨转冰雹。下了大概半小时,所幸挨淋的不是很严重。 中午打了首胜,AI的基本弄完了…...
科技项目验收测试怎么做?验收测试报告如何获取?
科技项目从研发到上市需要一个很长的周期,并且在上市之前还有一个至关重要的交付过程,那就是项目验收,验收需要通过验收测试来呈现。科技项目验收测试是确保项目成功交付的关键步骤,那么是如何进行的呢?企事业单位想要获取科技项…...
Java面试黄金宝典45
1. 非对称加密 RSA 定义:RSA 是一种广泛使用的非对称加密算法,其安全性基于大整数分解的困难性。它使用一对密钥,即公钥和私钥。公钥可公开用于加密消息,而私钥必须保密,用于解密由相应公钥加密的消息。要点: 公钥公开,私钥保密,二者成对出现。加密和解密使用不同的密钥…...
计算机网络学习前言
前言 该部分说明计算机网络是什么?它有什么作用和功能?值不值得我们去学习?我们该如何学习?这几个部分去大概介绍计算机网络这门课程,往后会介绍计算机网络的具体知识点。 1.计算机网络是什么? 计算机网…...
Vuex 源码
以下是关于 Vuex 源码 的系统梳理: 一、Vuex 核心架构设计 1. 整体架构分层 #mermaid-svg-Eqqp2jldNkQwvgcr {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Eqqp2jldNkQwvgcr .error-icon{fill:#552222;}#mermaid…...
AutoEval:现实世界中通才机器人操作策略的自主评估
25年3月来自 UC Berkeley 和 Nvidia 的论文“AutoEval: Autonomous Evaluation of Generalist Robot Manipulation Policies in the Real World”。 可规模化且可复现的策略评估一直是机器人学习领域长期存在的挑战。评估对于评估进展和构建更优策略至关重要,但在现…...
IP组播技术与internet
1.MAC地址分为三类:广播地址;组播地址;单播地址 2.由一个源向一组主机发送信息的传输方式称为组播。 3.组播MAC地址,第一个字节的最后一位为1; 单播MAC地址,第一个字节的最后一位为0; 4.不能…...
基于SSM框架的房屋租赁小程序开发与实现
概述 一个基于SSM框架开发的微信小程序房屋租赁管理系统,该项目实现了用户管理、中介管理、房源信息管理等核心功能。 主要内容 一、管理员模块功能实现 用户管理 管理员可对通过微信小程序注册的用户信息进行修改和删除操作,确保用户数据的准…...
oracle 表空间(Tablespace)
在 Oracle 11g 中,表空间(Tablespace) 是数据库存储架构的核心逻辑单元,其原理基于 逻辑存储与物理存储的分离,通过分层管理数据文件、段(Segment)、区(Extent)和数据块&…...
基于YOLOv8的机场跑道异物检测识别系统:提升航空安全的新一代解决方案(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 机场跑道异物检测领域概述 机场跑道异物(Foreign Object Debris, FOD)是指存在于机场跑道、滑行道等关…...
23种设计模式生活化场景,帮助理解
以下是 23种设计模式的生活化场景 及其核心对比,通过日常例子和比喻帮助理解它们的本质区别和应用场景: 创建型模式(5种) 1. 工厂方法(Factory Method) • 场景:快餐店的点餐系统。 • 问题&a…...
Android学习总结之OKHttp拦截器和缓存
深入理解 OkHttp 拦截器 1. 拦截器接口详解 Interceptor 接口是自定义拦截器的基础,它仅包含一个抽象方法 intercept。以下是对该方法参数和返回值的详细解释: import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import…...
