Estilización de componentes
React no tiene un sistema de estilización propio. Escribes CSS ordinario, y JSX te da dos formas de aplicarlo a un elemento: un nombre de clase, que cubre casi todo, y una prop style para los pocos valores que una hoja de estilos no puede conocer de antemano. Este capítulo cubre ambos, junto con el patrón que está entre ellos: construir un nombre de clase a partir de props o estado, para que un elemento se restilice a medida que tus datos cambian.
Nombres de clase en JSX
class es una palabra reservada en JavaScript, así que JSX nombra el atributo className. El valor es una cadena ordinaria, y React la establece como el atributo class del elemento en el DOM, lo que significa que el CSS del otro lado se escribe exactamente como siempre.
function Avatar() {
return <img className="avatar avatar--large" src={photo} alt="Ada Lovelace" />
}Dos nombres de clase en una cadena, separados por un espacio, igual que en HTML. La regla camelCase de JSX se aplica a los nombres de atributo en tu marcado; los nombres de clase en sí son tuyos, así que kebab-case, BEM, o cualquier convención que tu hoja de estilos ya use se mantiene intacta.
Importar una hoja de estilos
Un archivo de componente trae el CSS que necesita con una importación simple al principio:
import './App.css'
export default function App() {
return <h1 className="title">React Facts</h1>
}No hay variable a la izquierda de esa importación, y el componente nunca lee el archivo. Es una instrucción para la herramienta de compilación: este módulo depende de ese CSS, así que inclúyelo. Vite inyecta las reglas en la página durante el desarrollo y emite un archivo .css real en una compilación de producción. Setting up a React project describe el mismo mecanismo que maneja las imágenes.
Dónde pones la importación es una cuestión de organización. Importar Button.css al principio de Button.jsx mantiene los estilos junto al componente que los usa. Las reglas en sí se mantienen globales: un selector .title coincide con cada elemento que lleve esa clase en cualquier lugar de la página, sea cual sea el archivo que la importó. Convenciones de nombrado como BEM existen para mantener ese espacio de nombres compartido manejable, y CSS Modules y librerías CSS-in-JS cierran las reglas por ti una vez que una aplicación crece más allá de la disciplina de nombrado sola.
Version note
React 19 added support for rendering <link rel="stylesheet"> and <style> from inside a component, with a precedence prop that lets React hoist them into the document head and order them predictably. Earlier versions needed a library such as react-helmet. The build-tool import above behaves the same way in every version.
Nombres de clase que dependen de datos
className se encuentra dentro de llaves como cualquier otra expresión JSX, así que la cadena puede ser computada. Tomemos un juego de dados donde cada dado puede retenerse entre lanzamientos. Si un dado está retenido vive en el estado más arriba y llega aquí como una prop:
function Die({ value, isHeld }) {
return (
<button className={`die ${isHeld ? 'die--held' : ''}`}>
{value}
</button>
)
}Cada dado obtiene die. Uno retenido también obtiene die--held. La hoja de estilos contiene los colores y bordes reales, y el único trabajo del componente es decidir qué clase aplica. Cuando isHeld cambia, React actualiza el atributo class y el navegador redibuja. Nada dentro del componente sabe qué aspecto tiene "retenido", así que esa apariencia puede cambiar sin que este archivo cambie en absoluto.
Un detalle: cuando isHeld es false, el template literal produce "die " con un espacio al final. Los navegadores lo ignoran, aunque se ve desordenado en devtools. Un array lo maneja más limpiamente y escala pasada una condición:
const classes = ['die', isHeld && 'die--held'].filter(Boolean).join(' ')
return <button className={classes}>{value}</button>isHeld && 'die--held' se evalúa a false cuando la condición falla, filter(Boolean) lo elimina, y join(' ') pone un espacio simple entre lo que sobrevive.
La prop style
La prop style toma un objeto JavaScript. Los nombres de propiedad son las versiones camelCase de los de CSS, y las llaves dobles son la ranura de expresión habitual con un objeto literal dentro:
<div style={{ backgroundColor: 'darkslateblue', paddingTop: 12 }}>
Styled inline
</div>background-color se convierte en backgroundColor y padding-top se convierte en paddingTop. Los valores generalmente son cadenas. Pasa un número simple y React añade px para propiedades que toman una longitud, así que paddingTop: 12 se renderiza como padding-top: 12px. Las propiedades que CSS trata como sin unidad mantienen el número crudo: lineHeight, opacity, flexGrow, zIndex y fontWeight pasan directamente. Cualquier otra unidad debe escribirse como una cadena, como en width: '60%' o margin: '2rem'.
La mayoría de la estilización pertenece a una hoja de estilos, donde una clase puede llevar una docena de declaraciones y ser compartida por una docena de elementos. La prop style se gana su lugar cuando un valor solo se conoce en tiempo de ejecución y CSS no tiene forma de alcanzarlo:
function ProgressBar({ percent }) {
return (
<div className="progress">
<div className="progress__fill" style={{ width: `${percent}%` }} />
</div>
)
}El color del relleno, altura, transición y radio de esquina están todos en .progress__fill. El único valor que la hoja de estilos no puede conocer es el ancho, porque viene de datos, así que ese único valor va en línea. Una imagen de fondo cuya URL llega de una API tiene la misma forma:
<div className="hero" style={{ backgroundImage: `url(${photo.url})` }} />El tamaño, posicionamiento y superposición se quedan en .hero, y solo la URL viene a través de la prop.
Los estilos en línea también tienen un techo duro. Un objeto style describe las declaraciones de un elemento, así que no hay forma de expresar un estado hover, una media query, o una animación keyframe en él. Esas pertenecen a CSS sin importar qué tan dinámica sea el resto de la estilización.
className porque class es una palabra reservada en JavaScript. Importa tu hoja de estilos al principio del archivo, pon tus reglas en ella, y deja que el componente decida qué clase aplica construyendo la cadena a partir de props o estado. Guarda la prop style para valores que tu archivo CSS no puede conocer de antemano, como un ancho que viene de datos. Próximo: Props, donde los componentes comienzan a recibir datos de su padre.

