JSX 中,`style` 和 `className` 是两种不同的样式控制方式
在 JSX 中,style
和 className
是两种不同的样式控制方式,它们的区别主要体现在用法、底层实现和适用场景上:
1. 语法和类型
-
style
接受一个 JavaScript 对象,属性名用驼峰命名法(如backgroundColor
),值通常是字符串或数字。<div style={{ color: 'red', fontSize: 20 }}>内容</div>
-
className
接受一个 字符串,对应 CSS 文件中的类名(类似 HTML 的class
属性)。<div className="my-class">内容</div>
2. 作用范围
-
style
用于 内联样式,直接将样式写入元素。适合动态样式(如根据状态变化)。<div style={{ opacity: isLoading ? 0.5 : 1 }}>加载中...</div>
-
className
用于引用 外部 CSS 文件或 CSS 模块 中定义的样式类,适合复用样式或复杂样式规则(如伪类、媒体查询)。/* CSS 文件 */ .highlight { background: yellow; }
<div className="highlight">高亮文本</div>
3. 性能与维护
-
style
- 动态性强:适合频繁变化的样式(如动画)。
- 优先级高:内联样式会覆盖外部 CSS(除非外部样式使用
!important
)。 - 维护成本:复杂样式会导致 JSX 臃肿,且无法使用 CSS 高级特性(如伪类
:hover
)。
-
className
- 复用性好:统一管理样式,适合大型项目。
- 功能全面:支持 CSS 所有特性(如伪类、动画、媒体查询)。
- 模块化:结合 CSS Modules 或 CSS-in-JS 工具(如 styled-components)可实现作用域隔离。
4. 典型使用场景
style | className | |
---|---|---|
场景 | 动态样式(如根据状态改变颜色) | 静态样式、复用样式、复杂样式规则 |
示例 | 计算宽度、临时调试 | 布局、主题样式、响应式设计 |
5. 注意事项
-
React 中的
className
由于 JSX 是 JavaScript 的扩展,需用className
代替 HTML 的class
(避免与 JS 的class
关键字冲突)。 -
自动添加单位
在style
对象中,数字类型的值(如fontSize: 20
)会被自动转换为20px
。若需其他单位(如%
),需显式写为字符串(如width: '50%'
)。
总结建议:
- 优先用
className
:保持样式可维护性,利用 CSS 完整功能。 - 必要时用
style
:处理动态样式或少量内联覆盖。 - 混合使用:例如用
className
定义基础样式,style
覆盖部分动态属性。