---
title: Обработка событий
seo:
  title: Обработка событий — React Developer
  description: Тема «Обработка событий» для собеседования React Developer. Как обрабатывать события в React? Что такое синтетические события (synthetic events) в React?
---

[Все темы React Developer](/react-developer)

## <strong>Как обрабатывать события в React?</strong> [#q-14bee738d69b8132946cd54e3c0633e9]

В React обработка событий происходит с использованием синтаксиса, аналогичного обработке событий в нативном JavaScript, но с некоторыми отличиями. Вот как обрабатывать события в React&#58;

1. <strong>Создание метода обработки события&#58;</strong> Создайте метод внутри
   компонента, который будет выполняться при возникновении события. Название
   метода обычно начинается с префикса "handle", за которым следует имя события
   или описательное имя.

1. <strong>Привязка метода к элементу&#58;</strong> Привяжите созданный метод к
   элементу, который будет генерировать событие. Это делается с помощью JSX,
   указав метод как значение атрибута события.

1. <strong>Использование аргументов&#58;</strong> Внутри метода обработки
   события вы можете получить доступ к объекту события и использовать его
   свойства, такие как <code>target</code>, чтобы получить информацию о событии.

Пример обработки клика&#58;

```jsx
import React, { Component } from "react";

class Button extends Component {
  handleClick = () => {
    console.log("Кнопка была нажата");
  };

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

export default Button;
```

В этом примере метод <code>handleClick</code> вызывается при клике на кнопку, выводя сообщение в консоль.

Важно заметить, что при передаче метода обработки события в качестве атрибута JSX, не следует вызывать его с помощью круглых скобок (например, не пишите <code>onClick&#61;&#123;this&#46;handleClick&#40;&#41;&#125;</code>), так как это вызовет выполнение метода сразу при рендеринге.

:::note[Ссылки для изучения]

1. [Обработка событий в React](https://ru.react.js.org/docs/handling-events.html)
   :::

---

## <strong>Что такое синтетические события (</strong><code>synthetic events</code><strong>) в React?</strong> [#q-14bee738d69b8191b77dd6c0838f528a]

В React, "синтетические события" (<code>synthetic events</code>) - это система обработки событий, которая предоставляет кросс-браузерную и кросс-платформенную абстракцию над нативными событиями браузера. Они создаются и управляются React и обеспечивают более единообразное поведение обработки событий в различных браузерах.

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

Пример использования синтетических событий&#58;

```jsx
import React from "react";

class Button extends React.Component {
  handleClick = (event) => {
    event.preventDefault();
    console.log("Button clicked!");
  };

  render() {
    return <button onClick={this.handleClick}>Click me</button>;
  }
}
```

В этом примере, <code>event</code> является синтетическим событием, передаваемым в обработчик <code>handleClick</code>. Вы можете вызывать методы такие как <code>preventDefault&#40;&#41;</code>, <code>stopPropagation&#40;&#41;</code>, и другие, а также получать информацию о событии (например, <code>event&#46;target</code>, <code>event&#46;clientX</code>, и др.).

Синтетические события нормализуют интерфейс событий разных браузеров. В React DOM начиная с React 17 пулинг событий отключён, поэтому event.persist() для сохранения события не нужен.

:::note[Ссылки для изучения]

1. [Обработка событий в React](https://ru.react.js.org/docs/handling-events.html)
   :::

---

## <strong>Что такое цель события или целевой элемент (</strong><code>event&#46;target</code><strong>)?</strong> [#q-14bee738d69b81e8aecae09a451f1f3e]

<code>event&#46;target</code> — это элемент, на котором первоначально произошло
событие.

#### Пример использования&#58;

```javascript
document.getElementById("myButton").addEventListener("click", function (event) {
  console.log(event.target); // Выведет элемент myButton, на котором произошел клик
});
```

<code>event&#46;target</code> указывает на элемент, вызвавший событие, позволяя
обработчику узнать, где именно оно произошло.

:::note[Ссылки для изучения]

1. [Обработка событий в React](https://ru.react.js.org/docs/handling-events.html)
   :::

---

## <strong>Что такое текущая цель события (</strong><code>event&#46;currentTarget</code><strong>)?</strong> [#q-14bee738d69b8123a442f29edc0687cc]

<code>event&#46;currentTarget</code> — это элемент, на котором в данный момент
обрабатывается событие.

#### Пример использования&#58;

```javascript
document.getElementById("myButton").addEventListener("click", function (event) {
  console.log(event.currentTarget); // Выведет элемент myButton
});
```

<code>event&#46;currentTarget</code> указывает на элемент, к которому привязан
обработчик события, независимо от того, где произошло событие.

:::note[Ссылки для изучения]

1. [Обработка событий в React](https://ru.react.js.org/docs/handling-events.html)
   :::

---

## <strong>Как реализовать</strong> <code>drag&#45;and&#45;drop</code> <strong>функциональность в React-приложении?</strong> [#q-14bee738d69b811897bdde84a40299be]

Реализация функциональности перетаскивания (<code>drag&#45;and&#45;drop</code>) в React-приложении может быть достигнута с использованием стандартных событий мыши и состояния компонентов React. Вот базовый подход к созданию такой функциональности&#58;

1. <strong>
     Создание компонентов для перетаскиваемых и целевых элементов&#58;
   </strong>
    Сначала создайте компоненты для элементов, которые вы хотите перемещать
   (перетаскиваемые элементы) и элементов, на которые вы хотите перетащить
   (целевые области).

1. <strong>Управление состоянием&#58;</strong> Добавьте состояние в компоненты,
   чтобы отслеживать, перетаскивается ли в данный момент элемент или нет.
   Например, вы можете использовать <code>useState</code> для этого.

1. <strong>Обработка событий&#58;</strong> В компонентах перетаскиваемых
   элементов, добавьте обработчики событий <code>onDragStart</code>, 
   <code>onDrag</code>, и <code>onDragEnd</code>&#58;

   ```html
   <div draggable onDragStart="{(e)" ="">
     handleDragStart(e, item)} onDrag={(e) => handleDrag(e)} onDragEnd={(e) =>
     handleDragEnd(e)} > {/* Содержимое перетаскиваемого элемента */}
   </div>
   ```

1. <strong>Реализация функций обработчиков&#58;</strong> Создайте функции
   обработчики для событий перетаскивания. В них вы будете обновлять состояние
   компонентов и манипулировать данными о перетаскиваемом элементе.

1. <strong>Определение областей для перетаскивания&#58;</strong> В целевых
   компонентах определите зоны, на которые можно бросить перетаскиваемый
   элемент. Добавьте обработчики событий <code>onDragOver</code> и 
   <code>onDrop</code>&#58;

   ```html
   <div onDragOver="{(e)" ="">
     handleDragOver(e)} onDrop={(e) => handleDrop(e, target)} > {/* Содержимое
     целевой области */}
   </div>
   ```

1. <strong>Реализация обработчиков для областей перетаскивания&#58;</strong>
    Аналогично создайте функции обработчики для событий <code>onDragOver</code>
    и <code>onDrop</code>, где вы будете предотвращать стандартное поведение
   браузера и обновлять состояние компонентов в соответствии с действиями
   пользователя.

1. <strong>Обновление состояния&#58;</strong> В функциях обработчиках обновляйте
   состояние компонентов так, чтобы отражать текущее состояние перетаскивания.

1. <strong>Рендеринг компонентов&#58;</strong> Не забудьте рендерить ваши
   компоненты в компоненте верхнего уровня, чтобы создать интерфейс
   перетаскивания.

Приведенный выше подход представляет базовую концепцию реализации <code>drag&#45;and&#45;drop</code> в React. В более сложных случаях, например, при необходимости поддержки перетаскивания между разными компонентами или списками, возможно потребуется использовать дополнительные библиотеки или углубиться в более сложные паттерны.

:::note[Ссылки для изучения]

1. [Обработка событий в React](https://ru.react.js.org/docs/handling-events.html)
   :::

---

## <strong>Как реализовать перетаскивание (</strong><code>drag&#45;and&#45;drop</code><strong>) элементов в React-приложении?</strong> [#q-14bee738d69b814d8addcfe9b25b7340]

Для реализации перетаскивания элементов в React-приложении вы можете использовать нативные события браузера в сочетании с состоянием компонентов React. Вот базовые шаги, как это можно сделать&#58;

{/* prettier-ignore */}
1. <strong>Создание компонентов&#58;</strong>

    - Создайте компоненты, которые вы планируете перемещать.

    - Определите обработчики событий для начала и завершения перетаскивания.

1. <strong>Управление состоянием&#58;</strong>

    - Создайте состояние, которое будет хранить информацию о перетаскиваемом элементе, его начальных координатах и т.д.

1. <strong>Добавление обработчиков событий&#58;</strong>

    - Добавьте обработчик события <code>onDragStart</code> для элемента, который будет перетаскиваться. В этом обработчике установите данные о перетаскиваемом элементе в состояние, используя функцию <code>setData</code> и <code>event&#46;dataTransfer</code>.

    - Добавьте обработчики <code>onDragOver</code> и <code>onDrop</code> для контейнера, куда вы собираетесь перемещать элементы. В обработчике <code>onDragOver</code> предотвратите действие по умолчанию, чтобы разрешить перетаскивание, и в обработчике <code>onDrop</code> обработайте перетаскивание элемента.

Пример&#58;

```jsx
import React, { useState } from "react";

function DraggableElement({ text }) {
  const handleDragStart = (event) => {
    event.dataTransfer.setData("text/plain", text);
  };

  return (
    <div draggable onDragStart={handleDragStart} className="draggable-element">
      {text}
    </div>
  );
}

function DroppableArea() {
  const [droppedItems, setDroppedItems] = useState([]);

  const handleDragOver = (event) => {
    event.preventDefault();
  };

  const handleDrop = (event) => {
    event.preventDefault();
    const droppedText = event.dataTransfer.getData("text/plain");
    setDroppedItems([...droppedItems, droppedText]);
  };

  return (
    <div
      className="droppable-area"
      onDragOver={handleDragOver}
      onDrop={handleDrop}
    >
      {droppedItems.map((item, index) => (
        <div key={index}>{item}</div>
      ))}
    </div>
  );
}

function App() {
  return (
    <div className="app">
      <DraggableElement text="Перетащи меня!" />
      <DroppableArea />
    </div>
  );
}

export default App;
```

:::note[Ссылки для изучения]

1. [Обработка событий в React](https://ru.react.js.org/docs/handling-events.html)
   :::
