0

0

css如何通过CSS-in-JS管理样式_将CSS与JavaScript结合使用

P粉602998670

P粉602998670

发布时间:2026-02-10 11:48:02

|

590人浏览过

|

来源于php中文网

原创

CSS-in-JS易出问题因内联样式不支持伪类、媒体查询等;真正方案需运行时生成唯一class并注入style标签;styled-components与emotion在SSR、主题、TS支持及性能上各有侧重。

css如何通过css-in-js管理样式_将css与javascript结合使用

为什么直接在JS里写CSS容易出问题

CSS-in-JS不是简单地把style对象塞进React.createElementstyle属性里。那样只是内联样式(inline style),不支持伪类、媒体查询、全局作用域复用,也无法利用CSS的层叠和继承机制。

常见错误现象包括:

  • :hover::before 完全失效
  • 响应式断点只能靠JS监听window.innerWidth手动切换class
  • 同一组样式在多个组件中复制粘贴,改一处漏十处
  • 样式污染:一个组件的.button意外覆盖了另一个组件的同名class

真正可用的CSS-in-JS方案,核心是运行时生成唯一class名 + 注入真实标签,而不是拼字符串或只靠style属性。

styled-components 和 emotion 的关键区别在哪

两者都通过模板字符串解析CSS并注入,但底层行为不同:

立即学习Java免费学习笔记(深入)”;

  • styled-components 默认启用服务端渲染(SSR)兼容模式,会为每个组件生成带哈希的class(如 sc-bdVaJa),且支持withConfig控制是否启用css prop
  • @emotion/react 更轻量,css函数返回的是class名字符串,可直接用于classNamestyled API行为类似,但支持更灵活的主题透传(比如用useTheme读取嵌套theme值)

使用场景差异:

  • 如果项目已用create-react-app且不想配Babel插件,优先选styled-components(开箱即用)
  • 如果需要细粒度控制样式注入时机(比如只在某个模块加载后才注入),@emotion/reactcache配置更直接
  • emotion对TypeScript的类型提示更完善,尤其是css函数的属性自动补全

性能影响:两者都会做样式去重,但styled-components在严格模式下会对props做深比较,可能引发不必要的重渲染;emotion默认浅比较,更可控。

如何避免CSS-in-JS导致的重复注入和内存泄漏

这不是理论风险,而是真实发生过的线上问题:同一个组件被多次动态导入(比如React.lazy + Suspense),每次加载都重新执行styled.div,导致相同样式被反复插入标签。

讯飞绘文
讯飞绘文

讯飞绘文:免费AI写作/AI生成文章

下载

关键对策:

  • 确保styled.xxx定义写在模块顶层,不要放在组件函数体内或useEffect
  • 使用babel-plugin-styled-components(对应styled-components)或@emotion/babel-plugin,开启pure模式,让Babel在编译期剥离无副作用的样式定义
  • 在服务端渲染时,统一用ServerStyleSheet(styled-components)或CacheProvider + renderStylesToString(emotion)收集所有样式,避免客户端重复计算

一个典型错误写法:

function MyButton() {
  const StyledDiv = styled.div`color: red`; // ❌ 每次渲染都新建,class名不复用
  return Click;
}

要不要用 vanilla-extract 或 Linaria 替代 runtime 方案

vanilla-extractLinaria属于zero-runtime CSS-in-JS,它们在构建时(build time)就把JS中的样式提取成真实CSS文件,最终产物里没有样式解析逻辑。

适用条件很明确:

  • 项目用ViteWebpack 5+,能接入自定义loader(vanilla-extract@vanilla-extract/webpack-plugin
  • 不依赖运行时主题切换(比如暗色模式需JS控制)、不依赖组件props动态生成样式(如color={props.variant === 'danger' ? 'red' : 'blue'}
  • 团队接受额外的学习成本:要写export const sprinkles = createSprinkles(...)而不是直接写styled.div

容易被忽略的一点:这些方案无法支持基于DOM状态的样式,比如input:focus + labeldiv:has(> p),因为它们不操作真实DOM,也不生成运行时选择器逻辑。

真正的复杂点不在“怎么写”,而在于样式生命周期是否与组件一致——runtime方案天然绑定,build-time方案必须靠约定和工具链兜底。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

541

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

464

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1520

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

635

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

821

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

792

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

182

2025.07.29

TensorFlow2深度学习模型实战与优化
TensorFlow2深度学习模型实战与优化

本专题面向 AI 与数据科学开发者,系统讲解 TensorFlow 2 框架下深度学习模型的构建、训练、调优与部署。内容包括神经网络基础、卷积神经网络、循环神经网络、优化算法及模型性能提升技巧。通过实战项目演示,帮助开发者掌握从模型设计到上线的完整流程。

0

2026.02.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.3万人学习

CSS教程
CSS教程

共754课时 | 29.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号