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/reference/react/useId.md
+38-39Lines changed: 38 additions & 39 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ title: useId
4
4
5
5
<Intro>
6
6
7
-
`useId` — це хук для генерації унікальних ID, які можуть передаватись як атрибути доступності.
7
+
`useId` — це хук для генерації унікальних ідентифікаторів (_далі_ — ID), які можуть передаватися як атрибути доступності.
8
8
9
9
```js
10
10
constid=useId()
@@ -16,11 +16,11 @@ const id = useId()
16
16
17
17
---
18
18
19
-
## Референс {/*reference*/}
19
+
## Опис {/*reference*/}
20
20
21
21
### `useId()` {/*useid*/}
22
22
23
-
Викликайте`useId` на верхньому рівні вашого компонента, щоб згенерувати унікальне ID:
23
+
Викличте`useId` на верхньому рівні вашого компонента, щоб згенерувати унікальне ID:
24
24
25
25
```js
26
26
import { useId } from'react';
@@ -34,34 +34,33 @@ function PasswordField() {
34
34
35
35
#### Параметри {/*parameters*/}
36
36
37
-
`useId` не приймає ніяких параметрів.
37
+
`useId` не приймає жодних параметрів.
38
38
39
39
#### Результат {/*returns*/}
40
40
41
-
`useId` повертає унікальну ID строку, пов'язану з конкретним запитом `useId` в цьому конкретному компоненті.
41
+
`useId` повертає унікальну ID-стрічку, пов'язану з конкретним запитом `useId` в цьому конкретному компоненті.
42
42
43
43
#### Застереження {/*caveats*/}
44
44
45
-
* `useId` — це хук, тож він може викликатись тільки **на верхньому рівні вашого компонента** або у вашому власному хуці. Ви не можете викликати його в циклах або умовах. Якщо ж є така потреба, то витягніть новий компонент та перемістіть в нього стан.
45
+
* `useId` — це хук, тож він може викликатися тільки **на верхньому рівні вашого компонента** або у ваших власних хуках. Ви не можете викликати його в циклах або умовно. Якщо ж є така потреба, то виокреміть новий компонент та перемістіть у нього стан.
46
46
47
-
* `useId` **не повинно використовуватись для генерації ключів** у списках. [Ключі повинні генеруватись з ваших даних.](/learn/rendering-lists#where-to-get-your-key)
47
+
* `useId` **не має використовуватися для генерації ключів** у списках. [Ключі мають генеруватися з ваших даних.](/learn/rendering-lists#where-to-get-your-key)
48
48
49
-
* `useId` наразі не може бути використано в [async Server Components](/reference/rsc/server-components#async-components-with-server-components).
49
+
* `useId` наразі не може бути використано в [асинхронних серверних компонентах](/reference/rsc/server-components#async-components-with-server-components).
50
50
51
51
---
52
52
53
53
## Використання {/*usage*/}
54
54
55
55
<Pitfall>
56
56
57
-
**Не викликайте `useId` для генерації ключів у списку.** [Ключі повинні генеруватись з ваших даних.](/learn/rendering-lists#where-to-get-your-key)
58
-
57
+
**Не викликайте `useId` для генерації ключів у списку.** [Ключі мають генеруватися з ваших даних.](/learn/rendering-lists#where-to-get-your-key)
59
58
60
59
</Pitfall>
61
60
62
61
### Генерація унікальних ID для атрибутів доступності {/*generating-unique-ids-for-accessibility-attributes*/}
63
62
64
-
Викликайте`useId` на верхньому рівні вашої компоненти для генерації унікального ID:
63
+
Викличте`useId` на верхньому рівні вашого компонента для генерації унікального ID:
65
64
66
65
```js [[1, 4, "passwordHintId"]]
67
66
import { useId } from'react';
@@ -71,7 +70,7 @@ function PasswordField() {
71
70
// ...
72
71
```
73
72
74
-
Далі ви можете передати <CodeStep step={1}>Згеренрувати ID</CodeStep> до різних атрибутів:
73
+
Далі ви можете передати <CodeStep step={1}>згенерований ID</CodeStep> до різних атрибутів:
**Розглянемо приклади, коли це може бути корисно.**
84
83
85
-
[Атрибути доступності HTML](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) такі як [`aria-describedby`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-describedby) дозволяють зазначити, що два теги пов'язані один з одним. Наприклад, ви можете визначити, що елемент (таким як input) описаний іншим компонентом (таким як параграф).
84
+
[Атрибути доступності HTML](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA), як-от [`aria-describedby`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-describedby), дають змогу зазначити, що два теги пов'язані один з одним. Наприклад, ви можете зазначити, що елемент (як-от input) описаний іншим компонентом (як-от параграф).
86
85
87
-
В звичайному HTML, ви би написали наступне:
86
+
У звичайному HTML ви би написали наступне:
88
87
89
88
```html {5,8}
90
89
<label>
@@ -95,11 +94,11 @@ function PasswordField() {
95
94
/>
96
95
</label>
97
96
<p id="password-hint">
98
-
The password should contain at least 18characters
97
+
Довжина паролю має бути не менш ніж 18символів
99
98
</p>
100
99
```
101
100
102
-
Однак, такий хардкод ID не найкраща практика в React. Компонент може бути зарендерений на сторінці більш ніж один раз — але ID повинні бути унікальні! Замість того, щоб хардкодити ID, згенеруйте унікальне за допомогою`useId`:
101
+
Однак, таке задання ID не найкраща практика в React. Компонент може бути відрендерений на сторінці більш ніж один раз — і ID повинні бути унікальні! Замість незмінно заданих ID, згенеруйте унікальне значення за допомогою `useId`:
103
102
104
103
```js {4,11,14}
105
104
import { useId } from'react';
@@ -116,7 +115,7 @@ function PasswordField() {
116
115
/>
117
116
</label>
118
117
<p id={passwordHintId}>
119
-
Пароль повинен бути довжиною не меньш ніж 18 символів
118
+
Довжина паролю має бути не менш ніж 18 символів
120
119
</p>
121
120
</>
122
121
);
@@ -142,7 +141,7 @@ function PasswordField() {
142
141
/>
143
142
</label>
144
143
<p id={passwordHintId}>
145
-
Пароль повинен бути довжиною не меньш ніж 18 символів
144
+
Довжина паролю має бути не менш ніж 18 символів
146
145
</p>
147
146
</>
148
147
);
@@ -151,7 +150,7 @@ function PasswordField() {
151
150
exportdefaultfunctionApp() {
152
151
return (
153
152
<>
154
-
<h2>Оберіть пароль</h2>
153
+
<h2>Введіть пароль</h2>
155
154
<PasswordField />
156
155
<h2>Підтвердіть пароль</h2>
157
156
<PasswordField />
@@ -170,29 +169,29 @@ input { margin: 5px; }
170
169
171
170
<Pitfall>
172
171
173
-
Разом з [серверним рендерінгом](/reference/react-dom/server), **`useId` потребує ідентичного дерева компонент на сервері та на клієнті**. Якщо дерева, які ви рендерите на сервері та на клієнті не збігаються, то і згенеровані ID не будуть збігатись.
172
+
Для [серверного рендерингу](/reference/react-dom/server), **`useId` потребує ідентичного дерева компонентів на сервері та на клієнті**. Якщо дерева, які ви рендерите на сервері та на клієнті, не збігаються, то і згенеровані ID не будуть збігатись.
174
173
175
174
</Pitfall>
176
175
177
176
<DeepDive>
178
177
179
178
#### Чому використання useId краще за інкрементний лічильник? {/*why-is-useid-better-than-an-incrementing-counter*/}
180
179
181
-
Ви можливо зацікавились, чому використання `useId` краще за інкрементацію глобальної змінної, як наприклад `nextId++`.
180
+
Можливо, вам кортить дізнатися, чому використання `useId` краще за інкрементування глобальної змінної, як наприклад,`nextId++`.
182
181
183
-
Початкова перевага в тому, що `useId`React запевняється, що це працює разом із [серверним рендерінгом.](/reference/react-dom/server) Протягом серверного рендерінга, ваш компонент генерує HTMLвивід. Пізніше, на стороні клієнта, [гідратація](/reference/react-dom/client/hydrateRoot) прикрипляє обробники подій до згенерованого HTML. Для роботи гідратації, клієнтський вивід має збігатись з серверним HTML.
182
+
Початкова перевага `useId`в тому, що React запевниться, що це працює разом із [серверним рендерингом.](/reference/react-dom/server) Протягом серверного рендерингу, ваш компонент генерує HTML-вивід. Далі на клієнті [гідрація](/reference/react-dom/client/hydrateRoot) прикріплює обробники подій до згенерованого HTML. Для коректної роботи гідрації, клієнтський вивід має збігатись із серверним HTML.
184
183
185
-
Це складно гарантувати з інкрементацією лічильника, бо порядок в якому Клієнтські Компоненти проходять гідратацію не збігається з порядком в якому серверний HTML був додан. Викликаючи `useId`, ви запевняєтесь, що гідратація буде працювати, та серверний і клієнтський виводи будуть збігатись.
184
+
Це складно гарантувати для інкрементного лічильника, бо порядок, за яким клієнтські компоненти проходять гідрацію не збігається з порядком за яким був виданий серверний HTML. Викликаючи `useId`, ви запевняєтеся, що гідрація буде працювати, а серверний і клієнтський виводи будуть збігатися.
186
185
187
-
В межах React, `useId` генерується з "батьківського шляху" компоненти, що викликана. Ось чому, якщо клієнтське та серверне дерево однакове, "батьківський шлях" буде збігатись не дивлячись на порядок рендерінгу.
186
+
У межах React, `useId` генерується з "батьківського шляху" компонента, що його викликав. Ось чому, якщо клієнтське та серверне дерево однакове, "батьківський шлях" буде збігатися, незважаючи на порядок рендерингу.
188
187
189
188
</DeepDive>
190
189
191
190
---
192
191
193
-
### Генерація ID для декількох залежних елементів {/*generating-ids-for-several-related-elements*/}
192
+
### Генерація ID для декількох пов'язаних елементів {/*generating-ids-for-several-related-elements*/}
194
193
195
-
Якщо треба додати ID для декількох залежних елементів, ви можете викликати `useId` для генерації спільного префіксу:
194
+
Якщо треба додати ID для декількох пов'язаних елементів, ви можете викликати `useId` для генерації спільного префіксу:
196
195
197
196
<Sandpack>
198
197
@@ -203,11 +202,11 @@ export default function Form() {
Це дозволить запобігти виклику `useId` для кожного окремого елементу, якому треба унікальне ID.
221
+
Це дасть змогу виклику `useId` для кожного окремого елементу, якому треба унікальне ID.
223
222
224
223
---
225
224
226
-
### Визначення спільного префіксу для всіх згенерованих ID {/*specifying-a-shared-prefix-for-all-generated-ids*/}
225
+
### Визначення спільного префікса для всіх згенерованих ID {/*specifying-a-shared-prefix-for-all-generated-ids*/}
227
226
228
-
Якщо ви рендерите декілька незалежних Reactзастосунків на одній сторінці, передавайте `identifierPrefix` як опцію у ваш виклик [`createRoot`](/reference/react-dom/client/createRoot#parameters) або [`hydrateRoot`](/reference/react-dom/client/hydrateRoot). Це забезпечить те, що ID, згенеровані двома різними застосунками, ніколи не перетнуться, бо кожен ідентифікатор згенерований за допомогою `useId` починається з окремого префіксу, який ви вказали.
227
+
Якщо ви рендерите декілька незалежних React-застосунків на одній сторінці, передавайте `identifierPrefix` як опцію до вашого [`createRoot`](/reference/react-dom/client/createRoot#parameters) або [`hydrateRoot`](/reference/react-dom/client/hydrateRoot). Це забезпечить те, що ID, згенеровані двома різними застосунками, ніколи не перетнуться, бо кожен ідентифікатор, згенерований за допомогою `useId`, починатиметься з окремого префіксу, який ви вказали.
229
228
230
229
<Sandpack>
231
230
232
231
```html public/index.html
233
232
<!DOCTYPE html>
234
233
<html>
235
-
<head><title>Мій додаток</title></head>
234
+
<head><title>Мій застосунок</title></head>
236
235
<body>
237
236
<div id="root1"></div>
238
237
<div id="root2"></div>
@@ -245,7 +244,7 @@ import { useId } from 'react';
Пароль повинен бути довжиною не меньш ніж 18 символів
258
+
Довжина паролю має бути не менш ніж 18 символів
260
259
</p>
261
260
</>
262
261
);
@@ -308,9 +307,9 @@ input { margin: 5px; }
308
307
309
308
---
310
309
311
-
### Використання однакового IDпрефікса для клієнта та сервера {/*using-the-same-id-prefix-on-the-client-and-the-server*/}
310
+
### Використання однакового ID-префікса на клієнті та сервері {/*using-the-same-id-prefix-on-the-client-and-the-server*/}
312
311
313
-
Якщо ви [рендерите декілька незалежних Reactзастосунків на одній сторінці](#specifying-a-shared-prefix-for-all-generated-ids), і деякі з цих застосунків відрендерені сервером, запевниться, що `identifierPrefix`, який ви передаєте в [`hydrateRoot`](/reference/react-dom/client/hydrateRoot) викликається на клієнтській стороні, так само як `identifierPrefix`, який ви передаєте в [server APIs](/reference/react-dom/server), наприклад [`renderToPipeableStream`.](/reference/react-dom/server/renderToPipeableStream)
312
+
Якщо ви [рендерите декілька незалежних React-застосунків на одній сторінці](#specifying-a-shared-prefix-for-all-generated-ids), і деякі з цих застосунків відрендерені сервером, перевірте, що `identifierPrefix`, який ви передаєте до [`hydrateRoot`](/reference/react-dom/client/hydrateRoot) на клієнті, є тим самим `identifierPrefix`, який ви передаєте до [серверних APIs](/reference/react-dom/server), наприклад, [`renderToPipeableStream`.](/reference/react-dom/server/renderToPipeableStream)
314
313
315
314
```js
316
315
// Server
@@ -334,4 +333,4 @@ const root = hydrateRoot(
334
333
);
335
334
```
336
335
337
-
Немає потреби передавати `identifierPrefix`, якщо ви маєте тільки один Reactзастосунок на сторінці.
336
+
Немає потреби передавати `identifierPrefix`, якщо ви маєте тільки один React-застосунок на сторінці.
0 commit comments