You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/content/learn/queueing-a-series-of-state-updates.md
+18-18
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ title: Додавання до черги низки оновлень стану
4
4
5
5
<Intro>
6
6
7
-
Задання змінної стану ставить у чергу ще один рендер. Проте іноді може викинути потреба виконати кілько операцій над значенням, перш ніж додавати до черги новий рендер. Щоб це зробити, корисно розуміти, як React групує оновлення стану.
7
+
Задання значення змінній стану ставить у чергу ще один рендер. Проте іноді може виникнути потреба виконати кілька операцій над значенням, перш ніж додавати до черги новий рендер. Щоб це зробити, корисно розуміти, як React групує оновлення стану.
8
8
9
9
</Intro>
10
10
@@ -55,11 +55,11 @@ setNumber(0 + 1);
55
55
setNumber(0+1);
56
56
```
57
57
58
-
Але тут грає роль ще один чинник. **React чекає, поки не виконається *ввесь* код у обробниках подій, перш ніж обробляти ваші оновлення стану.** Саме тому повторний рендер відбувається *після* всіх цих викликів `setNumber()`.
58
+
Але тут грає роль ще один чинник. **React чекає, поки не виконається *весь* код у обробниках подій, перш ніж обробляти ваші оновлення стану.** Саме тому повторний рендер відбувається *після* всіх цих викликів `setNumber()`.
59
59
60
60
Це може нагадати офіціанта, що приймає замовлення в ресторані. Він не бігає на кухню, коли названа одна страва! Замість цього він дає змогу зробити замовлення повністю, внести до нього зміни й навіть прийняти замовлення від інших людей за тим же столом.
61
61
62
-
ʼ<Illustrationsrc="/images/docs/illustrations/i_react-batching.png"alt="Елегантна курсорка в ресторані робить кілька замовлень в бік React, що грає роль офіціанта. Коли вона кілька разів викликає setState(), офіціант записує останнє з запитаного як остаточне замовлення." />
62
+
<Illustrationsrc="/images/docs/illustrations/i_react-batching.png"alt="Елегантна курсорка в ресторані робить кілька замовлень у React, що грає роль офіціанта. Коли вона кілька разів викликає setState(), офіціант записує останнє з запитаного як остаточне замовлення." />
63
63
64
64
Це дає змогу оновлювати кілька змінних стану — навіть з різних компонентів — не запускаючи забагато [повторних рендерів.](/learn/render-and-commit#re-renders-when-state-updates) Але це також означає, що UI не оновиться, поки не завершиться вам обробник події та ввесь код у ньому. Така логіка, також відома як **групування,** робить ваш застосунок на React куди швидшим. Також це позбавляє потреби мати справу з безглуздими "напівготовими" рендерами, в яких оновилась лише частина змінних.
Тут `n => n + 1` зветься **функцією-оновлювачем.** Коли ви передаєте її до сетера стану:
103
103
104
104
1. React додає цю функцію в чергу до обробки, коли решта коду в обробнику події завершилася.
105
-
2. Під час наступного рендеру React йде по черзі та видає остаточний оновлений стан.
105
+
2. Під час наступного рендеру React йде чергою та видає остаточний оновлений стан.
106
106
107
107
```js
108
108
setNumber(n=> n +1);
109
109
setNumber(n=> n +1);
110
110
setNumber(n=> n +1);
111
111
```
112
112
113
-
Ось як React проходить по цих рядках коду, виконуючи обробник подій:
113
+
Ось як React проходить цими рядками коду, виконуючи обробник подій:
114
114
115
115
1.`setNumber(n => n + 1)`: `n => n + 1` — це функція. React додає її до черги.
116
-
2.`setNumber(n => n + 1)`: `n => n + 1` — це функція. React додає її до черги.
117
-
3.`setNumber(n => n + 1)`: `n => n + 1` — це функція. React додає її до черги.
116
+
1.`setNumber(n => n + 1)`: `n => n + 1` — це функція. React додає її до черги.
117
+
1.`setNumber(n => n + 1)`: `n => n + 1` — це функція. React додає її до черги.
118
118
119
-
Коли `useState` викликається під час наступного рендеру, React проходить по черзі. Попередній стан `number` був `0`, і це саме те, що React передає до першої функції-оновлювача як аргумент `n`. Потім React бере повернене значення нашої попередньої функції-оновлювача й передає його до наступного оновлювача як `n`, і так далі:
119
+
Коли `useState` викликається під час наступного рендеру, React проходить чергою. Попередній стан `number` був `0`, і це саме те, що React передає до першої функції-оновлювача як аргумент `n`. Потім React бере повернене значення нашої попередньої функції-оновлювача й передає його до наступного оновлювача як `n`, і так далі:
120
120
121
121
| оновлення в черзі |`n`| повертає |
122
122
| ----------------- | --- | ----------- |
@@ -129,7 +129,7 @@ React зберігає `3` як остаточний результат і по
129
129
Саме тому клацання "+3" у прикладі вище коректно збільшує значення на 3.
130
130
### Що відбудеться, якщо оновити стан, спершу замінивши його {/*what-happens-if-you-update-state-after-replacing-it*/}
131
131
132
-
Як щодо цього обробника подій? Як гадаєте, чим буде`number` у наступному рендері?
132
+
Як щодо цього обробника подій? Як гадаєте, яке значення матиме`number` у наступному рендері?
133
133
134
134
```js
135
135
<button onClick={() => {
@@ -185,7 +185,7 @@ React зберігає `6` як остаточний результат і по
185
185
186
186
</Note>
187
187
188
-
### Що станеться, якщо замінити стан, перед тим оновивши його {/*what-happens-if-you-replace-state-after-updating-it*/}
188
+
### Що відбудеться, якщо замінити стан, перед тим оновивши його {/*what-happens-if-you-replace-state-after-updating-it*/}
189
189
190
190
Спробуймо ще один приклад. Як гадаєте, що буде в `number` у наступному рендері?
191
191
@@ -246,9 +246,9 @@ React зберігає `42` як остаточний результат і по
246
246
***Функція-оновлювач** (наприклад, `n => n + 1`) додається до черги.
247
247
***Будь-які інші значення** (наприклад, число `5`) додають до черги "замінити на `5`", ігноруючи все, що вже в черзі.
248
248
249
-
Коли обробник подій завершується, React запускає повторний рендер. Під час нього React обробляє чергу. Функції-оновлювачі запускаються під час рендерингу, тож **функції-оновлювачі повинні бути [чистими](/learn/keeping-components-pure)** й лише *повертати* результат. Не намагайтеся задавати стан зсередини них, чи запускати ще якісь побічні ефекти. У Суворому режимі React намагається запустити кожну функцію-оновлювач двічі (відкидаючи другий результат), щоб допомогти з пошуком помилок.
249
+
Коли обробник подій завершується, React запускає повторний рендер. Під час нього React обробляє чергу. Функції-оновлювачі запускаються під час рендерингу, тож **функції-оновлювачі повинні бути [чистими](/learn/keeping-components-pure)** й лише *повертати* результат. Не намагайтеся задавати стан зсередини них чи запускати ще якісь побічні ефекти. У суворому режимі (strict mode) React намагається запустити кожну функцію-оновлювач двічі (відкидаючи другий результат), щоб допомогти з пошуком помилок.
250
250
251
-
### Домовленості з найменування {/*naming-conventions*/}
251
+
### Домовленості про найменування {/*naming-conventions*/}
252
252
253
253
Прийнято називати аргумент функції-оновлювача за першими літерами відповідної змінної стану:
Якщо вам подобається розлогіший код, то іншим прийнятим підходом є повторити повну назву змінної стану, так`setEnabled(enabled => !enabled)`, або скористатися префіксом так`setEnabled(prevEnabled => !prevEnabled)`.
261
+
Якщо вам подобається розлогіший код, то іншим прийнятим підходом є повторити повну назву змінної стану, як`setEnabled(enabled => !enabled)`, або скористатися префіксом, як`setEnabled(prevEnabled => !prevEnabled)`.
262
262
263
263
<Recap>
264
264
265
-
* Задання стану не змінить змінної в наявному рендері, проте зробить запит щодо нового рендеру.
265
+
* Задання стану не змінить її змінну в наявному рендері, проте зробить запит щодо нового рендеру.
266
266
* React обробляє оновлення стану тоді, коли обробники подій уже закінчили виконання. Це зветься групуванням.
267
267
* Щоб оновити якийсь стан кілька разів у одній події, можна скористатися функцією-оновлювачем `setNumber(n => n + 1)`.
268
268
@@ -278,7 +278,7 @@ setFriendCount(fc => fc * 2);
278
278
279
279
Проте лічильник "Очікування" не поводиться як задумано. Коли натиснути "Придбати", він зменшується до `-1` (що не повинно бути можливим!). А якщо двічі швидко клацнути, то обидва лічильники, здається, поводяться непередбачувано.
280
280
281
-
Чому так відбувається? Виправмо обидва лічильники.
281
+
Чому так відбувається? Виправіть обидва лічильники.
282
282
283
283
<Sandpack>
284
284
@@ -364,15 +364,15 @@ function delay(ms) {
364
364
365
365
</Sandpack>
366
366
367
-
Так можна пересвідчитись, що коли інкрементується чи декрементується лічильник, це відбувається щодо його *останнього* стану, а не того, яким стан був під час клацання.
367
+
Так можна пересвідчитись, що коли інкрементується чи декрементується лічильник, це відбувається відповідно до його *останнього* стану, а не того, яким стан був під час клацання.
368
368
369
369
</Solution>
370
370
371
-
#### Самостійна реалізація черги стану {/*implement-the-state-queue-yourself*/}
371
+
#### Створення власної черги стану {/*implement-the-state-queue-yourself*/}
372
372
373
373
У цьому завданні ви самі відтворите крихітну частину React з нуля! Це не так важко, як здається.
374
374
375
-
Погортайте живий зразок. Зверніть увагу на те, що він демонструє**чотири тестові випадки.** Вони відповідають прикладам, які ви бачили на цій сторінці вище. Ваше завдання — реалізувати функцію `getFinalState` так, щоб вона повертала коректний результат для кожного з цих випадків. Якщо реалізувати її коректно, то всі чотири тести пройдуть.
375
+
Погортайте попередньо "пісочницю". Зверніть увагу на те, що у ній показані**чотири тестові випадки.** Вони відповідають прикладам, які ви бачили на цій сторінці вище. Ваше завдання — реалізувати функцію `getFinalState` так, щоб вона повертала коректний результат для кожного з цих випадків. Якщо реалізувати її коректно, то всі чотири тести пройдуть.
376
376
377
377
Ви отримаєте два аргументи: `baseState` — це початковий стан (наприклад, `0`), а `queue` — це масив, що вміщає мішанину з чисел (наприклад, `5`) і функцій-оновлювачів (наприклад, `n => n + 1`) у тому порядку, в якому вони додані.
0 commit comments