jb

CSS состояния компонентов

Состояния вроде hover, focus и disabled лучше описывать через CSS-селекторы. Это проще, чем дублировать поведение через JavaScript-классы и обработчики. Кроме читаемости, это помогает не смешивать визуальные состояния в одном месте.

import type { ComponentProps, ReactNode } from 'react';

import styles from './Button.module.css';

interface ButtonProps extends ComponentProps<'button'> {
  children: ReactNode;
}

const Button = ({ children, ...props }: ButtonProps) => (
  <button className={styles.button} {...props}>
    {children}
  </button>
);
/* Button.module.css */
.button {
  padding: 12px 24px;
  border: none;
  border-radius: 6px;
  cursor: pointer;
  transition: all 0.2s ease;
}

.button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
  background-color: #ccc;
}

.button:focus-visible {
  outline: 2px solid #007bff;
  outline-offset: 2px;
}

CSS сам обрабатывает такие состояния, поэтому компонент остается чище и легче в поддержке. JavaScript стоит добавлять только там, где действительно нужна логика, а не визуальный state.

Редактировать на GitHub