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/scaling-up-with-reducer-and-context.md
+28-28
Original file line number
Diff line number
Diff line change
@@ -10,15 +10,15 @@ title: Масштабування з використанням контекст
10
10
11
11
<YouWillLearn>
12
12
13
-
* Як поєднати з контекстом
14
-
* Як уникнути передачі стану та диспатча через пропси
13
+
* Як поєднати редюсер із контекстом
14
+
* Як уникнути передавання стану та відправляння подій через пропси
15
15
* Як зберігати логіку контексту і стану в окремому файлі
16
16
17
17
</YouWillLearn>
18
18
19
19
## Поєднання редюсера з контекстом {/*combining-a-reducer-with-context*/}
20
20
21
-
Як ми вже бачили, у прикладі з [цього розділу](/learn/extracting-state-logic-into-a-reducer), стан керується редюсером. Функція редюсера містить всю логіку оновлення стану і оголошена в кінці файлу:
21
+
Як ми вже бачили у прикладі з [цього розділу](/learn/extracting-state-logic-into-a-reducer), стан керується редюсером. Функція редюсера містить всю логіку оновлення стану і оголошена в кінці файлу:
Редюсер допомагає тримати обробники подій короткими і зрозумілими. Проте, з розвитком вашого додатка може виникнути проблема. **Наразі стан `tasks` та функція `dispatch` доступні тільки в компоненті `TaskApp` на верхньому рівні.** Щоб інші компоненти могли отримувати та оновлювати перелік завдань, потрібно явно [передавати](#passing-props-to-a-component)пропсами поточний стан і обробники подій.
210
+
Редюсер допомагає тримати обробники подій короткими і зрозумілими. Проте може виникнути проблема, коли ваш застосунок зросте. **Наразі стан `tasks` та функція `dispatch` доступні тільки в компоненті `TaskApp` на верхньому рівні.** Щоб інші компоненти могли отримувати та оновлювати перелік завдань, потрібно явно [передавати](#passing-props-to-a-component) поточний стан і обробники подій, які змінюють його, як пропси.
211
211
212
212
Наприклад, `TaskApp` передає перелік завдань і обробники подій компоненту `TaskList`:
У невеликому прикладі це добре працює, але якщо у вас є десятки або сотні вкладених компонентів, передавати таким чином весь стан і функції може бути досить неприємно!
232
+
У невеликому прикладі це працює добре, але якщо у вас є десятки або сотні вкладених компонентів, передавати так увесь стан і функції може бути досить неприємно!
233
233
234
-
Тому, як альтернатива передачі через пропси, ви можете помістити і стан `tasks`, і функцію `dispatch`[в контекст](/learn/passing-data-deeply-with-context). **Таким чином, будь-який компонент, що знаходиться нижче `TaskApp` у дереві, може мати доступ та надсилати події, уникнувши передачі пропсів через безліч компонентів.**
234
+
Тому, як альтернатива передаванню через пропси, ви можете помістити і стан `tasks`, і функцію `dispatch`[в контекст](/learn/passing-data-deeply-with-context). **У такий спосіб, будь-який компонент, що знаходиться нижче `TaskApp` у дереві, може мати доступ та надсилати події, уникнувши передавання пропсів через безліч компонентів ("prop drilling").**
235
235
236
236
Ось як можна поєднати редюсер із контекстом:
237
237
238
238
1.**Створіть** контекст.
239
-
2.**Розмістіть** стан і диспетчер у контексті.
239
+
2.**Помістіть** стан і функцію dispatch у контекст.
240
240
3.**Використовуйте** контекст будь-де в дереві компонентів.
241
241
242
-
### Крок 1: Створення контексту {/*step-1-create-the-context*/}
Тут ви передаєте `null` як значення за замовчуванням для обох контекстів. Дійсні значення будуть надані компонентом `TaskApp`.
451
+
Тут ви передаєте `null` як початкове значення для обох контекстів. Дійсні значення будуть надані компонентом `TaskApp`.
452
452
453
453
### Крок 2: Помістіть стан і функцію dispatch у контекст {/*step-2-put-state-and-dispatch-into-context*/}
454
454
455
-
Тепер ви можете імпортувати обидва контексти у ваш компонент `TaskApp`. Візьміть `tasks` та `dispatch`, які повертає`useReducer()`, і [надайте їх](/learn/passing-data-deeply-with-context#step-3-provide-the-context) всьому вкладеному дереву компонентів:
455
+
Тепер ви можете імпортувати обидва контексти у ваш компонент `TaskApp`. Візьміть `tasks` та `dispatch`, повернуті хуком`useReducer()`, і [надайте їх](/learn/passing-data-deeply-with-context#step-3-provide-the-context) всьому вкладеному дереву компонентів:
### Step 3: Використовуйте контекст у будь-якому місці дерева компонентів {/*step-3-use-context-anywhere-in-the-tree*/}
674
+
### Крок 3: Використовуйте контекст будь-де у дереві компонентів {/*step-3-use-context-anywhere-in-the-tree*/}
675
675
676
676
Тепер вам не потрібно передавати перелік завдань або обробники подій скрізь усе дерево компонентів:
677
677
@@ -693,7 +693,7 @@ export default function TaskList() {
693
693
// ...
694
694
```
695
695
696
-
Щоб оновити перелік завдань, будь-який компонент може взяти функцію `dispatch`з контексту та викликати її:
696
+
Щоб оновити перелік завдань, будь-який компонент може взяти функцію `dispatch`із контексту та викликати її:
697
697
698
698
```js {3,9-13}
699
699
exportdefaultfunctionAddTask() {
@@ -713,7 +713,7 @@ export default function AddTask() {
713
713
// ...
714
714
```
715
715
716
-
**Компонент `TaskApp` не передає жодних обробників подій, і `TaskList` також не передає нічого компоненту `Task`.** Кожен компонент обирає лише потрібний йому контекст:
716
+
**Компонент `TaskApp` не передає жодних обробників подій, і `TaskList` також не передає нічого компоненту `Task`.** Кожен компонент вибирає лише потрібний йому контекст:
**Стан все ще "живе" у компоненті `TaskApp` на верхньому рівні та керується за допомогою `useReducer`.** Але його `tasks` і `dispatch` тепер доступні кожному компоненту нижче в дереві, завдяки імпорту та використанню контекстів.
900
+
**Стан все ще "живе" у компоненті `TaskApp` на верхньому рівні та керується за допомогою `useReducer`.** Але його `tasks` і `dispatch` тепер доступні кожному компоненту нижче в дереві завдяки імпорту та використанню контекстів.
901
901
902
902
## Переміщення всієї логіки в один файл {/*moving-all-wiring-into-a-single-file*/}
Цей файл скоро стане більш наповненим! Додамо в нього редюсер. Потім оголосимо новий компонент `TasksProvider`. Цей компонент об’єднає всі частини разом. Він:
913
+
Цей файл скоро стане більш наповненим! Додамо в нього редюсер. Потім оголосимо новий компонент `TasksProvider`. Цей компонент зв'яже всі частини разом. Він:
914
914
915
915
1. Керуватиме станом за допомогою редюсера.
916
-
2. Надаватиме обидва контексти компонентам нижчим в ієрархії.
917
-
3. [Прийматиме `children` як пропс](/learn/passing-props-to-a-component#passing-jsx-as-children), щоб було можливим передавати в нього JSX.
916
+
2. Надаватиме обидва контексти ієрархічно нижчим компонентам.
917
+
3. [Матиме проп `children`](/learn/passing-props-to-a-component#passing-jsx-as-children), щоб було можливим передавати в нього JSX.
918
918
919
919
```js
920
920
exportfunctionTasksProvider({ children }) {
@@ -1140,7 +1140,7 @@ const tasks = useTasks();
1140
1140
constdispatch=useTasksDispatch();
1141
1141
```
1142
1142
1143
-
**Це не змінює функціональність, але дає змогу згодом розділити контексти або додати логіку. Тепер усі налаштування контексту та редюсера знаходяться у файлі `TasksContext.js`. Це допомагає зберегти компоненти чистими і не перевантаженими, зосередженими на відображенні даних, а не на їх отриманні.**
1143
+
**Це не змінює функціональність, але дає змогу згодом розділити контексти або додати логіку. Тепер усі налаштування контексту та редюсера знаходяться у файлі `TasksContext.js`. Це допомагає зберегти компоненти чистими і неперевантаженими, зосередженими на відображенні даних, а не на їхньому отриманні.**
Ви можете вважати `TasksProvider` частиною інтерфейсу, яка відповідає за роботу з завданнями, `useTasks` — способом доступу до завдань, а `useTasksDispatch` — способом їх оновлення з будь-якого компонента, що знаходиться нижче в дереві компонентів.
1343
+
Ви можете вважати `TasksProvider` частиною інтерфейсу, яка відповідає за роботу з завданнями, `useTasks` — способом доступу до завдань, а `useTasksDispatch` — способом їхнього оновлення з будь-якого компонента, що знаходиться нижче в дереві компонентів.
1344
1344
1345
1345
<Note>
1346
1346
1347
-
Функції на кшталт `useTasks` та `useTasksDispatch` називаються *[Хуками користувача](/learn/reusing-logic-with-custom-hooks)*. Ваша функція вважається хуком користувача, якщо її назва починається з `use`. Це дає змогу використовувати інші хуки, як-от `useContext`, всередині неї.
1347
+
Функції на кшталт `useTasks` та `useTasksDispatch` називаються *[хуками користувача (Custom Hooks)](/learn/reusing-logic-with-custom-hooks)*. Ваша функція вважається хуком користувача, якщо її назва починається з `use`. Це дає змогу використовувати інші хуки, як-от `useContext`, всередині неї.
1348
1348
1349
1349
</Note>
1350
1350
1351
-
Коли додаток зростає, у вас може з’явитися багато пар контекст-редюсерів. Це потужний спосіб масштабувати додаток і [ділитися станом](/learn/sharing-state-between-components) без зайвих зусиль щоразу, коли потрібно отримати дані з глибини дерева компонентів.
1351
+
Коли застосунок зростає, у вас може з'явитися багато пар "контекст-редюсер". Це потужний спосіб масштабувати застосунок і [ділитися станом](/learn/sharing-state-between-components) без зайвих зусиль щоразу, коли потрібно отримати дані глибоко в дереві компонентів.
1352
1352
1353
1353
<Recap>
1354
1354
1355
-
- Ви можете об'єднати редюсер з контекстом, щоб будь-який компонент міг мати доступ та оновлювати стан у компонентах вищих за ієрархією.
1355
+
- Ви можете об'єднати редюсер із контекстом, щоб будь-який компонент міг отримати та оновити стан, що вище деревом.
1356
1356
- Щоб надати стан і функцію `dispatch` компонентам нижче:
1357
1357
1. Створіть два контексти (для стану і для функцій `dispatch`).
1358
1358
2. Надайте обидва контексти компоненту, який використовує редюсер.
1359
-
3. Використовуйте будь-який контекст у компонентах, яким потрібно мати ці дані.
1360
-
- Щоб ще більше спростити компоненти, виносьте ці налаштування в один файл.
1359
+
3. Використовуйте будь-який із цих контекстів у компонентах, яким вони потрібні.
1360
+
- Щоб ще більше спростити компоненти, винесіть відповідну логіку в один файл.
1361
1361
- Експортуйте компонент, наприклад `TasksProvider`, який надає контекст.
1362
-
- Ви також можете експортувати користувацькі хуки, як-от `useTasks` та `useTasksDispatch`, для доступу до контексту.
1363
-
- У додатку може бути багато схожих на цю пар контекст-редюсерів.
1362
+
- Ви також можете експортувати хуки користувача, як-от `useTasks` та `useTasksDispatch`, для доступу до контексту.
1363
+
- У застосунку може бути багато схожих на цю пар "контекст-редюсер".
0 commit comments