Skip to content

Commit fac0204

Browse files
committed
Apply suggestions from code review
1 parent e167e97 commit fac0204

File tree

1 file changed

+38
-42
lines changed

1 file changed

+38
-42
lines changed

src/content/learn/scaling-up-with-reducer-and-context.md

Lines changed: 38 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
---
2-
title: Масштабування з використанням контексту та ред'юсера
2+
title: Масштабування з використанням контексту та редюсера
33
---
44

55
<Intro>
66

7-
Ред'юсери дозволяють об'єднати логіку оновлення стану компонента. Контекст дозволяє передавати інформацію у глибину до інших компонентів. Ви можете поєднати ред'юсери і контекст, щоб управляти станом складного інтерфейсу.
7+
Редюсери дають змогу об'єднати логіку оновлення стану компонента. Контекст дає змогу передавати інформацію у глибину до інших компонентів. Можна поєднати редюсери і контекст, щоб управляти станом складного інтерфейсу.
88

99
</Intro>
1010

1111
<YouWillLearn>
1212

13-
* Як поєднати ред'юсер з контекстом
13+
* Як поєднати з контекстом
1414
* Як уникнути передачі стану та диспатча через пропси
1515
* Як зберігати логіку контексту і стану в окремому файлі
1616

1717
</YouWillLearn>
1818

19-
## Поєднання ред'юсера з контекстом {/*combining-a-reducer-with-context*/}
19+
## Поєднання редюсера з контекстом {/*combining-a-reducer-with-context*/}
2020

21-
Як ми вже бачили, у прикладі з [цього розділу](/learn/extracting-state-logic-into-a-reducer), стан керується ред'юсером. Функція ред'юсера містить всю логіку оновлення стану і оголошена в кінці файлу:
21+
Як ми вже бачили, у прикладі з [цього розділу](/learn/extracting-state-logic-into-a-reducer), стан керується редюсером. Функція редюсера містить всю логіку оновлення стану і оголошена в кінці файлу:
2222

2323
<Sandpack>
2424

@@ -57,7 +57,7 @@ export default function TaskApp() {
5757

5858
return (
5959
<>
60-
<h1>Вихідний у Кіото</h1>
60+
<h1>Вихідний день у Кіото</h1>
6161
<AddTask
6262
onAddTask={handleAddTask}
6363
/>
@@ -99,7 +99,7 @@ function tasksReducer(tasks, action) {
9999

100100
let nextId = 3;
101101
const initialTasks = [
102-
{ id: 0, text: 'Шлях філософів', done: true },
102+
{ id: 0, text: 'Шлях філософа', done: true },
103103
{ id: 1, text: 'Відвідати храм', done: false },
104104
{ id: 2, text: 'Випити матчу', done: false }
105105
];
@@ -113,7 +113,7 @@ export default function AddTask({ onAddTask }) {
113113
return (
114114
<>
115115
<input
116-
placeholder="Додати задачу"
116+
placeholder="Додати завдання"
117117
value={text}
118118
onChange={e => setText(e.target.value)}
119119
/>
@@ -207,19 +207,15 @@ ul, li { margin: 0; padding: 0; }
207207

208208
</Sandpack>
209209

210-
Ред'юсер допомагає тримати обробники подій короткими і зрозумілими. Проте, з розвитком вашого додатка може виникнути проблема. **Наразі стан `tasks` та функція `dispatch` доступні тільки в компоненті `TaskApp` на верхньому рівні.** Щоб інші компоненти могли отримувати та оновлювати перелік завдань, потрібно явно [передавати](#passing-props-to-a-component) пропсами поточний стан і обробники подій.
210+
Редюсер допомагає тримати обробники подій короткими і зрозумілими. Проте, з розвитком вашого додатка може виникнути проблема. **Наразі стан `tasks` та функція `dispatch` доступні тільки в компоненті `TaskApp` на верхньому рівні.** Щоб інші компоненти могли отримувати та оновлювати перелік завдань, потрібно явно [передавати](#passing-props-to-a-component) пропсами поточний стан і обробники подій.
211211

212212
Наприклад, `TaskApp` передає перелік завдань і обробники подій компоненту `TaskList`:
213213

214214
```jsx
215215
<TaskList tasks={tasks} dispatch={dispatch} />
216-
217-
218216
```js
219217
<TaskList
220-
tasks={tasks}
221-
onChangeTask={handleChangeTask}
222-
onDeleteTask={handleDeleteTask}
218+
tasks={tasks} onChangeTask={handleChangeTask} onDeleteTask={handleDeleteTask}
223219
/>
224220
```
225221

@@ -237,15 +233,15 @@ ul, li { margin: 0; padding: 0; }
237233

238234
Тому, як альтернатива передачі через пропси, ви можете помістити і стан `tasks`, і функцію `dispatch` [в контекст](/learn/passing-data-deeply-with-context). **Таким чином, будь-який компонент, що знаходиться нижче `TaskApp` у дереві, може мати доступ та надсилати події, уникнувши передачі пропсів через безліч компонентів.**
239235

240-
Ось як можна поєднати ред'юсер із контекстом:
236+
Ось як можна поєднати редюсер із контекстом:
241237

242238
1. **Створіть** контекст.
243239
2. **Розмістіть** стан і диспетчер у контексті.
244240
3. **Використовуйте** контекст будь-де в дереві компонентів.
245241

246242
### Крок 1: Створення контексту {/*step-1-create-the-context*/}
247243

248-
Хук `useReducer` повертає поточний стан `tasks` та функцію `dispatch`, яка дозволяє оновлювати цей стан:
244+
Хук `useReducer` повертає поточний стан `tasks` та функцію `dispatch`, яка дає змогу оновлювати цей стан:
249245

250246
```js
251247
const [tasks, dispatch] = useReducer(tasksReducer, initialTasks);
@@ -254,7 +250,7 @@ const [tasks, dispatch] = useReducer(tasksReducer, initialTasks);
254250
Щоб передати їх далі по дереву, [створить](/learn/passing-data-deeply-with-context#step-2-use-the-context) два окремих контексти:
255251

256252
- `TasksContext` надає поточний перелік завдань.
257-
- `TasksDispatchContext` надає функцію, яка дозволяє компонентам надсилати події.
253+
- `TasksDispatchContext` надає функцію, яка дає змогу компонентам надсилати події.
258254

259255
Експортуйте їх з окремого файлу, щоб згодом імпортувати в інших місцях:
260256

@@ -295,7 +291,7 @@ export default function TaskApp() {
295291
296292
return (
297293
<>
298-
<h1>Вихідний у Кіото</h1>
294+
<h1>Вихідний день у Кіото</h1>
299295
<AddTask
300296
onAddTask={handleAddTask}
301297
/>
@@ -337,7 +333,7 @@ function tasksReducer(tasks, action) {
337333
338334
let nextId = 3;
339335
const initialTasks = [
340-
{ id: 0, text: 'Шлях філософів', done: true },
336+
{ id: 0, text: 'Шлях філософа', done: true },
341337
{ id: 1, text: 'Відвідати Храм', done: false },
342338
{ id: 2, text: 'Випити матчу', done: false }
343339
];
@@ -358,7 +354,7 @@ export default function AddTask({ onAddTask }) {
358354
return (
359355
<>
360356
<input
361-
placeholder="Додати задачу"
357+
placeholder="Додати завдання"
362358
value={text}
363359
onChange={e => setText(e.target.value)}
364360
/>
@@ -515,7 +511,7 @@ export default function TaskApp() {
515511
return (
516512
<TasksContext.Provider value={tasks}>
517513
<TasksDispatchContext.Provider value={dispatch}>
518-
<h1>Вихідний у Кіото</h1>
514+
<h1>Вихідний день у Кіото</h1>
519515
<AddTask
520516
onAddTask={handleAddTask}
521517
/>
@@ -558,7 +554,7 @@ function tasksReducer(tasks, action) {
558554
559555
let nextId = 3;
560556
const initialTasks = [
561-
{ id: 0, text: 'Шлях філософів', done: true },
557+
{ id: 0, text: 'Шлях філософа', done: true },
562558
{ id: 1, text: 'Відвідати Храм', done: false },
563559
{ id: 2, text: 'Випити матчу', done: false }
564560
];
@@ -579,7 +575,7 @@ export default function AddTask({ onAddTask }) {
579575
return (
580576
<>
581577
<input
582-
placeholder="Додати задачу"
578+
placeholder="Додати завдання"
583579
value={text}
584580
onChange={e => setText(e.target.value)}
585581
/>
@@ -682,7 +678,7 @@ ul, li { margin: 0; padding: 0; }
682678
```js {4-5}
683679
<TasksContext.Provider value={tasks}>
684680
<TasksDispatchContext.Provider value={dispatch}>
685-
<h1>Вихідний у Кіото</h1>
681+
<h1>Вихідний день у Кіото</h1>
686682
<AddTask />
687683
<TaskList />
688684
</TasksDispatchContext.Provider>
@@ -736,7 +732,7 @@ export default function TaskApp() {
736732
return (
737733
<TasksContext.Provider value={tasks}>
738734
<TasksDispatchContext.Provider value={dispatch}>
739-
<h1>Вихідний у Кіото</h1>
735+
<h1>Вихідний день у Кіото</h1>
740736
<AddTask />
741737
<TaskList />
742738
</TasksDispatchContext.Provider>
@@ -772,7 +768,7 @@ function tasksReducer(tasks, action) {
772768
}
773769
774770
const initialTasks = [
775-
{ id: 0, text: 'Шлях філософів', done: true },
771+
{ id: 0, text: 'Шлях філософа', done: true },
776772
{ id: 1, text: 'Відвідати Храм', done: false },
777773
{ id: 2, text: 'Випити матчу', done: false }
778774
];
@@ -795,7 +791,7 @@ export default function AddTask() {
795791
return (
796792
<>
797793
<input
798-
placeholder="Додати задачу"
794+
placeholder="Додати завдання"
799795
value={text}
800796
onChange={e => setText(e.target.value)}
801797
/>
@@ -905,7 +901,7 @@ ul, li { margin: 0; padding: 0; }
905901

906902
## Переміщення всієї логіки в один файл {/*moving-all-wiring-into-a-single-file*/}
907903

908-
Це не обов'язково, але ви можете ще більше спростити компоненти, перемістивши і ред'юсер, і контекст в один файл. Наразі `TasksContext.js` містить лише два оголошення контексту:
904+
Це не обов'язково, але ви можете ще більше спростити компоненти, перемістивши і редюсер, і контекст в один файл. Наразі `TasksContext.js` містить лише два оголошення контексту:
909905
910906
```js
911907
import { createContext } from 'react';
@@ -914,9 +910,9 @@ export const TasksContext = createContext(null);
914910
export const TasksDispatchContext = createContext(null);
915911
```
916912
917-
Цей файл скоро стане більш наповненим! Додамо в нього ред'юсер. Потім оголосимо новий компонент `TasksProvider`. Цей компонент об’єднає всі частини разом. Він:
913+
Цей файл скоро стане більш наповненим! Додамо в нього редюсер. Потім оголосимо новий компонент `TasksProvider`. Цей компонент об’єднає всі частини разом. Він:
918914
919-
1. Керуватиме станом за допомогою ред'юсера.
915+
1. Керуватиме станом за допомогою редюсера.
920916
2. Надаватиме обидва контексти компонентам нижчим в ієрархії.
921917
3. [Прийматиме `children` як пропс](/learn/passing-props-to-a-component#passing-jsx-as-children), щоб було можливим передавати в нього JSX.
922918
@@ -946,7 +942,7 @@ import { TasksProvider } from './TasksContext.js';
946942
export default function TaskApp() {
947943
return (
948944
<TasksProvider>
949-
<h1>Вихідний у Кіото</h1>
945+
<h1>Вихідний день у Кіото</h1>
950946
<AddTask />
951947
<TaskList />
952948
</TasksProvider>
@@ -1003,7 +999,7 @@ function tasksReducer(tasks, action) {
1003999
}
10041000
10051001
const initialTasks = [
1006-
{ id: 0, text: 'Шлях філософів', done: true },
1002+
{ id: 0, text: 'Шлях філософа', done: true },
10071003
{ id: 1, text: 'Відвідати Храм', done: false },
10081004
{ id: 2, text: 'Випити матчу', done: false }
10091005
];
@@ -1019,7 +1015,7 @@ export default function AddTask() {
10191015
return (
10201016
<>
10211017
<input
1022-
placeholder="Додати задачу"
1018+
placeholder="Додати завдання"
10231019
value={text}
10241020
onChange={e => setText(e.target.value)}
10251021
/>
@@ -1144,7 +1140,7 @@ const tasks = useTasks();
11441140
const dispatch = useTasksDispatch();
11451141
```
11461142
1147-
**Це не змінює функціональність, але дозволяє згодом розділити контексти або додати логіку. Тепер усі налаштування контексту та ред'юсера знаходяться у файлі `TasksContext.js`. Це допомагає зберегти компоненти чистими і не перевантаженими, зосередженими на відображенні даних, а не на їх отриманні.**
1143+
**Це не змінює функціональність, але дає змогу згодом розділити контексти або додати логіку. Тепер усі налаштування контексту та редюсера знаходяться у файлі `TasksContext.js`. Це допомагає зберегти компоненти чистими і не перевантаженими, зосередженими на відображенні даних, а не на їх отриманні.**
11481144
11491145
<Sandpack>
11501146
@@ -1156,7 +1152,7 @@ import { TasksProvider } from './TasksContext.js';
11561152
export default function TaskApp() {
11571153
return (
11581154
<TasksProvider>
1159-
<h1>Вихідний у Кіото</h1>
1155+
<h1>Вихідний день у Кіото</h1>
11601156
<AddTask />
11611157
<TaskList />
11621158
</TasksProvider>
@@ -1222,7 +1218,7 @@ function tasksReducer(tasks, action) {
12221218
}
12231219
12241220
const initialTasks = [
1225-
{ id: 0, text: 'Шлях філософів', done: true },
1221+
{ id: 0, text: 'Шлях філософа', done: true },
12261222
{ id: 1, text: 'Відвідати Храм', done: false },
12271223
{ id: 2, text: 'Випити матчу', done: false }
12281224
];
@@ -1238,7 +1234,7 @@ export default function AddTask() {
12381234
return (
12391235
<>
12401236
<input
1241-
placeholder="Додати задачу"
1237+
placeholder="Додати завдання"
12421238
value={text}
12431239
onChange={e => setText(e.target.value)}
12441240
/>
@@ -1348,23 +1344,23 @@ ul, li { margin: 0; padding: 0; }
13481344
13491345
<Note>
13501346
1351-
Функції на кшталт `useTasks` та `useTasksDispatch` називаються *[Хуками користувача](/learn/reusing-logic-with-custom-hooks)*. Ваша функція вважається хуком користувача, якщо її назва починається з `use`. Це дозволяє використовувати інші хуки, як-от `useContext`, всередині неї.
1347+
Функції на кшталт `useTasks` та `useTasksDispatch` називаються *[Хуками користувача](/learn/reusing-logic-with-custom-hooks)*. Ваша функція вважається хуком користувача, якщо її назва починається з `use`. Це дає змогу використовувати інші хуки, як-от `useContext`, всередині неї.
13521348
13531349
</Note>
13541350
1355-
Коли додаток зростає, у вас може з’явитися багато пар контекст-ред'юсерів. Це потужний спосіб масштабувати додаток і [ділитися станом](/learn/sharing-state-between-components) без зайвих зусиль щоразу, коли потрібно отримати дані з глибини дерева компонентів.
1351+
Коли додаток зростає, у вас може з’явитися багато пар контекст-редюсерів. Це потужний спосіб масштабувати додаток і [ділитися станом](/learn/sharing-state-between-components) без зайвих зусиль щоразу, коли потрібно отримати дані з глибини дерева компонентів.
13561352
13571353
<Recap>
13581354
1359-
- Ви можете об'єднати ред'юсер з контекстом, щоб будь-який компонент міг мати доступ та оновлювати стан у компонентах вищих за ієрархією.
1355+
- Ви можете об'єднати редюсер з контекстом, щоб будь-який компонент міг мати доступ та оновлювати стан у компонентах вищих за ієрархією.
13601356
- Щоб надати стан і функцію `dispatch` компонентам нижче:
13611357
1. Створіть два контексти (для стану і для функцій `dispatch`).
1362-
2. Надайте обидва контексти компоненту, який використовує ред'юсер.
1358+
2. Надайте обидва контексти компоненту, який використовує редюсер.
13631359
3. Використовуйте будь-який контекст у компонентах, яким потрібно мати ці дані.
13641360
- Щоб ще більше спростити компоненти, виносьте ці налаштування в один файл.
13651361
- Експортуйте компонент, наприклад `TasksProvider`, який надає контекст.
13661362
- Ви також можете експортувати користувацькі хуки, як-от `useTasks` та `useTasksDispatch`, для доступу до контексту.
1367-
- У додатку може бути багато схожих на цю пар контекст-ред'юсерів.
1363+
- У додатку може бути багато схожих на цю пар контекст-редюсерів.
13681364

13691365
</Recap>
13701366

0 commit comments

Comments
 (0)