diff --git a/src/content/learn/responding-to-events.md b/src/content/learn/responding-to-events.md index 17bd087ed..a1d03834e 100644 --- a/src/content/learn/responding-to-events.md +++ b/src/content/learn/responding-to-events.md @@ -1,24 +1,24 @@ --- -title: Responding to Events +title: Реагування на події --- -React lets you add *event handlers* to your JSX. Event handlers are your own functions that will be triggered in response to interactions like clicking, hovering, focusing form inputs, and so on. +React надає вам можливість додавати *обробники подій* до вашого JSX. Обробники подій — це ваші власні функції, які виконуватимуться у відповідь на різні взаємодії, як-от натискання мишкою, наведення курсора, фокусування в елементі введення даних у формі тощо. -* Different ways to write an event handler -* How to pass event handling logic from a parent component -* How events propagate and how to stop them +* Різні способи написання обробника подій +* Як передати логіку обробки подій від батьківського компонента +* Поширення подій і як це зупинити -## Adding event handlers {/*adding-event-handlers*/} +## Додавання обробників подій {/*adding-event-handlers*/} -To add an event handler, you will first define a function and then [pass it as a prop](/learn/passing-props-to-a-component) to the appropriate JSX tag. For example, here is a button that doesn't do anything yet: +Щоб додати обробник подій, спочатку визначте функцію, а потім [передайте її як проп](/learn/passing-props-to-a-component) у відповідний JSX-тег. Наприклад, ось кнопка, яка ще нічого не робить: @@ -26,7 +26,7 @@ To add an event handler, you will first define a function and then [pass it as a export default function Button() { return ( ); } @@ -34,23 +34,23 @@ export default function Button() { -You can make it show a message when a user clicks by following these three steps: +Ви можете налаштувати показ повідомлення, коли користувач натискає на неї, виконавши ці три кроки: -1. Declare a function called `handleClick` *inside* your `Button` component. -2. Implement the logic inside that function (use `alert` to show the message). -3. Add `onClick={handleClick}` to the ` ); } @@ -62,77 +62,77 @@ button { margin-right: 10px; } -You defined the `handleClick` function and then [passed it as a prop](/learn/passing-props-to-a-component) to ` ); } function UploadButton() { return ( - ); } @@ -207,7 +207,7 @@ function UploadButton() { export default function Toolbar() { return (
- +
); @@ -220,22 +220,22 @@ button { margin-right: 10px; } -Here, the `Toolbar` component renders a `PlayButton` and an `UploadButton`: +У цьому прикладі компонент `Toolbar` рендерить кнопки `PlayButton` і `UploadButton`: -- `PlayButton` passes `handlePlayClick` as the `onClick` prop to the `Button` inside. -- `UploadButton` passes `() => alert('Uploading!')` as the `onClick` prop to the `Button` inside. +- `PlayButton` передає `handlePlayClick` як проп `onClick` до `Button`. +- `UploadButton` передає `() => alert('Завантажується!')` як проп `onClick` до `Button`. -Finally, your `Button` component accepts a prop called `onClick`. It passes that prop directly to the built-in browser ` - ); @@ -268,9 +268,9 @@ button { margin-right: 10px; } -In this example, ` ); @@ -312,19 +312,19 @@ button { margin-right: 10px; } -Notice how the `App` component does not need to know *what* `Toolbar` will do with `onPlayMovie` or `onUploadImage`. That's an implementation detail of the `Toolbar`. Here, `Toolbar` passes them down as `onClick` handlers to its `Button`s, but it could later also trigger them on a keyboard shortcut. Naming props after app-specific interactions like `onPlayMovie` gives you the flexibility to change how they're used later. +Зверніть увагу, що компоненту `App` не потрібно знати, *що* `Toolbar` робитиме з `onPlayMovie` або `onUploadImage`. То вже частина реалізації `Toolbar`. Тут `Toolbar` передає їх як обробники `onClick` своїм компонентам `Button`, але він також може викликати їх потім у відповідь на певне сполучення клавіш. Іменування пропсів за типом взаємодії з програмою, як-от `onPlayMovie`, дає вам можливість змінити спосіб їх використання пізніше. -Make sure that you use the appropriate HTML tags for your event handlers. For example, to handle clicks, use [` - ); @@ -355,19 +355,19 @@ button { margin: 5px; } -If you click on either button, its `onClick` will run first, followed by the parent `
`'s `onClick`. So two messages will appear. If you click the toolbar itself, only the parent `
`'s `onClick` will run. +Якщо ви натиснете на будь-яку кнопку, спочатку виконається її `onClick`, а потім `onClick` батьківського `
`. Отже, з'являться два повідомлення. Якщо ви натиснете на саму панель інструментів, виконається лише `onClick` батьківського `
`. -All events propagate in React except `onScroll`, which only works on the JSX tag you attach it to. +У React поширюються усі події, крім `onScroll`, який працює лише з тегом JSX, до якого ви його прикріплюєте. -### Stopping propagation {/*stopping-propagation*/} +### Зупинка поширення {/*stopping-propagation*/} -Event handlers receive an **event object** as their only argument. By convention, it's usually called `e`, which stands for "event". You can use this object to read information about the event. +Обробники подій отримують лиш один аргумент — **об'єкт події**. За домовленістю його зазвичай оголошують як `e` — скорочено від "event", що означає "подія". Ви можете використовувати цей об'єкт для читання інформації про подію. -That event object also lets you stop the propagation. If you want to prevent an event from reaching parent components, you need to call `e.stopPropagation()` like this `Button` component does: +Цей об'єкт події також дозволяє зупинити поширення. Якщо ви хочете, щоб подія не дійшла до батьківських компонентів, вам потрібно викликати `e.stopPropagation()` подібно до цього компонента `Button`: @@ -388,11 +388,11 @@ export default function Toolbar() {
{ alert('You clicked on the toolbar!'); }}> - -
); @@ -409,43 +409,43 @@ button { margin: 5px; }
-When you click on a button: +Коли ви натискаєте на кнопку: -1. React calls the `onClick` handler passed to `
``` -Each event propagates in three phases: +Поширення кожної події складається із трьох фаз: -1. It travels down, calling all `onClickCapture` handlers. -2. It runs the clicked element's `onClick` handler. -3. It travels upwards, calling all `onClick` handlers. +1. Вона рухається вниз, викликаючи всі обробники `onClickCapture` — занурення. +2. Викликає обробник `onClick` елемента, на який натиснули. +3. Вона рухається вгору, викликаючи всі обробники `onClick` — спливання. -Capture events are useful for code like routers or analytics, but you probably won't use them in app code. +Події у фазі занурення корисні для навігації (routers) чи аналітики, але ви, ймовірно, не будете використовувати їх безпосередньо у застосунку. -### Passing handlers as alternative to propagation {/*passing-handlers-as-alternative-to-propagation*/} +### Передавання обробників як альтернатива поширенню {/*passing-handlers-as-alternative-to-propagation*/} -Notice how this click handler runs a line of code _and then_ calls the `onClick` prop passed by the parent: +Зверніть увагу, як цей обробник кліків виконує рядок коду, _а потім_ викликає проп `onClick` від батька: ```js {4,5} function Button({ onClick, children }) { @@ -460,22 +460,22 @@ function Button({ onClick, children }) { } ``` -You could add more code to this handler before calling the parent `onClick` event handler, too. This pattern provides an *alternative* to propagation. It lets the child component handle the event, while also letting the parent component specify some additional behavior. Unlike propagation, it's not automatic. But the benefit of this pattern is that you can clearly follow the whole chain of code that executes as a result of some event. +Ви також можете додати більше коду до цього обробника перед викликом батьківського обробника події `onClick`. Цей патерн надає *альтернативу* поширенню. Це дає змогу дочірньому компоненту обробляти подію, а також батьківському — вказувати деяку додаткову поведінку. На відміну від поширення, це не відбувається автоматично. Але перевага цього патерну полягає в тому, що ви можете чітко стежити за всім ланцюжком коду, який виконується у відповідь на якусь подію. -If you rely on propagation and it's difficult to trace which handlers execute and why, try this approach instead. +Якщо ви покладаєтеся на поширення і вам важко відстежити, які обробники виконуються та чому, спробуйте натомість цей підхід. -### Preventing default behavior {/*preventing-default-behavior*/} +### Запобігання стандартній поведінці {/*preventing-default-behavior*/} -Some browser events have default behavior associated with them. For example, a `
` submit event, which happens when a button inside of it is clicked, will reload the whole page by default: +Для деяких подій у браузері існує відповідна стандартна поведінка. Наприклад, подія надсилання форми ``, яка відбувається після натискання на кнопку всередині неї, стандартно перезавантажить всю сторінку: ```js export default function Signup() { return ( - alert('Submitting!')}> + alert('Надсилається!')}> - + ); } @@ -487,7 +487,7 @@ button { margin-left: 5px; }
-You can call `e.preventDefault()` on the event object to stop this from happening: +Ви можете викликати `e.preventDefault()` для об'єкта події, щоб цього не відбувалося: @@ -496,10 +496,10 @@ export default function Signup() { return (
{ e.preventDefault(); - alert('Submitting!'); + alert('Надсилається!'); }}> - +
); } @@ -511,28 +511,28 @@ button { margin-left: 5px; }
-Don't confuse `e.stopPropagation()` and `e.preventDefault()`. They are both useful, but are unrelated: +Не плутайте `e.stopPropagation()` і `e.preventDefault()`. Вони обидва корисні, але не пов'язані між собою: -* [`e.stopPropagation()`](https://developer.mozilla.org/docs/Web/API/Event/stopPropagation) stops the event handlers attached to the tags above from firing. -* [`e.preventDefault()` ](https://developer.mozilla.org/docs/Web/API/Event/preventDefault) prevents the default browser behavior for the few events that have it. +* [`e.stopPropagation()`](https://developer.mozilla.org/docs/Web/API/Event/stopPropagation) зупиняє виконання обробників подій, доданих до тегів вище деревом. +* [`e.preventDefault()` ](https://developer.mozilla.org/docs/Web/API/Event/preventDefault) запобігає стандартній поведінці браузера для кількох подій, які її мають. -## Can event handlers have side effects? {/*can-event-handlers-have-side-effects*/} +## Чи можуть обробники подій мати побічні ефекти? {/*can-event-handlers-have-side-effects*/} -Absolutely! Event handlers are the best place for side effects. +Звісно! Обробники подій — найкраще місце для побічних ефектів (side effects). -Unlike rendering functions, event handlers don't need to be [pure](/learn/keeping-components-pure), so it's a great place to *change* something—for example, change an input's value in response to typing, or change a list in response to a button press. However, in order to change some information, you first need some way to store it. In React, this is done by using [state, a component's memory.](/learn/state-a-components-memory) You will learn all about it on the next page. +На відміну від функцій рендерингу, обробники подій не обов'язково мають бути [чистими](/learn/keeping-components-pure), тому це чудове місце, щоб щось *змінити* — наприклад, змінити значення у полі введення у відповідь на друкування або змінити список у відповідь на натискання на кнопку. Однак для того, щоб змінити деяку інформацію, вам спочатку потрібен спосіб її зберігання. У React це можна зробити за допомогою [стану — пам'яті компонента.](/learn/state-a-components-memory) Ви дізнаєтеся про все це на наступній сторінці. -* You can handle events by passing a function as a prop to an element like ` ); } @@ -569,7 +569,7 @@ export default function LightSwitch() { -The problem is that ` ); } @@ -594,7 +594,7 @@ export default function LightSwitch() { -Alternatively, you could wrap the call into another function, like ` ); } @@ -621,11 +621,11 @@ export default function LightSwitch() { -#### Wire up the events {/*wire-up-the-events*/} +#### Під'єднайте події {/*wire-up-the-events*/} -This `ColorSwitch` component renders a button. It's supposed to change the page color. Wire it up to the `onChangeColor` event handler prop it receives from the parent so that clicking the button changes the color. +Цей компонент `ColorSwitch` рендерить кнопку. Вона має змінювати колір сторінки. Під'єднайте її до пропу обробника події `onChangeColor`, який він отримує від батьківського елемента, щоб натискання кнопки змінювало колір. -After you do this, notice that clicking the button also increments the page click counter. Your colleague who wrote the parent component insists that `onChangeColor` does not increment any counters. What else might be happening? Fix it so that clicking the button *only* changes the color, and does _not_ increment the counter. +Після цього зверніть увагу, що натискання кнопки також збільшує лічильник кліків сторінки. Ваш колега, який написав батьківський компонент, наполягає на тому, що `onChangeColor` не збільшує жодних лічильників. Що це таке відбувається? Виправте так, щоб натискання кнопки *лише* змінювало колір, а _не_ збільшувало лічильник. @@ -635,7 +635,7 @@ export default function ColorSwitch({ }) { return ( ); } @@ -669,7 +669,7 @@ export default function App() {

-

Clicks on the page: {clicks}

+

Кліків на сторінці: {clicks}

); } @@ -679,9 +679,9 @@ export default function App() { -First, you need to add the event handler, like ` ); } @@ -728,7 +728,7 @@ export default function App() {

-

Clicks on the page: {clicks}

+

Кліків на сторінці: {clicks}

); }