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

優點:

  • 組件化作用域:樣式天然限定在當前組件,無需擔心全局污染。

  • 動態樣式靈活:可直接基于 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 (<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、性能優化策略

  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.pswp.cn/pingmian/76074.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76074.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76074.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙開發者高級認證編程題庫

題目一:跨設備分布式數據同步 需求描述 開發一個分布式待辦事項應用,要求: 手機與平板登錄同一華為賬號時,自動同步任務列表任一設備修改任務狀態(完成/刪除),另一設備實時更新任務數據在設備離線時能本地存儲,聯網后自動同步實現方案 // 1. 定義分布式數據模型 imp…

stream流Collectors.toMap(),key值重復問題

文章目錄 一、問題二、問題示例三、原因四、解決方法4.1、方案一 一、問題 發現Collectors.toMap的一個坑&#xff0c;若key值重復的時候會拋異常。如&#xff1a; IllegalStateException: Duplicate key 男 二、問題示例 報錯示例如下&#xff1a; import lombok.AllArgsC…

未來 AI 發展趨勢與挑戰(AGI、數據安全、監管政策)

從 ChatGPT 的火爆到國內 DeepSeek、通義千問、百川智能等模型的興起,AI 正以前所未有的速度走入各行各業。而下一階段,AI 是否會發展出真正的“通用智能”(AGI)?數據隱私、技術倫理又該如何應對?本文將帶你全面洞察未來 AI 的技術趨勢與落地挑戰。 一、AGI 的曙光:通用…

【微服務】SpringBoot整合LangChain4j 操作AI大模型實戰詳解

【微服務】SpringBoot整合LangChain4j 操作AI大模型實戰詳解 一、前言 隨著人工智能技術的飛速發展&#xff0c;AI大模型已經在眾多領域展現出強大的能力&#xff0c;為業務拓展和商業價值提升帶來了新的機遇。SpringBoot作為一款廣受歡迎的Java微服務框架&#xff0c;以其簡…

一種單脈沖雷達多通道解卷積前視成像方法【論文閱讀】

一種單脈沖雷達多通道解卷積前視成像方法-李悅麗-2007 1. 論文的研究目標與實際意義1.1 研究目標1.2 實際問題與產業意義2. 論文提出的思路、方法及模型2.1 多通道解卷積(MCD)技術的核心思想2.1.1 數學模型與公式推導2.1.2 針對單脈沖雷達的改進2.2 方法與傳統技術的對比3. 實…

Codeforces Round 1016 (Div. 3)題解

題目地址 https://codeforces.com/contest/2093 銳評 在所有題意都理解正確的情況下&#xff0c;整體難度不算太難。但是偏偏存在F這么惡心的題意&#xff0c;樣例都不帶解釋一下的&#xff0c;根本看不懂題。D題也惡心&#xff0c;在于遞歸過程的拆分&#xff0c;需要點數學…

【python讀取并顯示遙感影像】

在Python中讀取并顯示遙感影像&#xff0c;可以使用rasterio庫讀取影像數據&#xff0c;并結合matplotlib進行可視化。以下是一個完整的示例代碼&#xff1a; import rasterio import matplotlib.pyplot as plt import numpy as np# 打開遙感影像文件 with rasterio.open(path…

怎樣使用Python編寫的Telegram聊天機器人

怎樣使用Python編寫的Telegram聊天機器人 代碼直接運行可用 以下是對這段代碼的詳細解釋: 1. 導入必要的庫 import loggingfrom telegram import Update from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler, filters, MessageHandler import log…

moviepy學習使用筆記

目錄 1. moviepy安裝版本選擇安裝命令2. 使用文檔1.0.3文檔中文文檔寫的比較好的學習博客2.x文檔1.0.3到2.x快速上手3. 可能遇到的問題3.1 依賴問題3.2 中文顯示問題4. 特效示例中文顯示的問題1. moviepy安裝 版本選擇 moviepy有兩個主流版本: 1.0.3 和 2.x 目前2.x版本稱不…

docker各種清空緩存命令,下載jdk包總失敗,執行完好了

清理未使用的鏡像&#xff08;推薦&#xff0c;最常用&#xff09;&#xff1a; docker image prune -a 清理所有未使用的數據&#xff08;包括鏡像、容器、網絡和構建緩存&#xff09;&#xff1a; docker system prune -a 清理所有未使用的數據&#xff0c;包括未使用的卷…

NO.78十六屆藍橋杯備戰|數據結構-并查集|雙親表示法|初始化|查詢|合并|判斷|親戚|Lake Counting|程序自動分析(C++)

雙親表?法 接下來要學習到的并查集&#xff0c;本質上就是?雙親表?法實現的森林。因此&#xff0c;我們先認識?下雙親表?法。 在學習樹這個數據結構的時&#xff0c;講到樹的存儲?式有很多種&#xff1a;孩?表?法&#xff0c;雙親表?法、孩?雙親表?法以及孩?兄弟表…

Ubuntu掛載HDD遷移存儲PostgreSQL數據

關聯博客&#xff1a;windows通用網線連接ubuntu實現ssh登錄、桌面控制、文件共享 背景&#xff1a; 在個人ubuntu機器上安裝了pgsql&#xff0c;新建了一張表插入了2000w數據用于模擬大批量數據分頁查詢用&#xff0c;但是發現查詢也不慢&#xff08;在公司測試環境查詢1700…

Spring MVC與Spring Boot文件上傳配置項對比

Spring MVC與Spring Boot文件上傳配置項對比 一、Spring MVC配置項&#xff08;基于不同MultipartResolver實現&#xff09; 1. 使用 CommonsMultipartResolver&#xff08;Apache Commons FileUpload&#xff09; Bean public MultipartResolver multipartResolver() {Common…

Android 學習之 Navigation導航

1. Navigation 介紹 Navigation 組件 是 Android Jetpack 的一部分&#xff0c;用于簡化應用內導航邏輯&#xff0c;支持 Fragment、Activity 和 Compose 之間的跳轉。核心優勢&#xff1a; 單 Activity 架構&#xff1a;減少 Activity 冗余&#xff0c;通過 Fragment 或 Com…

Docker Compose 部署Nginx反向代理 tomcat

Nginx 、Tomcat (默認端口8080)》》compose services:nginx:image: nginx:latestcontainer_name: nginxrestart: alwaysports:- 80:80- 8080:8080volumes:# 文件夾會自動創建&#xff0c;但nginx.conf是文件&#xff0c;需要提前創建&#xff0c;否則 會自動創建nginx.conf文件…

數據庫7(數據定義語句,視圖,索引)

1.數據定義語句 SQL數據定義語言&#xff08;DDL&#xff09;用于定義和管理數據庫結構&#xff0c;包括創建、修改和刪除 數據庫對象。常見的DDL語句包括CREATE、DROP和ALTER。 它的操作的是對象&#xff0c;區分操作數據的語句&#xff1a;INSERT,DELETE,UPDATE 示例&#x…

QML面試筆記--UI設計篇02布局控件

1. QML 中常用的布局控件 1.1. Row1.2. Column1.3. Grid1.4. RowLayout1.5. ColumnLayout1.6. GridLayout1.7. 總結 1. QML 中常用的布局控件 1.1. Row 背景知識&#xff1a;Row 布局用于將子元素水平排列&#xff0c;適合簡單的線性布局&#xff0c;如工具欄按鈕或表單輸入…

Compose組件轉換XML布局1.0

文章目錄 學習JetPack Compose資源前言&#xff1a;預覽界面的實現Compose組件的布局管理一、Row和Colum組件&#xff08;LinearLayout&#xff09;LinearLayout&#xff08;垂直方向 → Column&#xff09;LinearLayout&#xff08;水平方向 → Row&#xff09; 二、相對布局 …

從零構建大語言模型全棧開發指南:第五部分:行業應用與前沿探索-5.2.1模型偏見與安全對齊(Red Teaming實踐)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 大語言模型全棧開發指南:倫理與未來趨勢 - 第五部分:行業應用與前沿探索5.2.1 模型偏見與安全對齊(Red Teaming實踐)一、模型偏見的來源與影響1. 偏見的定義與分類2. 偏見的實際影響案例二、安全對齊…