,

Типизация событий в React: Обеспечение безопасности и понимания

В React, как и в любой другой библиотеке или фреймворке, обработка событий играет важную роль в создании интерактивных пользовательских интерфейсов. TypeScript позволяет нам улучшить безопасность и понимание кода, типизируя события. Давайте рассмотрим, как это делается.

Библиотека React поддерживает большинство стандартных событий DOM, и также предоставляет возможность создавать собственные пользовательские события 🖇️

Обработка cобытий в React

React предоставляет специальные атрибуты для обработки событий в компонентах. Например, onClick, onChange, onSubmit, и многие другие. Обработчики вызываются с объектом, который содержит информацию о событии и элементе, на котором оно произошло.

// Пример:
import React from "react";

const MyComponent = () => {
  const handleClick = (event) => {
    console.log("Клик!", event.target);
  };

  return (
    <button onClick={handleClick}>
      Нажми меня
    </button>
  );
};

Но как мы можем типизировать объект события и элемент, к которому он относится?

Обработка событий с помощью TypeScript

Для типизации событий мы можем использовать типы, предоставляемые React.

Вот как это делается:

// Пример:
import React from "react";

const MyComponent: React.FC = () => {
  const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
    console.log("Клик!", event.currentTarget);
  };

  return (
    <button onClick={handleClick}>
      Нажми меня
    </button>
  );
};

В этом примере мы используем React.MouseEvent<HTMLButtonElement>, чтобы указать, что event — это событие клика на элементе button. Это предостерегает нас от попыток обращения к несуществующим свойствам события или элемента и делает код более надежным.

Обработка событий в функциональных компонентах React

Если вы используете функциональные компоненты, как в примере выше, и вам нужно передать аргументы в обработчик события, вы можете использовать стрелочную функцию:

// Пример:
import React from "react";

const MyComponent: React.FC = () => {
  const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
    console.log("Клик!", event.currentTarget);
  };

  const handleMouseOver = (message: string) => (event: React.MouseEvent<HTMLButtonElement>) => {
    console.log(`Наведение мыши: ${message}`);
  };

  return (
    <div>
      <button onClick={handleClick}>
        Нажми меня
      </button>
      <button onMouseOver={handleMouseOver("Кнопка 1")}>
        Наведи мышь
      </button>
    </div>
  );
};

Обработка событий в классовых компонентах React

Если вы используете классовые компоненты, типизация событий выполняется немного иначе:

// Пример:
import React, { Component } from "react";

class MyComponent extends Component {
  handleClick(event: React.MouseEvent<HTMLButtonElement>) {
    console.log("Клик!", event.currentTarget);
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        Нажми меня
      </button>
    );
  }
}

Здесь мы типизируем метод handleClick внутри класса.

Перечень некоторых наиболее часто используемых типов событий в React с указанием их типизации

  1. onClick: React.MouseEvent<HTMLButtonElement>
  2. onDoubleClick: React.MouseEvent<HTMLButtonElement>
  3. onChange: React.ChangeEvent<HTMLInputElement>
  4. onSubmit: React.FormEvent<HTMLFormElement>
  5. onMouseOver: React.MouseEvent<HTMLDivElement>
  6. onMouseOut: React.MouseEvent<HTMLDivElement>
  7. onKeyDown: React.KeyboardEvent<HTMLInputElement>
  8. onKeyPress: React.KeyboardEvent<HTMLInputElement>
  9. onKeyUp: React.KeyboardEvent<HTMLInputElement>
  10. onFocus: React.FocusEvent<HTMLInputElement>
  11. onBlur: React.FocusEvent<HTMLInputElement>
  12. onLoad: React.SyntheticEvent<HTMLImageElement, Event>
  13. onError: React.SyntheticEvent<HTMLImageElement, Event>
  14. onScroll: React.UIEvent<HTMLDivElement>
  15. onDragStart: React.DragEvent<HTMLDivElement>
  16. onDragOver: React.DragEvent<HTMLDivElement>
  17. onDrop: React.DragEvent<HTMLDivElement>
  18. onResize: React.UIEvent<Window>
  19. onAnimationStart: React.AnimationEvent<HTMLDivElement>
  20. onAnimationEnd: React.AnimationEvent<HTMLDivElement>
  21. onContextMenu: React.MouseEvent<HTMLDivElement>

Заключение

Типизация событий в React с помощью TypeScript улучшает безопасность и читаемость вашего кода, предотвращая множество потенциальных ошибок на этапе разработки. Всегда старайтесь явно указывать типы для обработчиков событий, чтобы ваш код был более надежным и понятным. Это особенно важно в крупных проектах с множеством компонентов и событий.