Przejdź do głównej zawartości

14. Stylowanie w React

Stylowanie w React

React nie narzuca sposobu stylowania — można używać zwykłego CSS, CSS Modules, Tailwind CSS, styled-components lub inline styles. Każde podejście ma swoje zalety. Kluczowe: CSS Modules eliminują konflikty klas przez lokalne zakresy.

  1. Dlaczego nie zwykły global CSS? — Konflikty klas, brak hermetyzacji
  2. CSS Modules — jak działają? — Budowanie automatycznie hashuje nazwy klas (.button.button_abc123)
  3. Tailwind — utility first? — Klasy opisują wizualny efekt, nie semantykę (.text-red-500 zamiast .error)
  4. Kiedy inline styles? — Dynamiczne wartości (pozycja, kolor z API), nie dla stałych styli
  1. Global CSS problemy — konflikty, cascade, specificity wars
  2. CSS Modules — import, styles.className, lokalne zakresy
  3. Tailwind CSS — utility classes, konfiguracja, responsive
  4. Inline styles — obiekt JS, camelCase, kiedy używać
  5. Dynamiczne klasy — warunkowe klasy z template literals lub classnames

Schemat

Tabela porównawcza 4 podejść: Global CSS / CSS Modules / Tailwind / inline styles — z kolumnami: zakres, wydajność, utrzymanie, konfiguracja.

Przykład kodu JSX

Ten sam przycisk zaimplementowany 4 sposobami. Wyróżnij różnice wizualnie w prezentacji.

  • Problem globalnego CSS
  • CSS Modules — działanie i przykład
  • Inline styles

Forma: 10 slajdów, 10 minut

Ocena: 3.0
// Button.module.css
// .button { background: blue; color: white; padding: 8px 16px; }
// .primary { background: navy; }
// .danger { background: red; }
import styles from './Button.module.css';
function Button({ variant = 'primary', children }) {
return (
<button className={`${styles.button} ${styles[variant]}`}>
{children}
</button>
);
// Wynikowa klasa w HTML: "button_abc123 primary_def456"
// Brak konfliktów z innymi komponentami!
}
function Button({ variant = 'primary', disabled, children }) {
const baseClasses = 'px-4 py-2 rounded font-medium transition-colors';
const variantClasses = {
primary: 'bg-blue-600 text-white hover:bg-blue-700',
danger: 'bg-red-600 text-white hover:bg-red-700',
outline: 'border-2 border-blue-600 text-blue-600 hover:bg-blue-50',
};
return (
<button
className={`${baseClasses} ${variantClasses[variant]} ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}
disabled={disabled}
>
{children}
</button>
);
}

Przykład 3 — Inline styles dla wartości dynamicznych

Dział zatytułowany „Przykład 3 — Inline styles dla wartości dynamicznych”
function ProgressBar({ value, max = 100, color = '#3b82f6' }) {
// Inline dla wartości obliczanych dynamicznie
const barStyle = {
width: `${(value / max) * 100}%`,
backgroundColor: color, // kolor z API/props
height: '8px',
borderRadius: '4px',
transition: 'width 0.3s ease',
};
return <div style={barStyle} role="progressbar" aria-valuenow={value} />;
}

Pokaż hash klas w DevTools

Otwórzcie DevTools → Elements gdy używacie CSS Modules. Pokażcie że .button stało się .button_3gT2x. To konkrety, nie teoria.

Nie oceniajcie Tailwind

Tailwind dzieli środowisko deweloperów — nie musicie go lubić, ale pokażcie obiektywnie jak działa. Klasa sama wyrobi opinię.

Piękny kod = piękna aplikacja!

Stylowanie to coś co widzą wszyscy użytkownicy. Ten temat pokaże klasie jak pisać CSS bez stresu o konfliktach!