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
+38-42Lines changed: 38 additions & 42 deletions
Original file line number
Diff line number
Diff line change
@@ -1,24 +1,24 @@
1
1
---
2
-
title: Масштабування з використанням контексту та ред'юсера
2
+
title: Масштабування з використанням контексту та редюсера
3
3
---
4
4
5
5
<Intro>
6
6
7
-
Ред'юсери дозволяють об'єднати логіку оновлення стану компонента. Контекст дозволяє передавати інформацію у глибину до інших компонентів. Ви можете поєднати ред'юсери і контекст, щоб управляти станом складного інтерфейсу.
7
+
Редюсери дають змогу об'єднати логіку оновлення стану компонента. Контекст дає змогу передавати інформацію у глибину до інших компонентів. Можна поєднати редюсери і контекст, щоб управляти станом складного інтерфейсу.
8
8
9
9
</Intro>
10
10
11
11
<YouWillLearn>
12
12
13
-
* Як поєднати ред'юсер з контекстом
13
+
* Як поєднати з контекстом
14
14
* Як уникнути передачі стану та диспатча через пропси
15
15
* Як зберігати логіку контексту і стану в окремому файлі
16
16
17
17
</YouWillLearn>
18
18
19
-
## Поєднання ред'юсера з контекстом {/*combining-a-reducer-with-context*/}
19
+
## Поєднання редюсера з контекстом {/*combining-a-reducer-with-context*/}
20
20
21
-
Як ми вже бачили, у прикладі з [цього розділу](/learn/extracting-state-logic-into-a-reducer), стан керується ред'юсером. Функція ред'юсера містить всю логіку оновлення стану і оголошена в кінці файлу:
21
+
Як ми вже бачили, у прикладі з [цього розділу](/learn/extracting-state-logic-into-a-reducer), стан керується редюсером. Функція редюсера містить всю логіку оновлення стану і оголошена в кінці файлу:
22
22
23
23
<Sandpack>
24
24
@@ -57,7 +57,7 @@ export default function TaskApp() {
57
57
58
58
return (
59
59
<>
60
-
<h1>Вихідний у Кіото</h1>
60
+
<h1>Вихідний день у Кіото</h1>
61
61
<AddTask
62
62
onAddTask={handleAddTask}
63
63
/>
@@ -99,7 +99,7 @@ function tasksReducer(tasks, action) {
Ред'юсер допомагає тримати обробники подій короткими і зрозумілими. Проте, з розвитком вашого додатка може виникнути проблема. **Наразі стан `tasks` та функція `dispatch` доступні тільки в компоненті `TaskApp` на верхньому рівні.** Щоб інші компоненти могли отримувати та оновлювати перелік завдань, потрібно явно [передавати](#passing-props-to-a-component) пропсами поточний стан і обробники подій.
210
+
Редюсер допомагає тримати обробники подій короткими і зрозумілими. Проте, з розвитком вашого додатка може виникнути проблема. **Наразі стан `tasks` та функція `dispatch` доступні тільки в компоненті `TaskApp` на верхньому рівні.** Щоб інші компоненти могли отримувати та оновлювати перелік завдань, потрібно явно [передавати](#passing-props-to-a-component) пропсами поточний стан і обробники подій.
211
211
212
212
Наприклад, `TaskApp` передає перелік завдань і обробники подій компоненту `TaskList`:
Тому, як альтернатива передачі через пропси, ви можете помістити і стан `tasks`, і функцію `dispatch` [в контекст](/learn/passing-data-deeply-with-context). **Таким чином, будь-який компонент, що знаходиться нижче `TaskApp` у дереві, може мати доступ та надсилати події, уникнувши передачі пропсів через безліч компонентів.**
239
235
240
-
Ось як можна поєднати ред'юсер із контекстом:
236
+
Ось як можна поєднати редюсер із контекстом:
241
237
242
238
1.**Створіть** контекст.
243
239
2.**Розмістіть** стан і диспетчер у контексті.
244
240
3.**Використовуйте** контекст будь-де в дереві компонентів.
245
241
246
242
### Крок 1: Створення контексту {/*step-1-create-the-context*/}
247
243
248
-
Хук `useReducer` повертає поточний стан `tasks` та функцію `dispatch`, яка дозволяє оновлювати цей стан:
244
+
Хук `useReducer` повертає поточний стан `tasks` та функцію `dispatch`, яка дає змогу оновлювати цей стан:
## Переміщення всієї логіки в один файл {/*moving-all-wiring-into-a-single-file*/}
907
903
908
-
Це не обов'язково, але ви можете ще більше спростити компоненти, перемістивши і ред'юсер, і контекст в один файл. Наразі `TasksContext.js` містить лише два оголошення контексту:
904
+
Це не обов'язково, але ви можете ще більше спростити компоненти, перемістивши і редюсер, і контекст в один файл. Наразі `TasksContext.js` містить лише два оголошення контексту:
Цей файл скоро стане більш наповненим! Додамо в нього ред'юсер. Потім оголосимо новий компонент `TasksProvider`. Цей компонент об’єднає всі частини разом. Він:
913
+
Цей файл скоро стане більш наповненим! Додамо в нього редюсер. Потім оголосимо новий компонент `TasksProvider`. Цей компонент об’єднає всі частини разом. Він:
918
914
919
-
1. Керуватиме станом за допомогою ред'юсера.
915
+
1. Керуватиме станом за допомогою редюсера.
920
916
2. Надаватиме обидва контексти компонентам нижчим в ієрархії.
921
917
3. [Прийматиме `children` як пропс](/learn/passing-props-to-a-component#passing-jsx-as-children), щоб було можливим передавати в нього JSX.
922
918
@@ -946,7 +942,7 @@ import { TasksProvider } from './TasksContext.js';
946
942
export default function TaskApp() {
947
943
return (
948
944
<TasksProvider>
949
-
<h1>Вихідний у Кіото</h1>
945
+
<h1>Вихідний день у Кіото</h1>
950
946
<AddTask />
951
947
<TaskList />
952
948
</TasksProvider>
@@ -1003,7 +999,7 @@ function tasksReducer(tasks, action) {
1003
999
}
1004
1000
1005
1001
const initialTasks = [
1006
-
{ id: 0, text: 'Шлях філософів', done: true },
1002
+
{ id: 0, text: 'Шлях філософа', done: true },
1007
1003
{ id: 1, text: 'Відвідати Храм', done: false },
1008
1004
{ id: 2, text: 'Випити матчу', done: false }
1009
1005
];
@@ -1019,7 +1015,7 @@ export default function AddTask() {
1019
1015
return (
1020
1016
<>
1021
1017
<input
1022
-
placeholder="Додати задачу"
1018
+
placeholder="Додати завдання"
1023
1019
value={text}
1024
1020
onChange={e => setText(e.target.value)}
1025
1021
/>
@@ -1144,7 +1140,7 @@ const tasks = useTasks();
1144
1140
const dispatch = useTasksDispatch();
1145
1141
```
1146
1142
1147
-
**Це не змінює функціональність, але дозволяє згодом розділити контексти або додати логіку. Тепер усі налаштування контексту та ред'юсера знаходяться у файлі `TasksContext.js`. Це допомагає зберегти компоненти чистими і не перевантаженими, зосередженими на відображенні даних, а не на їх отриманні.**
1143
+
**Це не змінює функціональність, але дає змогу згодом розділити контексти або додати логіку. Тепер усі налаштування контексту та редюсера знаходяться у файлі `TasksContext.js`. Це допомагає зберегти компоненти чистими і не перевантаженими, зосередженими на відображенні даних, а не на їх отриманні.**
1148
1144
1149
1145
<Sandpack>
1150
1146
@@ -1156,7 +1152,7 @@ import { TasksProvider } from './TasksContext.js';
1156
1152
export default function TaskApp() {
1157
1153
return (
1158
1154
<TasksProvider>
1159
-
<h1>Вихідний у Кіото</h1>
1155
+
<h1>Вихідний день у Кіото</h1>
1160
1156
<AddTask />
1161
1157
<TaskList />
1162
1158
</TasksProvider>
@@ -1222,7 +1218,7 @@ function tasksReducer(tasks, action) {
1222
1218
}
1223
1219
1224
1220
const initialTasks = [
1225
-
{ id: 0, text: 'Шлях філософів', done: true },
1221
+
{ id: 0, text: 'Шлях філософа', done: true },
1226
1222
{ id: 1, text: 'Відвідати Храм', done: false },
1227
1223
{ id: 2, text: 'Випити матчу', done: false }
1228
1224
];
@@ -1238,7 +1234,7 @@ export default function AddTask() {
Функції на кшталт `useTasks` та `useTasksDispatch` називаються *[Хуками користувача](/learn/reusing-logic-with-custom-hooks)*. Ваша функція вважається хуком користувача, якщо її назва починається з `use`. Це дозволяє використовувати інші хуки, як-от `useContext`, всередині неї.
1347
+
Функції на кшталт `useTasks` та `useTasksDispatch` називаються *[Хуками користувача](/learn/reusing-logic-with-custom-hooks)*. Ваша функція вважається хуком користувача, якщо її назва починається з `use`. Це дає змогу використовувати інші хуки, як-от `useContext`, всередині неї.
1352
1348
1353
1349
</Note>
1354
1350
1355
-
Коли додаток зростає, у вас може з’явитися багато пар контекст-ред'юсерів. Це потужний спосіб масштабувати додаток і [ділитися станом](/learn/sharing-state-between-components) без зайвих зусиль щоразу, коли потрібно отримати дані з глибини дерева компонентів.
1351
+
Коли додаток зростає, у вас може з’явитися багато пар контекст-редюсерів. Це потужний спосіб масштабувати додаток і [ділитися станом](/learn/sharing-state-between-components) без зайвих зусиль щоразу, коли потрібно отримати дані з глибини дерева компонентів.
1356
1352
1357
1353
<Recap>
1358
1354
1359
-
- Ви можете об'єднати ред'юсер з контекстом, щоб будь-який компонент міг мати доступ та оновлювати стан у компонентах вищих за ієрархією.
1355
+
- Ви можете об'єднати редюсер з контекстом, щоб будь-який компонент міг мати доступ та оновлювати стан у компонентах вищих за ієрархією.
1360
1356
- Щоб надати стан і функцію `dispatch` компонентам нижче:
1361
1357
1. Створіть два контексти (для стану і для функцій `dispatch`).
1362
-
2. Надайте обидва контексти компоненту, який використовує ред'юсер.
1358
+
2. Надайте обидва контексти компоненту, який використовує редюсер.
1363
1359
3. Використовуйте будь-який контекст у компонентах, яким потрібно мати ці дані.
1364
1360
- Щоб ще більше спростити компоненти, виносьте ці налаштування в один файл.
1365
1361
- Експортуйте компонент, наприклад `TasksProvider`, який надає контекст.
1366
1362
- Ви також можете експортувати користувацькі хуки, як-от `useTasks` та `useTasksDispatch`, для доступу до контексту.
1367
-
- У додатку може бути багато схожих на цю пар контекст-ред'юсерів.
1363
+
- У додатку може бути багато схожих на цю пар контекст-редюсерів.
0 commit comments