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/render-and-commit.md
+28-29Lines changed: 28 additions & 29 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -19,14 +19,14 @@ title: Рендер і коміт
19
19
20
20
Уявіть, що ваші компоненти — це кухарі на кухні, які створюють смачні страви з інгредієнтів. У такій історії React — це офіціант, який приймає від клієнтів замовлення та видає їм їжу. Цей процес замовлення та подачі UI складається з трьох кроків:
21
21
22
-
1.**Запуск** рендеру (доставка замовлення гостя на кухню)
22
+
1.**Виклик** рендеру (відправлення замовлення гостя на кухню)
23
23
2.**Рендеринг** компонента (підготовка замовлення на кухні)
24
-
3.**Фіксація** у DOM (розміщення замовлення на столі)
24
+
3.**Коміт** у DOM (розміщення замовлення на столі гостя)
25
25
26
26
<IllustrationBlocksequential>
27
27
<Illustrationcaption="Виклик"alt="React як офіціант у ресторані, що збирає замовлення від клієнтів і передає їх до Кухні компонентів."src="/images/docs/illustrations/i_render-and-commit1.png" />
28
-
<Illustrationcaption="Render"alt="The Card Chef gives React a fresh Card component."src="/images/docs/illustrations/i_render-and-commit2.png" />
29
-
<Illustrationcaption="Commit"alt="React delivers the Card to the user at their table."src="/images/docs/illustrations/i_render-and-commit3.png" />
28
+
<Illustrationcaption="Рендер"alt="Кухар Card видає React свіжий компонент Card."src="/images/docs/illustrations/i_render-and-commit2.png" />
29
+
<Illustrationcaption="Коміт"alt="React доставляє Card клієнту на стіл."src="/images/docs/illustrations/i_render-and-commit3.png" />
2.**Було оновлено стан** компонента (або одного з його предків).
38
38
39
-
### Початковий {/*initial-render*/}
39
+
### Початковий рендер {/*initial-render*/}
40
40
41
-
Під час запуску програми вам потрібно запустити початковий рендеринг. Фреймворки та пісочниці іноді приховують цей код, але це робиться шляхом виклику[`createRoot`](/reference/react-dom/client/createRoot)з цільового DOM-вузла, і потім викликом його методу `render`з вашим компонентом:
41
+
Під час запуску застосунку необхідно викликати початковий рендер. Фреймворки та пісочниці іноді приховують цей код, але це виконується через виклик[`createRoot`](/reference/react-dom/client/createRoot)із передачею цільового вузла DOM, і потім через виклик методу `render`із вашим компонентом:
42
42
43
43
<Sandpack>
44
44
@@ -63,28 +63,28 @@ export default function Image() {
63
63
64
64
</Sandpack>
65
65
66
-
Спробуйте закоментувати виклик `root.render()` і побачите, що компонент зникне!
66
+
Спробуйте закоментувати виклик `root.render()`— і побачите, що компонент зник!
67
67
68
-
### Повторний рендеринг при оновленні стану {/*re-renders-when-state-updates*/}
68
+
### Повторний рендер під час оновлення стану {/*re-renders-when-state-updates*/}
69
69
70
-
Після першого рендерингу компонента ви можете викликати подальші рендеринги, оновивши його стан за допомогою функції[`set` function.](/reference/react/useState#setstate) Оновлення стану вашого компонента автоматично ставить рендеринг у чергу. (Ви можете уявити це як відвідувача ресторану, який після першого замовлення замовляє чай, десерт та інші речі, залежно від стану спраги чи голоду).
70
+
Після першого рендерингу компонента ви можете викликати подальші рендеринги, оновивши його стан за допомогою [функції `set`.](/reference/react/useState#setstate) Оновлення стану вашого компонента автоматично додає рендеринг до черги. (Уявіть відвідувача ресторану, який після першого замовлення замовляє чай, десерт та всяку всячину залежно від стану спраги чи голоду).
71
71
72
72
<IllustrationBlocksequential>
73
-
<Illustrationcaption="State update..."alt="React as a server in a restaurant, serving a Card UI to the user, represented as a patron with a cursor for their head. They patron expresses they want a pink card, not a black one!"src="/images/docs/illustrations/i_rerender1.png" />
74
-
<Illustrationcaption="...triggers..."alt="React returns to the Component Kitchen and tells the Card Chef they need a pink Card."src="/images/docs/illustrations/i_rerender2.png" />
75
-
<Illustrationcaption="...render!"alt="The Card Chef gives React the pink Card."src="/images/docs/illustrations/i_rerender3.png" />
73
+
<Illustrationcaption="Оновлення стану..."alt="React як офіціант у ресторані, що подає клієнту, представленому як постать з курсором замість голови, UI Card. Постать висловлює бажання щодо рожевої картки, а не чорної!"src="/images/docs/illustrations/i_rerender1.png" />
74
+
<Illustrationcaption="...викликає..."alt="React повертається до Кухні компонентів і каже Кухареві Card, що потрібна рожева Card."src="/images/docs/illustrations/i_rerender2.png" />
75
+
<Illustrationcaption="...рендер!"alt="Кухар Card видає React рожеву Card."src="/images/docs/illustrations/i_rerender3.png" />
Після того, як ви запускаєте рендер, React викликає ваші компоненти, щоб з'ясувати, що виводити на екраню**"Рендеринг" - це виклик React'ом ваших компонентів.**
80
+
Коли викликано рендер, React викликає ваші компоненти, щоб з'ясувати, що виводити на екран.**"Рендеринг" — це коли React викликає ваші компоненти.**
***Для наступних рендерів,** React буде викликати компонент функції, оновлення стану якого викликало рендер.
82
+
***Під час початкового рендеру** React викличе кореневий компонент.
83
+
***Для наступних рендерів** React викликатиме компонент-функцію, оновлення стану якого власне почало рендер.
84
84
85
-
Цей процес є рекурсивним: якщо оновлений компонент повертає якийсь інший компонент, React буде рендерити _цей_ компонент наступним, і якщо цей компонент також щось повертає, він буде рендерити _цей_компонент наступним і так далі. Процес продовжуватиметься доти, доки не залишиться більше вкладених компонентів і React точно знатиме, що саме має бути відображено на екрані.
85
+
Цей процес є рекурсивним: якщо оновлений компонент повертає якийсь інший компонент, React буде рендерити _цей_ компонент наступним, і якщо цей компонент також щось повертає, він буде рендерити _той інший_компонент наступним, і так далі. Процес триватиме доти, доки не залишиться більше вкладених компонентів, і React точно не знатиме, що саме має бути відображено на екрані.
86
86
87
-
У наступному прикладі React викличе `Gallery()`і`Image()` кілька разів:
87
+
У наступному прикладі React викличе `Gallery()`й`Image()` кілька разів:
***Під час початкового рендерингу,** React [створить вузли DOM](https://developer.mozilla.org/docs/Web/API/Document/createElement) для `<section>`, `<h1>`, і трьох `<img>` тегів.
128
-
***Під час ре-рендерингу,** React вирахує, які властивості цих елементів, якщо такі були, змінилися з моменту попереднього рендерингу. Він нічого не буде робити з цією інформацією до наступного кроку, фази фіксації.
127
+
***Під час початкового рендеру** React [створює вузли DOM](https://developer.mozilla.org/docs/Web/API/Document/createElement) для `<section>`, `<h1>` і трьох тегів `<img>`.
128
+
***Під час повторного рендеру* React вираховує, які властивості елементів змінилися після попереднього рендеру та чи змінилися взагалі. Він нічого не робить з цією інформацією до наступного кроку, фази коміту.
129
129
130
130
<Pitfall>
131
131
132
132
Рендеринг завжди має бути [чистим обчисленням](/learn/keeping-components-pure):
133
133
134
-
***Однакові вхідні дані, однаковий результат.**При однакових вхідних даних компонент завжди має повертати однаковий JSX. (Коли хтось замовляє салат з помідорами, він не повинен отримати салат з цибулею!)
135
-
***Займається своїми справами.**Він не повинен змінювати жодних об'єктів або змінних, які існували до рендерингу. (Одне замовлення не повинно змінювати інші замовлення.)
134
+
***Однакові вихідні дані дають однаковий результат.**Для однакових вихідних даних компонент завжди повинен повертати однаковий JSX. (Коли хтось замовляє салат з помідорами, він не повинен отримати салат з цибулею!)
135
+
***Кожен робить свою роботу.**Рендер не повинен змінювати жодних об'єктів або змінних, які існували до нього. (Одне замовлення не повинно змінювати інші замовлення.)
136
136
137
-
Інакше ви можете зіткнутися із заплутаними багами та непередбачуваною поведінкою зі зростанням складності вашої кодової бази. При розробці у "Strict Mode" React викликає функцію кожного компонента двічі, що може допомогти виявити помилки, спричинені нечистими функціями.
137
+
Інакше ви можете зіткнутися із заплутаними помилками та непередбачуваною поведінкою зі зростанням складності кодової бази. Під час розробки у суворому режимі ("Strict Mode") React викликає функцію кожного компонента двічі, що може допомогти виявити помилки, спричинені нечистими функціями.
Поведінка за замовчуванням, яка полягає у рендерингу усіх компонентів, вкладених у оновлений компонент, не є оптимальною для продуктивності, якщо оновлений компонент знаходиться дуже високо у дереві. Якщо ви зіткнулися з проблемою продуктивності, є кілька варіантів її вирішення, описаних в розділі [Продуктивність](https://reactjs.org/docs/optimizing-performance.html). **Не оптимізуйте передчасно!**
145
+
Стандартна поведінка, яка полягає у рендерингу всіх компонентів, вкладених в оновлений компонент, не є оптимальною для продуктивності, якщо оновлений компонент знаходиться дуже високо в дереві. Якщо ви зіткнулися з проблемою продуктивності, є кілька варіантів її вирішення, описаних в розділі ["Продуктивність"](https://reactjs.org/docs/optimizing-performance.html). **Не оптимізуйте передчасно!**
146
146
147
147
</DeepDive>
148
148
149
149
## Крок 3: React фіксує зміни в DOM {/*step-3-react-commits-changes-to-the-dom*/}
150
150
151
-
Після рендерингу (виклику) ваших компонентів, React змінюватиме DOM.
151
+
Після рендерингу (виклику) ваших компонентів React вносить зміни в DOM.
152
152
153
-
***Для початкового рендерингу,** React використовуватиме [`appendChild()`](https://developer.mozilla.org/docs/Web/API/Node/appendChild) DOM API, щоб вивести на екран усі створені ним вузли DOM.
154
-
***Для ре-рендерингів,** React застосовуватиме мінімально необхідні операції (обчислені під час рендерингу!) щоб зробити DOM відповідним останньому результату рендерингу.
153
+
***Для початкового рендерингу** React використовує API DOM [`appendChild()`](https://developer.mozilla.org/docs/Web/API/Node/appendChild), щоб вивести на екран усі новостворені вузли DOM.
154
+
***Для повторних рендерів** React застосовує мінімально необхідні операції (обчислені під час рендерингу!), щоб оновити DOM відповідно до результату найсвіжішого рендерингу.
155
155
156
-
**React змінює вузли DOM тільки якщо є різниця між рендерами.** Наприклад, ось компонент, який ре-рендериться щосекунди з різними пропсами, переданими від батька. Зверніть увагу, що ви можете додати текст у `<input>`, оновивши його `value`, але текст не зникає, коли компонент ре-рендериться:
156
+
**React змінює вузли DOM тільки якщо є різниця між рендерами.** Наприклад, ось компонент, який повторно рендериться щосекунди з різними властивостями, що передаються від батьківського компонента. Зверніть увагу, що можна додати текст у `<input>`, оновивши його `value`, але текст не зникає, коли компонент рендериться наново:
157
157
158
158
<Sandpack>
159
159
@@ -193,8 +193,7 @@ export default function App() {
193
193
194
194
</Sandpack>
195
195
196
-
Це працює, тому що на останньому кроці React оновлює лише вміст `<h1>` з новим `time`. Він бачить, що `<input>` з'являється в JSX в тому ж місці, що і минулого разу, тому React не чіпає `<input>` — або його `value`!
197
-
196
+
Це працює, тому що на останньому кроці React оновлює лише вміст `<h1>` новим `time`. Він бачить, що `<input>` з'являється в JSX в тому ж місці, що і минулого разу, тому React не чіпає `<input>` — або його `value`!
Після того, як рендеринг завершено і React оновив DOM, браузер перемалює екран. Хоча цей процес відомий як "рендеринг браузера", ми будемо називати його "малюванням", щоб уникнути плутанини в документації.
0 commit comments