Skip to content

Commit a50273b

Browse files
alinkeddundead404
andauthored
Apply suggestions from code review
Co-authored-by: Vitalii Perehonchuk <[email protected]>
1 parent a4d151f commit a50273b

File tree

1 file changed

+28
-29
lines changed

1 file changed

+28
-29
lines changed

src/content/learn/render-and-commit.md

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ title: Рендер і коміт
1919

2020
Уявіть, що ваші компоненти — це кухарі на кухні, які створюють смачні страви з інгредієнтів. У такій історії React — це офіціант, який приймає від клієнтів замовлення та видає їм їжу. Цей процес замовлення та подачі UI складається з трьох кроків:
2121

22-
1. **Запуск** рендеру (доставка замовлення гостя на кухню)
22+
1. **Виклик** рендеру (відправлення замовлення гостя на кухню)
2323
2. **Рендеринг** компонента (підготовка замовлення на кухні)
24-
3. **Фіксація** у DOM (розміщення замовлення на столі)
24+
3. **Коміт** у DOM (розміщення замовлення на столі гостя)
2525

2626
<IllustrationBlock sequential>
2727
<Illustration caption="Виклик" alt="React як офіціант у ресторані, що збирає замовлення від клієнтів і передає їх до Кухні компонентів." src="/images/docs/illustrations/i_render-and-commit1.png" />
28-
<Illustration caption="Render" alt="The Card Chef gives React a fresh Card component." src="/images/docs/illustrations/i_render-and-commit2.png" />
29-
<Illustration caption="Commit" alt="React delivers the Card to the user at their table." src="/images/docs/illustrations/i_render-and-commit3.png" />
28+
<Illustration caption="Рендер" alt="Кухар Card видає React свіжий компонент Card." src="/images/docs/illustrations/i_render-and-commit2.png" />
29+
<Illustration caption="Коміт" alt="React доставляє Card клієнту на стіл." src="/images/docs/illustrations/i_render-and-commit3.png" />
3030
</IllustrationBlock>
3131

3232
## Крок 1: Запуск рендерингу {/*step-1-trigger-a-render*/}
@@ -36,9 +36,9 @@ title: Рендер і коміт
3636
1. Це **початковий рендер** компонента.
3737
2. **Було оновлено стан** компонента (або одного з його предків).
3838

39-
### Початковий {/*initial-render*/}
39+
### Початковий рендер {/*initial-render*/}
4040

41-
Під час запуску програми вам потрібно запустити початковий рендеринг. Фреймворки та пісочниці іноді приховують цей код, але це робиться шляхом виклику [`createRoot`](/reference/react-dom/client/createRoot) з цільового DOM-вузла, і потім викликом його методу `render` з вашим компонентом:
41+
Під час запуску застосунку необхідно викликати початковий рендер. Фреймворки та пісочниці іноді приховують цей код, але це виконується через виклик [`createRoot`](/reference/react-dom/client/createRoot) із передачею цільового вузла DOM, і потім через виклик методу `render` із вашим компонентом:
4242

4343
<Sandpack>
4444

@@ -63,28 +63,28 @@ export default function Image() {
6363

6464
</Sandpack>
6565

66-
Спробуйте закоментувати виклик `root.render()` і побачите, що компонент зникне!
66+
Спробуйте закоментувати виклик `root.render()` і побачите, що компонент зник!
6767

68-
### Повторний рендеринг при оновленні стану {/*re-renders-when-state-updates*/}
68+
### Повторний рендер під час оновлення стану {/*re-renders-when-state-updates*/}
6969

70-
Після першого рендерингу компонента ви можете викликати подальші рендеринги, оновивши його стан за допомогою функції[`set` function.](/reference/react/useState#setstate) Оновлення стану вашого компонента автоматично ставить рендеринг у чергу. (Ви можете уявити це як відвідувача ресторану, який після першого замовлення замовляє чай, десерт та інші речі, залежно від стану спраги чи голоду).
70+
Після першого рендерингу компонента ви можете викликати подальші рендеринги, оновивши його стан за допомогою [функції `set`.](/reference/react/useState#setstate) Оновлення стану вашого компонента автоматично додає рендеринг до черги. (Уявіть відвідувача ресторану, який після першого замовлення замовляє чай, десерт та всяку всячину залежно від стану спраги чи голоду).
7171

7272
<IllustrationBlock sequential>
73-
<Illustration caption="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-
<Illustration caption="...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-
<Illustration caption="...render!" alt="The Card Chef gives React the pink Card." src="/images/docs/illustrations/i_rerender3.png" />
73+
<Illustration caption="Оновлення стану..." alt="React як офіціант у ресторані, що подає клієнту, представленому як постать з курсором замість голови, UI Card. Постать висловлює бажання щодо рожевої картки, а не чорної!" src="/images/docs/illustrations/i_rerender1.png" />
74+
<Illustration caption="...викликає..." alt="React повертається до Кухні компонентів і каже Кухареві Card, що потрібна рожева Card." src="/images/docs/illustrations/i_rerender2.png" />
75+
<Illustration caption="...рендер!" alt="Кухар Card видає React рожеву Card." src="/images/docs/illustrations/i_rerender3.png" />
7676
</IllustrationBlock>
7777

7878
## Крок 2: React рендерить ваші компоненти {/*step-2-react-renders-your-components*/}
7979

80-
Після того, як ви запускаєте рендер, React викликає ваші компоненти, щоб з'ясувати, що виводити на екраню **"Рендеринг" - це виклик React'ом ваших компонентів.**
80+
Коли викликано рендер, React викликає ваші компоненти, щоб з'ясувати, що виводити на екран. **"Рендеринг" це коли React викликає ваші компоненти.**
8181

82-
* **При початковому рендерингу,** React викличе кореневий компонент.
83-
* **Для наступних рендерів,** React буде викликати компонент функції, оновлення стану якого викликало рендер.
82+
* **Під час початкового рендеру** React викличе кореневий компонент.
83+
* **Для наступних рендерів** React викликатиме компонент-функцію, оновлення стану якого власне почало рендер.
8484

85-
Цей процес є рекурсивним: якщо оновлений компонент повертає якийсь інший компонент, React буде рендерити _цей_ компонент наступним, і якщо цей компонент також щось повертає, він буде рендерити _цей_ компонент наступним і так далі. Процес продовжуватиметься доти, доки не залишиться більше вкладених компонентів і React точно знатиме, що саме має бути відображено на екрані.
85+
Цей процес є рекурсивним: якщо оновлений компонент повертає якийсь інший компонент, React буде рендерити _цей_ компонент наступним, і якщо цей компонент також щось повертає, він буде рендерити _той інший_ компонент наступним, і так далі. Процес триватиме доти, доки не залишиться більше вкладених компонентів, і React точно не знатиме, що саме має бути відображено на екрані.
8686

87-
У наступному прикладі React викличе `Gallery()` і `Image()` кілька разів:
87+
У наступному прикладі React викличе `Gallery()` й `Image()` кілька разів:
8888

8989
<Sandpack>
9090

@@ -124,36 +124,36 @@ img { margin: 0 10px 10px 0; }
124124

125125
</Sandpack>
126126

127-
* **Під час початкового рендерингу,** 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 вираховує, які властивості елементів змінилися після попереднього рендеру та чи змінилися взагалі. Він нічого не робить з цією інформацією до наступного кроку, фази коміту.
129129

130130
<Pitfall>
131131

132132
Рендеринг завжди має бути [чистим обчисленням](/learn/keeping-components-pure):
133133

134-
* **Однакові вхідні дані, однаковий результат.** При однакових вхідних даних компонент завжди має повертати однаковий JSX. (Коли хтось замовляє салат з помідорами, він не повинен отримати салат з цибулею!)
135-
* **Займається своїми справами.** Він не повинен змінювати жодних об'єктів або змінних, які існували до рендерингу. (Одне замовлення не повинно змінювати інші замовлення.)
134+
* **Однакові вихідні дані дають однаковий результат.** Для однакових вихідних даних компонент завжди повинен повертати однаковий JSX. (Коли хтось замовляє салат з помідорами, він не повинен отримати салат з цибулею!)
135+
* **Кожен робить свою роботу.** Рендер не повинен змінювати жодних об'єктів або змінних, які існували до нього. (Одне замовлення не повинно змінювати інші замовлення.)
136136

137-
Інакше ви можете зіткнутися із заплутаними багами та непередбачуваною поведінкою зі зростанням складності вашої кодової бази. При розробці у "Strict Mode" React викликає функцію кожного компонента двічі, що може допомогти виявити помилки, спричинені нечистими функціями.
137+
Інакше ви можете зіткнутися із заплутаними помилками та непередбачуваною поведінкою зі зростанням складності кодової бази. Під час розробки у суворому режимі ("Strict Mode") React викликає функцію кожного компонента двічі, що може допомогти виявити помилки, спричинені нечистими функціями.
138138

139139
</Pitfall>
140140

141141
<DeepDive>
142142

143143
#### Оптимізація продуктивності {/*optimizing-performance*/}
144144

145-
Поведінка за замовчуванням, яка полягає у рендерингу усіх компонентів, вкладених у оновлений компонент, не є оптимальною для продуктивності, якщо оновлений компонент знаходиться дуже високо у дереві. Якщо ви зіткнулися з проблемою продуктивності, є кілька варіантів її вирішення, описаних в розділі [Продуктивність](https://reactjs.org/docs/optimizing-performance.html). **Не оптимізуйте передчасно!**
145+
Стандартна поведінка, яка полягає у рендерингу всіх компонентів, вкладених в оновлений компонент, не є оптимальною для продуктивності, якщо оновлений компонент знаходиться дуже високо в дереві. Якщо ви зіткнулися з проблемою продуктивності, є кілька варіантів її вирішення, описаних в розділі ["Продуктивність"](https://reactjs.org/docs/optimizing-performance.html). **Не оптимізуйте передчасно!**
146146

147147
</DeepDive>
148148

149149
## Крок 3: React фіксує зміни в DOM {/*step-3-react-commits-changes-to-the-dom*/}
150150

151-
Після рендерингу (виклику) ваших компонентів, React змінюватиме DOM.
151+
Після рендерингу (виклику) ваших компонентів React вносить зміни в DOM.
152152

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 відповідно до результату найсвіжішого рендерингу.
155155

156-
**React змінює вузли DOM тільки якщо є різниця між рендерами.** Наприклад, ось компонент, який ре-рендериться щосекунди з різними пропсами, переданими від батька. Зверніть увагу, що ви можете додати текст у `<input>`, оновивши його `value`, але текст не зникає, коли компонент ре-рендериться:
156+
**React змінює вузли DOM тільки якщо є різниця між рендерами.** Наприклад, ось компонент, який повторно рендериться щосекунди з різними властивостями, що передаються від батьківського компонента. Зверніть увагу, що можна додати текст у `<input>`, оновивши його `value`, але текст не зникає, коли компонент рендериться наново:
157157

158158
<Sandpack>
159159

@@ -193,8 +193,7 @@ export default function App() {
193193

194194
</Sandpack>
195195

196-
Це працює, тому що на останньому кроці React оновлює лише вміст `<h1>` з новим `time`. Він бачить, що `<input>` з'являється в JSX в тому ж місці, що і минулого разу, тому React не чіпає `<input>` — або його `value`!
197-
196+
Це працює, тому що на останньому кроці React оновлює лише вміст `<h1>` новим `time`. Він бачить, що `<input>` з'являється в JSX в тому ж місці, що і минулого разу, тому React не чіпає `<input>` — або його `value`!
198197
## Епілог: Малювання браузера {/*epilogue-browser-paint*/}
199198

200199
Після того, як рендеринг завершено і React оновив DOM, браузер перемалює екран. Хоча цей процес відомий як "рендеринг браузера", ми будемо називати його "малюванням", щоб уникнути плутанини в документації.

0 commit comments

Comments
 (0)