0401react中使用css-react-css-仿低代码平台项目

news2025/4/15 10:19:54

文章目录

    • 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

优点:

  • 组件化作用域:样式天然限定在当前组件,无需担心全局污染。

  • 动态样式灵活:可直接基于 propsstate 动态计算样式:

    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>
      &nbsp;
      {/* 条件判断 */}
      {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>
      &nbsp;
      {/* 条件判断 */}
      {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配置较复杂性能敏感型项目
JSSObject 样式轻量级,框架无关可读性较差需要高度定制化的场景
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 (
    <div
      css={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、性能优化策略

  1. 原子化 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>;
    }
    
  2. 编译时提取 CSS
    使用 LinariaCompiled 在构建时生成静态 CSS 文件:

    jsx

    复制

    // 使用 Linaria
    import { css } from 'linaria';
    
    const title = css`
      font-size: 24px;
      color: #333;
    `;
    
    function Component() {
      return <h1 className={title}>标题</h1>;
    }
    
  3. 避免频繁样式更新
    对于高频更新的样式(如动画),优先使用 CSS 原生动画或 transform 属性。


7.6、与传统 CSS 方案对比

场景CSS-in-JSCSS Modules普通 CSS
作用域管理✅ 自动隔离✅ 哈希类名隔离❌ 需手动管理
动态样式✅ 基于 props/state❌ 需类名切换❌ 需类名切换
伪类/媒体查询✅ 完整支持✅ 完整支持✅ 完整支持
SSR 支持✅ 完善✅ 支持✅ 支持
性能⚠️ 运行时开销✅ 高效✅ 高效
适用项目规模中大型动态项目中大型项目小型项目或遗留系统

7.7、如何选择?

  1. 选择 CSS-in-JS 的场景
    • 项目需要高度动态的样式(如主题切换、复杂交互状态)。
    • 团队偏好组件化开发模式,希望样式与逻辑紧密耦合。
    • 项目规模较大,需严格避免样式冲突。
  2. 避免 CSS-in-JS 的场景
    • 追求极致性能(如低端设备或动画密集型应用)。
    • 需与非 React 生态共享样式(如跨框架组件库)。
    • 项目已稳定使用 CSS Modules 或 Tailwind CSS。

7.8、最佳实践

  1. 统一样式模式:团队约定使用单一方案(如 Emotion),避免混用多种 CSS 方案。

  2. 主题规范化:使用 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};
    `;
    
  3. 结合静态样式提取:对首屏关键 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].

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

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

相关文章

《线性表、顺序表与链表》教案(C语言版本)

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…

[ctfshow web入门] web33

信息收集 相较于上一题&#xff0c;这题多了双引号的过滤。我猜测这一题的主要目的可能是为了不让使用$_GET[a]之类的语句&#xff0c;但是$_GET[a]也是一样的 没有括号可以使用include&#xff0c;没有引号可以使用$_GET 可以参考[ctfshow web入门] web32&#xff0c;其中的所…

三、TorchRec中的Optimizer

TorchRec中的Optimizer 文章目录 TorchRec中的Optimizer前言一、嵌入后向传递与稀疏优化器融合如下图所示&#xff1a;二、上述图片的关键步骤讲解&#xff1a;三、优势四、与传统优化器对比总结 前言 TorchRec 模块提供了一个无缝 API&#xff0c;用于在训练中融合后向传递和…

webrtc pacer模块(一) 平滑处理的实现

Pacer起到平滑码率的作用&#xff0c;使发送到网络上的码率稳定。如下的这张创建Pacer的流程图&#xff0c;其中PacerSender就是Pacer&#xff0c;其中PacerSender就是Pacer。这篇文章介绍它的核心子类PacingController及Periodic模式下平滑处理的基本流程。平滑处理流程中还有…

河北工程大学e2e平台,python

题目&#xff0c;选择题包100分&#xff01; 题目&#xff0c;选择题包100分&#xff01; 题目&#xff0c;选择题包100分&#xff01; 联系&#x1f6f0;&#xff1a;18039589633

BeautifulSoup 踩坑笔记:SVG 显示异常的真正原因

“这图是不是糊了&#xff1f;”以为是样式缺了&#xff1f;试试手动复制差异在哪&#xff1f;想用对比工具一探究竟……简单到不能再简单的代码&#xff0c;有问题吗&#xff1f;最后的真相&#xff1a;viewBox vs viewbox&#xff0c;preserveAspectRatio vs preserveaspectr…

【browser-use+deepseek】实现简单的web-ui自动化

browser-use Web-UI 一、browser-use是什么 Browser Use 是一款开源Python库&#xff0c;专为大语言模型设计的智能浏览器工具&#xff0c;目的是让 AI 能够像人类一样自然地浏览和操作网页。它支持多标签页管理、视觉识别、内容提取&#xff0c;并能记录和重复执行特定动作。…

MOS管的发热原因和解决办法

发热来源 如上图&#xff0c;MOS管的工作状态有4种情况&#xff0c;分别是开通过程&#xff0c;导通过程&#xff0c;关断过程和截止过程。 导致发热的损耗主要有两种&#xff1a;开关损耗、导通损耗。 导通损耗 导通损耗比较好计算&#xff0c;根据驱动电压VGS值可以得到MOS…

科技项目验收测试怎么做?验收测试报告如何获取?

科技项目从研发到上市需要一个很长的周期&#xff0c;并且在上市之前还有一个至关重要的交付过程&#xff0c;那就是项目验收&#xff0c;验收需要通过验收测试来呈现。科技项目验收测试是确保项目成功交付的关键步骤&#xff0c;那么是如何进行的呢?企事业单位想要获取科技项…

AutoEval:现实世界中通才机器人操作策略的自主评估

25年3月来自 UC Berkeley 和 Nvidia 的论文“AutoEval: Autonomous Evaluation of Generalist Robot Manipulation Policies in the Real World”。 可规模化且可复现的策略评估一直是机器人学习领域长期存在的挑战。评估对于评估进展和构建更优策略至关重要&#xff0c;但在现…

基于SSM框架的房屋租赁小程序开发与实现

概述 一个基于SSM框架开发的微信小程序房屋租赁管理系统&#xff0c;该项目实现了用户管理、中介管理、房源信息管理等核心功能。 主要内容 一、管理员模块功能实现 ​​用户管理​​ 管理员可对通过微信小程序注册的用户信息进行修改和删除操作&#xff0c;确保用户数据的准…

oracle 表空间(Tablespace)

在 Oracle 11g 中&#xff0c;表空间&#xff08;Tablespace&#xff09; 是数据库存储架构的核心逻辑单元&#xff0c;其原理基于 逻辑存储与物理存储的分离&#xff0c;通过分层管理数据文件、段&#xff08;Segment&#xff09;、区&#xff08;Extent&#xff09;和数据块&…

基于YOLOv8的机场跑道异物检测识别系统:提升航空安全的新一代解决方案(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 1. 机场跑道异物检测领域概述 机场跑道异物(Foreign Object Debris, FOD)是指存在于机场跑道、滑行道等关…

Android学习总结之OKHttp拦截器和缓存

深入理解 OkHttp 拦截器 1. 拦截器接口详解 Interceptor 接口是自定义拦截器的基础&#xff0c;它仅包含一个抽象方法 intercept。以下是对该方法参数和返回值的详细解释&#xff1a; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import…

Wincc管对象的使用

Wincc管对象的使用 管对象的调用多边形管T形管双T形管管弯头管道大小调整 管对象的调用 打开【图形编辑器】 多边形管 多边形管如下&#xff1a; 一根管子的顶点数是两个&#xff0c;如果修改顶点数&#xff0c;管子就有多少个端点。 修改顶点数为5 此时点击端点然后拖动&#…

Linux-----驱动

一、内核驱动与启动流程 1. Linux内核驱动 Nor Flash: 可线性访问&#xff0c;有专门的数据及地址总线&#xff08;与内存访问方式相同&#xff09;。 Nand Flash: 不可线性访问&#xff0c;访问需要控制逻辑&#xff08;软件&#xff09;。 2. Linux启动流程 ARM架构: IRAM…

问问lua怎么写DeepSeek,,,,,

很坦白说&#xff0c;这十年&#xff0c;我几乎没办法从互联网找到这个这样的代码&#xff0c;互联网引擎找不到&#xff0c;我也没有很大的“追求”要传承&#xff0c;或者要宣传什么&#xff1b;直到DeepSeek的出现 兄弟&#xff0c;Deepseek现在已经比你更了解你楼下的超市…

基于神经环路的神经调控可增强遗忘型轻度认知障碍患者的延迟回忆能力

简要总结 这篇文章提出了一种名为CcSi-MHAHGEL的框架&#xff0c;用于基于多站点、多图谱fMRI的功能连接网络&#xff08;FCN&#xff09;分析&#xff0c;以辅助自闭症谱系障碍&#xff08;ASD&#xff09;的识别。该框架通过多视图超边感知的超图嵌入学习方法&#xff0c;整合…

C++学习之ORACLE③

1.集合运算符 查询部门号是10和20的员工信息&#xff1a; &#xff1f;思考有几种方式解决该问题 &#xff1f; SQL> select * from emp where deptno in(10, 20) SQL> select * from emp where deptno10 or deptno20 集合运算&#xff1a; Select * from emp …

UniAD:自动驾驶的统一架构 - 创新与挑战并存

引言 自动驾驶技术正经历一场架构革命。传统上&#xff0c;自动驾驶系统采用模块化设计&#xff0c;将感知、预测和规划分离为独立组件。而上海人工智能实验室的OpenDriveLab团队提出的UniAD&#xff08;Unified Autonomous Driving&#xff09;则尝试将这些任务整合到一个统一…