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
+37-40Lines changed: 37 additions & 40 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,8 +4,6 @@ title: useId
4
4
5
5
<Intro>
6
6
7
-
`useId` is a React Hook for generating unique IDs that can be passed to accessibility attributes.
8
-
9
7
`useId` — це хук для генерації унікальних ID, які можуть передаватись як атрибути доступності.
10
8
11
9
```js
@@ -18,11 +16,11 @@ const id = useId()
18
16
19
17
---
20
18
21
-
## Reference {/*reference*/}
19
+
## Референс {/*reference*/}
22
20
23
21
### `useId()` {/*useid*/}
24
22
25
-
Викличте`useId` на верхньому рівні вашого компонента, щоб згенерувати унікальне ID:
23
+
Викликайте`useId` на верхньому рівні вашого компонента, щоб згенерувати унікальне ID:
26
24
27
25
```js
28
26
import { useId } from'react';
@@ -40,15 +38,15 @@ function PasswordField() {
40
38
41
39
#### Результат {/*returns*/}
42
40
43
-
`useId` повертає унікальну ID стрінгу, пов'язану з конкретним запитом `useId` в цьому конкретньому компоненті.
41
+
`useId` повертає унікальну ID строку, пов'язану з конкретним запитом `useId` в цьому конкретному компоненті.
44
42
45
43
#### Застереження {/*caveats*/}
46
44
47
-
* `useId` — це хук, тож він може бути викликаний тільки **на верхньому рівні вашого компонента** або у вашому власному Хуці. Ви не можете викликати його в циклах або умовах. Якщо ж є така потреба, то витягніть новий компонент та перемістіть в нього стан.
45
+
* `useId` — це хук, тож він може викликатись тільки **на верхньому рівні вашого компонента** або у вашому власному хуці. Ви не можете викликати його в циклах або умовах. Якщо ж є така потреба, то витягніть новий компонент та перемістіть в нього стан.
48
46
49
47
* `useId` **не повинно використовуватись для генерації ключів** у списках. [Ключі повинні генеруватись з ваших даних.](/learn/rendering-lists#where-to-get-your-key)
50
48
51
-
* `useId`на данний момент не може бути використано в [async Server Components](/reference/rsc/server-components#async-components-with-server-components).
49
+
* `useId`наразі не може бути використано в [async Server Components](/reference/rsc/server-components#async-components-with-server-components).
52
50
53
51
---
54
52
@@ -61,7 +59,7 @@ function PasswordField() {
61
59
62
60
</Pitfall>
63
61
64
-
### Генеруйте унікальні ID для атрибутів доступності {/*generating-unique-ids-for-accessibility-attributes*/}
62
+
### Генерація унікальних ID для атрибутів доступності {/*generating-unique-ids-for-accessibility-attributes*/}
65
63
66
64
Викликайте `useId` на верхньому рівні вашої компоненти для генерації унікального ID:
67
65
@@ -73,7 +71,7 @@ function PasswordField() {
73
71
// ...
74
72
```
75
73
76
-
Далі ви можете передати <CodeStep step={1}>generated ID</CodeStep> до різних атрибутів:
74
+
Далі ви можете передати <CodeStep step={1}>Згеренрувати ID</CodeStep> до різних атрибутів:
**Давайте розглянемо приклади, коли це може бути корисно.**
83
+
**Розглянемо приклади, коли це може бути корисно.**
86
84
87
-
[Атрибути доступності 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) описан іншим компонентом (такий як параграф).
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) описаний іншим компонентом (таким як параграф).
88
86
89
87
В звичайному HTML, ви би написали наступне:
90
88
@@ -101,7 +99,7 @@ function PasswordField() {
101
99
</p>
102
100
```
103
101
104
-
Однак, такий хардкод ID не найкраща практика в React. Компонент може бути зарендерений на сторінці більш ніж один раз — але ID повинні бути унікальні! Замість того, щоб хардкодити ID, зренеруйте унікальне за допомогою `useId`:
102
+
Однак, такий хардкод ID не найкраща практика в React. Компонент може бути зарендерений на сторінці більш ніж один раз — але ID повинні бути унікальні! Замість того, щоб хардкодити ID, згенеруйте унікальне за допомогою `useId`:
105
103
106
104
```js {4,11,14}
107
105
import { useId } from'react';
@@ -118,7 +116,7 @@ function PasswordField() {
118
116
/>
119
117
</label>
120
118
<p id={passwordHintId}>
121
-
Пароль повинен буди довжиною не меньш ніж 18 символів
119
+
Пароль повинен бути довжиною не меньш ніж 18 символів
122
120
</p>
123
121
</>
124
122
);
@@ -144,7 +142,7 @@ function PasswordField() {
144
142
/>
145
143
</label>
146
144
<p id={passwordHintId}>
147
-
Пароль повинен буди довжиною не меньш ніж 18 символів
145
+
Пароль повинен бути довжиною не меньш ніж 18 символів
148
146
</p>
149
147
</>
150
148
);
@@ -168,34 +166,33 @@ input { margin: 5px; }
168
166
169
167
</Sandpack>
170
168
171
-
[Перегляньте відео](https://www.youtube.com/watch?v=0dNzNcuEuOo), щоб побачити різницю користувацького досвіду з дороміжними технологіями.
169
+
[Перегляньте відео](https://www.youtube.com/watch?v=0dNzNcuEuOo), щоб побачити різницю користувацького досвіду з допоміжними технологіями.
172
170
173
171
<Pitfall>
174
172
175
-
With [server rendering](/reference/react-dom/server), **`useId` requires an identical component tree on the server and the client**. If the trees you render on the server and the client don't match exactly, the generated IDs won't match.
176
-
Разом з [серверним рендерінгом](/reference/react-dom/server), **`useId` потребує ідентичного дерева компонент на сервері та на клієнті**. If the trees you render on the server and the client don't match exactly, the generated IDs won't match.
173
+
Разом з [серверним рендерінгом](/reference/react-dom/server), **`useId` потребує ідентичного дерева компонент на сервері та на клієнті**. Якщо дерева, які ви рендерите на сервері та на клієнті не збігаються, то і згенеровані ID не будуть збігатись.
177
174
178
175
</Pitfall>
179
176
180
177
<DeepDive>
181
178
182
-
#### Why is useId better than an incrementing counter? {/*why-is-useid-better-than-an-incrementing-counter*/}
179
+
#### Чому використання useId краще за інкрементний лічильник? {/*why-is-useid-better-than-an-incrementing-counter*/}
183
180
184
-
You might be wondering why`useId`is better than incrementing a global variable like`nextId++`.
181
+
Ви можливо зацікавились, чому використання`useId`краще за інкрементацію глобальної змінної, як наприклад`nextId++`.
185
182
186
-
The primary benefit of `useId`is that React ensures that it works with [server rendering.](/reference/react-dom/server) During server rendering, your components generate HTML output. Later, on the client, [hydration](/reference/react-dom/client/hydrateRoot) attaches your event handlers to the generated HTML. For hydration to work, the client output must match the server HTML.
183
+
Початкова перевага в тому, що `useId` React запевняється, що це працює разом із [серверним рендерінгом.](/reference/react-dom/server) Протягом серверного рендерінга, ваш компонент генерує HTML вивід. Пізніше, на стороні клієнта, [гідратація](/reference/react-dom/client/hydrateRoot) прикрипляє обробники подій до згенерованого HTML. Для роботи гідратації, клієнтський вивід має збігатись з серверним HTML.
187
184
188
-
This is very difficult to guarantee with an incrementing counter because the order in which the Client Components are hydrated may not match the order in which the server HTML was emitted. By calling `useId`, you ensure that hydration will work, and the output will match between the server and the client.
185
+
Це складно гарантувати з інкрементацією лічильника, бо порядок в якому Клієнтські Компоненти проходять гідратацію не збігається з порядком в якому серверний HTML був додан. Викликаючи `useId`, ви запевняєтесь, що гідратація буде працювати, та серверний і клієнтський виводи будуть збігатись.
189
186
190
-
Inside React, `useId`is generated from the "parent path" of the calling component. This is why, if the client and the server tree are the same, the "parent path" will match up regardless of rendering order.
187
+
В межах React, `useId`генерується з "батьківського шляху" компоненти, що викликана. Ось чому, якщо клієнтське та серверне дерево однакове, "батьківський шлях" буде збігатись не дивлячись на порядок рендерінгу.
191
188
192
189
</DeepDive>
193
190
194
191
---
195
192
196
-
### Generating IDs for several related elements {/*generating-ids-for-several-related-elements*/}
193
+
### Генерація ID для декількох залежних елементів {/*generating-ids-for-several-related-elements*/}
197
194
198
-
If you need to give IDs to multiple related elements, you can call`useId`to generate a shared prefix for them:
195
+
Якщо треба додати ID для декількох залежних елементів, ви можете викликати`useId`для генерації спільного префіксу:
199
196
200
197
<Sandpack>
201
198
@@ -206,11 +203,11 @@ export default function Form() {
This lets you avoid calling `useId`for every single element that needs a unique ID.
222
+
Це дозволить запобігти виклику `useId` для кожного окремого елементу, якому треба унікальне ID.
226
223
227
224
---
228
225
229
-
### Specifying a shared prefix for all generated IDs {/*specifying-a-shared-prefix-for-all-generated-ids*/}
226
+
### Визначення спільного префіксу для всіх згенерованих ID {/*specifying-a-shared-prefix-for-all-generated-ids*/}
230
227
231
-
If you render multiple independent React applications on a single page, pass`identifierPrefix`as an option to your [`createRoot`](/reference/react-dom/client/createRoot#parameters) or [`hydrateRoot`](/reference/react-dom/client/hydrateRoot) calls. This ensures that the IDs generated by the two different apps never clash because every identifier generated with`useId`will start with the distinct prefix you've specified.
228
+
Якщо ви рендерите декілька незалежних React застосунків на одній сторінці, передавайте `identifierPrefix` як опцію у ваш виклик [`createRoot`](/reference/react-dom/client/createRoot#parameters) або [`hydrateRoot`](/reference/react-dom/client/hydrateRoot). Це забезпечить те, що ID, згенеровані двома різними застосунками, ніколи не перетнуться, бо кожен ідентифікатор згенерований за допомогою `useId` починається з окремого префіксу, який ви вказали.
232
229
233
230
<Sandpack>
234
231
235
232
```html public/index.html
236
233
<!DOCTYPE html>
237
234
<html>
238
-
<head><title>My app</title></head>
235
+
<head><title>Мій додаток</title></head>
239
236
<body>
240
237
<div id="root1"></div>
241
238
<div id="root2"></div>
@@ -248,18 +245,18 @@ import { useId } from 'react';
Пароль повинен бути довжиною не меньш ніж 18 символів
263
260
</p>
264
261
</>
265
262
);
@@ -268,7 +265,7 @@ function PasswordField() {
268
265
export default function App() {
269
266
return (
270
267
<>
271
-
<h2>Choose password</h2>
268
+
<h2>Оберіть пароль</h2>
272
269
<PasswordField />
273
270
</>
274
271
);
@@ -311,9 +308,9 @@ input { margin: 5px; }
311
308
312
309
---
313
310
314
-
### Using the same ID prefix on the client and the server {/*using-the-same-id-prefix-on-the-client-and-the-server*/}
311
+
### Використання однакового ID префікса для клієнта та сервера {/*using-the-same-id-prefix-on-the-client-and-the-server*/}
315
312
316
-
If you [render multiple independent React apps on the same page](#specifying-a-shared-prefix-for-all-generated-ids), and some of these apps are server-rendered, make sure that the `identifierPrefix` you pass to the [`hydrateRoot`](/reference/react-dom/client/hydrateRoot) call on the client side is the same as the `identifierPrefix` you pass to the [server APIs](/reference/react-dom/server) such as [`renderToPipeableStream`.](/reference/react-dom/server/renderToPipeableStream)
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)
317
314
318
315
```js
319
316
// Server
@@ -337,4 +334,4 @@ const root = hydrateRoot(
337
334
);
338
335
```
339
336
340
-
You do not need to pass `identifierPrefix` if you only have one React app on the page.
337
+
Немає потреби передавати `identifierPrefix`, якщо ви маєте тільки один React застосунок на сторінці.
0 commit comments