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/sharing-state-between-components.md
+32-30
Original file line number
Diff line number
Diff line change
@@ -1,31 +1,31 @@
1
1
---
2
-
title: Спільний доступ до стану між компонентами
2
+
title: Поширення стану між компонентами
3
3
---
4
4
5
5
<Intro>
6
6
7
-
Іноді вам потрібно, щоб стан двох компонент завжди змінювався разом. Щоб так зробити, видаліть стан з обох компонент, перенесіть його до їхнього найближчого спільного батька та потім передайте стан вниз до них завдяки пропсам. Це відоме як *підняття стану вгору* і це одна з найпоширеніших речей, які ви будете робити під час написання Reactкоду.
7
+
Іноді вам потрібно, щоб стан двох компонентів завжди змінювався разом. Для цього видаліть стан з обох компонентів, перенесіть його до їхнього найближчого спільного батьківського компонента і потім передайте вниз до них через пропси. Це називається *підняттям стану вгору (lifting state up)*, і це одна з найпоширеніших речей, які ви будете робити під час написання React-коду.
8
8
9
9
</Intro>
10
10
11
11
<YouWillLearn>
12
12
13
-
- Як поширювати стан між компонент підняттям його вгору
14
-
- Що таке контрольовані та не контрольовані компоненти
13
+
- Як поширювати стан між компонентами підняттям його вгору
14
+
- Що таке контрольовані та неконтрольовані компоненти
15
15
16
16
</YouWillLearn>
17
17
18
18
## Підняття стану на прикладі {/*lifting-state-up-by-example*/}
19
19
20
-
В цьому прикладі, батьківський компонент `Accordion` рендерить дві окремі`Panel`:
20
+
У цьому прикладі батьківський компонент `Accordion` рендерить два окремих компонента-панелі`Panel`:
21
21
22
22
*`Accordion`
23
23
-`Panel`
24
24
-`Panel`
25
25
26
-
Кожний `Panel`компонент має булевий `isActive` стан, що визначає чи його вміст видимий.
26
+
Кожний компонент `Panel` має булевий стан `isActive`, який визначає, чи його вміст видимий.
27
27
28
-
Натисніть кнопку Показати для обох панелей:
28
+
Натисніть кнопку "Показати" для обох панелей:
29
29
30
30
<Sandpack>
31
31
@@ -53,10 +53,10 @@ export default function Accordion() {
53
53
<>
54
54
<h2>Алмати, Казахстан</h2>
55
55
<Panel title="Про Алмати">
56
-
Із населенням близько 2 мільйонів, Алмати є найбільшим містом в Казахстані. З 1929по1997, воно було його столицею.
56
+
З майже 2-мільйонним населеннм Алмати є найбільшим містом в Казахстані. З 1929до1997 воно було його столицею.
57
57
</Panel>
58
58
<Panel title="Етимологія">
59
-
Назва походить від казахського слова <span lang="kk-KZ">алма</span>, що означає "яблуко" і часто перекладалось як "повний яблук". Насправді, регіон що оточує Алмати вважається прабатьківщиною яблука, і дика <i lang="la">Malus sieversii</i>вважається ймовірним кандидатом на предка сучасного домашнього яблука.
59
+
Назва походить від казахського слова <span lang="kk-KZ">алма</span>, що означає "яблуко" і часто перекладалось як "повний яблук". Насправді регіон, який оточує Алмати вважається прабатьківщиною яблука, а дика <i lang="la">Malus sieversii</i>- ймовірним кандидатом на предка сучасного домашнього яблука.
60
60
</Panel>
61
61
</>
62
62
);
@@ -73,37 +73,37 @@ h3, p { margin: 5px 0px; }
73
73
74
74
</Sandpack>
75
75
76
-
Зверніть увагу, що натискання кнопки однієї панелі не впливає на іншу панель--вони незалежні.
76
+
Зверніть увагу, що натискання кнопки однієї панелі не впливає на іншу панель -- вони незалежні.
77
77
78
78
<DiagramGroup>
79
79
80
-
<Diagramname="sharing_state_child"height={367}width={477}alt="Діаграма показує дерево з трьох компонент, один батько з назвою Accordion і два дочірні компоненти з назвами Panel. Обидва компоненти Panel містять isActive зі значенням false.">
80
+
<Diagramname="sharing_state_child"height={367}width={477}alt="Діаграма показує дерево з трьох компонентів, один батьківський із міткою Accordion і два дочірні з мітками Panel. Обидва компоненти Panel містять isActive зі значенням false.">
81
81
82
-
Спочатку стан `isActive`кожної`Panel` дорівнює `false`, тому вони обидві виглядають згорнутими
82
+
Спочатку стан `isActive`кожного`Panel` дорівнює `false`, тому обидва мають згорнутий вигляд
83
83
84
84
</Diagram>
85
85
86
-
<Diagramname="sharing_state_child_clicked"height={367}width={480}alt="Та сама діаграма, що й попередня, з виділеним isActive першого дочірнього компонента Panel, що вказує на клік зі значенням isActive, встановленим у true. Другий компонент Panel все ще містить значення false." >
86
+
<Diagramname="sharing_state_child_clicked"height={367}width={480}alt="Та сама діаграма, що й попередня, з виділеним isActive першого дочірнього компонента Panel, що вказує на натискання зі значенням isActive, встановленим у true. Другий компонент Panel все ще містить значення false." >
87
87
88
-
Натискання на будь-яку з кнопок `Panel` призведе до оновлення стану `isActive` тільки цієї `Panel`.
88
+
Натискання на будь-яку з кнопок `Panel` призведе до оновлення стану `isActive` тільки цієї `Panel`
89
89
90
90
</Diagram>
91
91
92
92
</DiagramGroup>
93
93
94
-
**Але тепер припустимо, що ви хочете змінити це так, щоб тільки одна панель була розгорнути в будь-який момент часу.**При такому дизайні, розгортання другої панелі повинно згорнути першу. Як би ви це зробили?
94
+
**Але тепер припустимо, що ви хочете змінити це так, щоб тільки одна панель була розгорнута в будь-який момент часу.**За цього дизайну розгортання другої панелі повинно згорнути першу. Як би ви це зробили?
95
95
96
96
Щоб скоординувати ці дві панелі, вам потрібно "підняти їхній стан вгору" до батьківського компонента в три кроки:
97
97
98
-
1.**Видалити** стан із дочірніх компонент.
99
-
2.**Передати**жорсткокодовані дані від спільного батька.
98
+
1.**Видалити** стан із дочірніх компонентів.
99
+
2.**Передати**незмінні дані від спільного батьківського компонента.
100
100
3.**Додати** стан до спільного батька і передати його вниз разом з обробниками подій.
101
101
102
-
Це дозволить компоненту `Accordion`скоординувати обидві `Panel` та розгортати тільки одну на раз.
102
+
Це дасть компоненту `Accordion` змогу скоординувати обидва компоненти `Panel` та розгортати тільки один щоразу.
103
103
104
-
### Крок 1: Видаліть стан з дочірніх компонент {/*step-1-remove-state-from-the-child-components*/}
104
+
### Крок 1: Видаліть стан із дочірніх компонентів {/*step-1-remove-state-from-the-child-components*/}
105
105
106
-
Ви передасте контроль `isActive``Panel`до її батьківської компоненти. Це означає що батьківський компоненнт передасть `isActive`до`Panel` як проп. Почніть з**видалення цього рядка** з `Panel` компонента:
106
+
Ви передасте контроль `isActive`компонента `Panel`його батьківському компоненту. Це означає, що батьківський компонент передасть `isActive`дочірньому`Panel` як проп. Почніть із**видалення цього рядка** з `Panel`:
Тепер батьківський компонент `Panel` може *контролювати* `isActive`, [передаючи його як проп.](/learn/passing-props-to-a-component) І навпаки,`Panel`компонент тепер *не має контролю* над значенням `isActive`-- тепер це залежить від батьківського компонента!
118
+
Тепер батьківський компонент `Panel` може *контролювати* `isActive`, [передаючи його як проп.](/learn/passing-props-to-a-component) І навпаки:`Panel` тепер *не має контролю* над значенням `isActive`-- тепер це залежить від батьківського компонента!
119
119
120
-
### Крок 2: Передайте жорсткокодовані дані з батьківського компонента {/*step-2-pass-hardcoded-data-from-the-common-parent*/}
120
+
### Крок 2: Передайте незмінні дані від спільного батьківського компонента {/*step-2-pass-hardcoded-data-from-the-common-parent*/}
121
121
122
-
Щоб підняти стан вгору, ви повинні виявити найближчий спільний батьківський компонент *обох* дочірніх компонент, які ви хочете скоординувати:
122
+
Щоб підняти стан вгору, ви повинні виявити найближчий спільний батьківський компонент *обох* дочірніх компонентів, які ви хочете скоординувати:
123
123
124
124
* `Accordion` *(найближчий спільний батько)*
125
125
- `Panel`
126
126
- `Panel`
127
127
128
-
У цьому прикладі, компонент `Accordion`. Оскільки він знаходиться над обома панелями і може контролювати їхні пропси, це стане "джерелом правди" для визначення, яка панель є відкритою на даний момент. Зробіть так щоб компонент `Accordion` передавав жорсткокодоване значення `isActive` (наприклад, `true`) до обидвох панелей:
128
+
У цьому прикладі ним є компонент `Accordion`. Оскільки він знаходиться над обома панелями і може контролювати їхні пропси, він стане "джерелом правди" для визначення того, яка панель є наразі відкритою. Зробіть так, щоб компонент `Accordion` передавав незмінне значення `isActive` (наприклад, `true`) до обох панелей:
129
129
130
130
<Sandpack>
131
131
@@ -135,12 +135,12 @@ import { useState } from 'react';
135
135
exportdefaultfunctionAccordion() {
136
136
return (
137
137
<>
138
-
<h2>Алмати, Казахстан</h2>
138
+
<h2>Алмати, Казахстан</h2>
139
139
<Panel title="Про Алмати" isActive={true}>
140
-
Із населенням близько 2 мільйонів, Алмати є найбільшим містом в Казахстані. З 1929по1997, воно було його столицею.
140
+
З майже 2-мільйонним населеннм Алмати є найбільшим містом в Казахстані. З 1929до1997 воно було його столицею.
141
141
</Panel>
142
142
<Panel title="Етимологія" isActive={true}>
143
-
Назва походить від казахського слова <span lang="kk-KZ">алма</span>, що означає "яблуко" і часто перекладалось як "повний яблук". Насправді, регіон що оточує Алмати вважається прабатьківщиною яблука, і дика <i lang="la">Malus sieversii</i>вважається ймовірним кандидатом на предка сучасного домашнього яблука.
143
+
Назва походить від казахського слова <span lang="kk-KZ">алма</span>, що означає "яблуко" і часто перекладалось як "повний яблук". Насправді регіон, який оточує Алмати вважається прабатьківщиною яблука, а дика <i lang="la">Malus sieversii</i>- ймовірним кандидатом на предка сучасного домашнього яблука.
144
144
</Panel>
145
145
</>
146
146
);
@@ -183,6 +183,7 @@ h3, p { margin: 5px 0px; }
183
183
```js
184
184
const [activeIndex, setActiveIndex] =useState(0);
185
185
```
186
+
186
187
Коли `activeIndex` доорівнює `0`, перша панель буде відкритою і коли це значення дорівнює `1`, активною буде друга.
187
188
188
189
Натискаючи "Показати" кнопку в одній із `Panel` має змінити активний індекс в `Accordion`. `Panel` не може встановлювати `activeIndex` стан безпосередньо, оскільки це визанчається всередині `Accordion`. Компонент `Accordion` повинен *явно дозволити* компоненту `Panel` змінювати свій стан за допомогою [передавання обробника подій вниз як проп](/learn/responding-to-events#passing-event-handlers-as-props):
Кнопка `<button>` всередині `Panel` тепер буде використовувати `onShow` проп як обробник події кліку:
207
209
208
210
<Sandpack>
@@ -214,20 +216,20 @@ export default function Accordion() {
214
216
const [activeIndex, setActiveIndex] =useState(0);
215
217
return (
216
218
<>
217
-
<h2>Алмати, Казахстан</h2>
219
+
<h2>Алмати, Казахстан</h2>
218
220
<Panel
219
221
title="Про Алмати"
220
222
isActive={activeIndex ===0}
221
223
onShow={() =>setActiveIndex(0)}
222
224
>
223
-
Із населенням близько 2 мільйонів, Алмати є найбільшим містом в Казахстані. З 1929по1997, воно було його столицею.
225
+
З майже 2-мільйонним населеннм Алмати є найбільшим містом в Казахстані. З 1929до1997 воно було його столицею.
224
226
</Panel>
225
227
<Panel
226
228
title="Етимологія"
227
229
isActive={activeIndex ===1}
228
230
onShow={() =>setActiveIndex(1)}
229
231
>
230
-
Назва походить від казахського слова <span lang="kk-KZ">алма</span>, що означає "яблуко" і часто перекладалось як "повний яблук". Насправді, регіон що оточує Алмати вважається прабатьківщиною яблука, і дика <i lang="la">Malus sieversii</i>вважається ймовірним кандидатом на предка сучасного домашнього яблука.
232
+
Назва походить від казахського слова <span lang="kk-KZ">алма</span>, що означає "яблуко" і часто перекладалось як "повний яблук". Насправді регіон, який оточує Алмати вважається прабатьківщиною яблука, а дика <i lang="la">Malus sieversii</i>- ймовірним кандидатом на предка сучасного домашнього яблука.
0 commit comments