React教程 - 样式私有化及高阶组件

React样式的处理方案

在vue开发中,我们可以基于scoped为组件设置样式私有化!

但是react项目中并没有类似于这样的机制!如果我们想保证"团队协作开发"中,各组件间的样式不冲突,我们则需要基于特定的方案进行处理!


1. 内联样式

内联样式就是在JSX元素中,直接定义行内的样式

编译后的内容

内联样式的优点:

  • 使用简单: 简单的以组件为中心来实现样式的添加
  • 扩展方便: 通过使用对象进行样式设置,可以方便的扩展对象来扩展样式
  • 避免冲突: 最终都编译为元素的行内样式,不存在样式冲突的问题

在大型项目中,内联样式可能并不是一个很好的选择,因为内联样式还是有局限性的:

  • 不能使用伪类: 这意味着 :hover、:focus、:actived、:visited 等都将无法使用
  • 不能使用媒体查询: 媒体查询相关的属性不能使用
  • 减低代码可读性: 如果使用很多的样式,代码的可读性将大大降低
  • 没有代码提示: 当使用对象来定义样式时,是没有代码提示的

2. 使用CSS样式表

CSS样式表应该是我们最常用的定义样式的方式!但多人协作开发中,很容易导致组件间的样式类名冲突,从而导致样式冲突;所以此时需要我们 人为有意识的 避免冲突!

  • 保证组件最外层样式类名的唯一性,例如:路径名称 + 组件名称 作为样式类名
  • 基于 less、sass、stylus 等css预编译语言的嵌套功能,保证组件后代元素的样式,都嵌入在外层样式类中!!

Demo.less

Demo.jsx

CSS样式表的优点:

  • 结构样式分离: 实现了样式和JavaScript的分离
  • 使用CSS所有功能: 此方法允许我们使用CSS的任何语法,包括伪类、媒体查询等
  • 使用缓存: 可对样式文件进行强缓存或协商缓存
  • 易编写:CSS样式表在书写时会有代码提示

当然,CSS样式表也是有缺点的:

  • 产生冲突: CSS选择器都具有相同的全局作用域,很容易造成样式冲突
  • 性能低: 预编译语言的嵌套,可能带来的就是超长的选择器前缀,性能低!
  • 没有真正的动态样式: 在CSS表中难以实现动态设置样式

3. CSS Modules

CSS的规则都是全局的,任何一个组件的样式规则,都对整个页面有效;产生局部作用域的唯一方法,就是使用一个独一无二的class名字;这就是 CSS Modules 的做法!

第一步:创建 xxx.module.css

第二步:导入样式文件 & 调用

编译后的效果

react 脚手架中对 CSS Modules 的配置

全局作用域

CSS Modules 允许使用 :global(.className) 的语法,声明一个全局规则。凡是这样声明的class,都不会被编译成哈希字符串。

class继承/组合

在 CSS Modules 中,一个选择器可以继承另一个选择器的规则,这称为"组合"

CSS Modules原理

把各个组件中,编写的样式【不经过处理之前,是全局都生效样式】进行私有化处理

  • 把所有样式类名,进行编译混淆,保证唯一性

4. React-JSS

JSS是一个CSS创作工具,它允许我们使用JavaScript以生命式、无冲突和可重用的方式来描述样式

JSS 是一种新的样式策略!

React-JSS 是一个框架集成,可以在 React 应用程序中使用 JSS

它是一个单独的包,所以不需要安装 JSS 核心,只需要 React-JSS 包即可

React-JSS 使用新的 Hooks API 将 JSS 与 React 结合使用

编译后的效果

但是从 react-jss 第10版本之后,不支持在类组件中使用,只能用于函数组件中!

如果想在类组件中使用,还需我们自己处理一下!


5. styled-components

目前在React中,还流行 CSS-IN-JS 的模式:也就是把CSS像JS一样进行编写;其中比较常用的插件就是 styled-components

$ yarn add styled-components
styled-components.com/docs/basics...

创建一个样式的js文件,例如:style.js

想要有语法提示,可以安装vscode插件:vscode-styled-components

组件中使用

编译后的效果


上面介绍了几种常用的React样式策略,这几种策略并没有绝对的好或坏,都各有优缺点,可以根据实际的业务场景去使用。

相关推荐
程序猿阿伟5 小时前
《Chrome标签组搭建多任务高效浏览指南》
前端·chrome
2601_958352905 小时前
双麦 DSP 音频模块实战:一文梳理 A-68 在全行业场景的声学解决方案与落地要点
前端·嵌入式硬件·音视频·语音识别·降噪消回音·音频处理模块
智码看视界5 小时前
老梁聊全栈:JavaScript 原型链深入探索对象继承的奥秘
前端·javascript·ecmascript
布朗克1686 小时前
39 Spring Boot Web实战
前端·spring boot·后端·实战
纽格立科技6 小时前
DRM 发射端链路图(上)
前端·人工智能·车载系统·信息与通信·传媒
云水一下6 小时前
Vue.js从零到精通系列(七):高级特性实战——Teleport、异步组件、自定义指令与TypeScript深度结合
前端·vue.js·typescript
qq4356947016 小时前
Vue05
前端·vue.js
qq_422152576 小时前
PDF 解密工具怎么选?2026 年文档密码移除方案与注意事项
java·前端·pdf
YHHLAI6 小时前
前端工程化调用 AI 多模态生图模型:Qwen Image Demo 实战
前端·人工智能
To_OC6 小时前
我一直以为 Ajax 是个黑盒,直到我写了这 50 行代码
前端·后端·全栈