Skip to content

Commit 3bc169e

Browse files
committed
Resolved comments
1 parent 116f958 commit 3bc169e

File tree

1 file changed

+38
-39
lines changed

1 file changed

+38
-39
lines changed

src/content/reference/react/useId.md

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ title: useId
44

55
<Intro>
66

7-
`useId` — це хук для генерації унікальних ID, які можуть передаватись як атрибути доступності.
7+
`useId` — це хук для генерації унікальних ідентифікаторів (_далі_ — ID), які можуть передаватися як атрибути доступності.
88

99
```js
1010
const id = useId()
@@ -16,11 +16,11 @@ const id = useId()
1616

1717
---
1818

19-
## Референс {/*reference*/}
19+
## Опис {/*reference*/}
2020

2121
### `useId()` {/*useid*/}
2222

23-
Викликайте `useId` на верхньому рівні вашого компонента, щоб згенерувати унікальне ID:
23+
Викличте `useId` на верхньому рівні вашого компонента, щоб згенерувати унікальне ID:
2424

2525
```js
2626
import { useId } from 'react';
@@ -34,34 +34,33 @@ function PasswordField() {
3434
3535
#### Параметри {/*parameters*/}
3636
37-
`useId` не приймає ніяких параметрів.
37+
`useId` не приймає жодних параметрів.
3838
3939
#### Результат {/*returns*/}
4040
41-
`useId` повертає унікальну ID строку, пов'язану з конкретним запитом `useId` в цьому конкретному компоненті.
41+
`useId` повертає унікальну ID-стрічку, пов'язану з конкретним запитом `useId` в цьому конкретному компоненті.
4242
4343
#### Застереження {/*caveats*/}
4444
45-
* `useId` — це хук, тож він може викликатись тільки **на верхньому рівні вашого компонента** або у вашому власному хуці. Ви не можете викликати його в циклах або умовах. Якщо ж є така потреба, то витягніть новий компонент та перемістіть в нього стан.
45+
* `useId` — це хук, тож він може викликатися тільки **на верхньому рівні вашого компонента** або у ваших власних хуках. Ви не можете викликати його в циклах або умовно. Якщо ж є така потреба, то виокреміть новий компонент та перемістіть у нього стан.
4646
47-
* `useId` **не повинно використовуватись для генерації ключів** у списках. [Ключі повинні генеруватись з ваших даних.](/learn/rendering-lists#where-to-get-your-key)
47+
* `useId` **не має використовуватися для генерації ключів** у списках. [Ключі мають генеруватися з ваших даних.](/learn/rendering-lists#where-to-get-your-key)
4848
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).
5050
5151
---
5252
5353
## Використання {/*usage*/}
5454
5555
<Pitfall>
5656
57-
**Не викликайте `useId` для генерації ключів у списку.** [Ключі повинні генеруватись з ваших даних.](/learn/rendering-lists#where-to-get-your-key)
58-
57+
**Не викликайте `useId` для генерації ключів у списку.** [Ключі мають генеруватися з ваших даних.](/learn/rendering-lists#where-to-get-your-key)
5958
6059
</Pitfall>
6160
6261
### Генерація унікальних ID для атрибутів доступності {/*generating-unique-ids-for-accessibility-attributes*/}
6362
64-
Викликайте `useId` на верхньому рівні вашої компоненти для генерації унікального ID:
63+
Викличте `useId` на верхньому рівні вашого компонента для генерації унікального ID:
6564
6665
```js [[1, 4, "passwordHintId"]]
6766
import { useId } from 'react';
@@ -71,7 +70,7 @@ function PasswordField() {
7170
// ...
7271
```
7372
74-
Далі ви можете передати <CodeStep step={1}>Згеренрувати ID</CodeStep> до різних атрибутів:
73+
Далі ви можете передати <CodeStep step={1}>згенерований ID</CodeStep> до різних атрибутів:
7574
7675
```js [[1, 2, "passwordHintId"], [1, 3, "passwordHintId"]]
7776
<>
@@ -82,9 +81,9 @@ function PasswordField() {
8281
8382
**Розглянемо приклади, коли це може бути корисно.**
8483
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) описаний іншим компонентом (як-от параграф).
8685
87-
В звичайному HTML, ви би написали наступне:
86+
У звичайному HTML ви би написали наступне:
8887
8988
```html {5,8}
9089
<label>
@@ -95,11 +94,11 @@ function PasswordField() {
9594
/>
9695
</label>
9796
<p id="password-hint">
98-
The password should contain at least 18 characters
97+
Довжина паролю має бути не менш ніж 18 символів
9998
</p>
10099
```
101100
102-
Однак, такий хардкод ID не найкраща практика в React. Компонент може бути зарендерений на сторінці більш ніж один раз — але ID повинні бути унікальні! Замість того, щоб хардкодити ID, згенеруйте унікальне за допомогою `useId`:
101+
Однак, таке задання ID не найкраща практика в React. Компонент може бути відрендерений на сторінці більш ніж один раз — і ID повинні бути унікальні! Замість незмінно заданих ID, згенеруйте унікальне значення за допомогою `useId`:
103102
104103
```js {4,11,14}
105104
import { useId } from 'react';
@@ -116,7 +115,7 @@ function PasswordField() {
116115
/>
117116
</label>
118117
<p id={passwordHintId}>
119-
Пароль повинен бути довжиною не меньш ніж 18 символів
118+
Довжина паролю має бути не менш ніж 18 символів
120119
</p>
121120
</>
122121
);
@@ -142,7 +141,7 @@ function PasswordField() {
142141
/>
143142
</label>
144143
<p id={passwordHintId}>
145-
Пароль повинен бути довжиною не меньш ніж 18 символів
144+
Довжина паролю має бути не менш ніж 18 символів
146145
</p>
147146
</>
148147
);
@@ -151,7 +150,7 @@ function PasswordField() {
151150
export default function App() {
152151
return (
153152
<>
154-
<h2>Оберіть пароль</h2>
153+
<h2>Введіть пароль</h2>
155154
<PasswordField />
156155
<h2>Підтвердіть пароль</h2>
157156
<PasswordField />
@@ -170,29 +169,29 @@ input { margin: 5px; }
170169
171170
<Pitfall>
172171
173-
Разом з [серверним рендерінгом](/reference/react-dom/server), **`useId` потребує ідентичного дерева компонент на сервері та на клієнті**. Якщо дерева, які ви рендерите на сервері та на клієнті не збігаються, то і згенеровані ID не будуть збігатись.
172+
Для [серверного рендерингу](/reference/react-dom/server), **`useId` потребує ідентичного дерева компонентів на сервері та на клієнті**. Якщо дерева, які ви рендерите на сервері та на клієнті, не збігаються, то і згенеровані ID не будуть збігатись.
174173
175174
</Pitfall>
176175
177176
<DeepDive>
178177
179178
#### Чому використання useId краще за інкрементний лічильник? {/*why-is-useid-better-than-an-incrementing-counter*/}
180179
181-
Ви можливо зацікавились, чому використання `useId` краще за інкрементацію глобальної змінної, як наприклад `nextId++`.
180+
Можливо, вам кортить дізнатися, чому використання `useId` краще за інкрементування глобальної змінної, як наприклад, `nextId++`.
182181
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.
184183
185-
Це складно гарантувати з інкрементацією лічильника, бо порядок в якому Клієнтські Компоненти проходять гідратацію не збігається з порядком в якому серверний HTML був додан. Викликаючи `useId`, ви запевняєтесь, що гідратація буде працювати, та серверний і клієнтський виводи будуть збігатись.
184+
Це складно гарантувати для інкрементного лічильника, бо порядок, за яким клієнтські компоненти проходять гідрацію не збігається з порядком за яким був виданий серверний HTML. Викликаючи `useId`, ви запевняєтеся, що гідрація буде працювати, а серверний і клієнтський виводи будуть збігатися.
186185
187-
В межах React, `useId` генерується з "батьківського шляху" компоненти, що викликана. Ось чому, якщо клієнтське та серверне дерево однакове, "батьківський шлях" буде збігатись не дивлячись на порядок рендерінгу.
186+
У межах React, `useId` генерується з "батьківського шляху" компонента, що його викликав. Ось чому, якщо клієнтське та серверне дерево однакове, "батьківський шлях" буде збігатися, незважаючи на порядок рендерингу.
188187
189188
</DeepDive>
190189
191190
---
192191
193-
### Генерація ID для декількох залежних елементів {/*generating-ids-for-several-related-elements*/}
192+
### Генерація ID для декількох пов'язаних елементів {/*generating-ids-for-several-related-elements*/}
194193
195-
Якщо треба додати ID для декількох залежних елементів, ви можете викликати `useId` для генерації спільного префіксу:
194+
Якщо треба додати ID для декількох пов'язаних елементів, ви можете викликати `useId` для генерації спільного префіксу:
196195
197196
<Sandpack>
198197
@@ -203,11 +202,11 @@ export default function Form() {
203202
const id = useId();
204203
return (
205204
<form>
206-
<label htmlFor={id + '-ім_я'}>Ім'я:</label>
207-
<input id={id + '-ім_я'} type="text" />
205+
<label htmlFor={id + '-name'}>Ім'я:</label>
206+
<input id={id + '-name'} type="text" />
208207
<hr />
209-
<label htmlFor={id + '-прізвище'}>Прізвище:</label>
210-
<input id={id + '-прізвище'} type="text" />
208+
<label htmlFor={id + '-lastName'}>Прізвище:</label>
209+
<input id={id + '-lastName'} type="text" />
211210
</form>
212211
);
213212
}
@@ -219,20 +218,20 @@ input { margin: 5px; }
219218
220219
</Sandpack>
221220
222-
Це дозволить запобігти виклику `useId` для кожного окремого елементу, якому треба унікальне ID.
221+
Це дасть змогу виклику `useId` для кожного окремого елементу, якому треба унікальне ID.
223222
224223
---
225224
226-
### Визначення спільного префіксу для всіх згенерованих ID {/*specifying-a-shared-prefix-for-all-generated-ids*/}
225+
### Визначення спільного префікса для всіх згенерованих ID {/*specifying-a-shared-prefix-for-all-generated-ids*/}
227226
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`, починатиметься з окремого префіксу, який ви вказали.
229228
230229
<Sandpack>
231230
232231
```html public/index.html
233232
<!DOCTYPE html>
234233
<html>
235-
<head><title>Мій додаток</title></head>
234+
<head><title>Мій застосунок</title></head>
236235
<body>
237236
<div id="root1"></div>
238237
<div id="root2"></div>
@@ -245,7 +244,7 @@ import { useId } from 'react';
245244
246245
function PasswordField() {
247246
const passwordHintId = useId();
248-
console.log('Згенеруй ідентифікатор:', passwordHintId)
247+
console.log('Згенерований ідентифікатор:', passwordHintId)
249248
return (
250249
<>
251250
<label>
@@ -256,7 +255,7 @@ function PasswordField() {
256255
/>
257256
</label>
258257
<p id={passwordHintId}>
259-
Пароль повинен бути довжиною не меньш ніж 18 символів
258+
Довжина паролю має бути не менш ніж 18 символів
260259
</p>
261260
</>
262261
);
@@ -308,9 +307,9 @@ input { margin: 5px; }
308307
309308
---
310309
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*/}
312311
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)
314313
315314
```js
316315
// Server
@@ -334,4 +333,4 @@ const root = hydrateRoot(
334333
);
335334
```
336335
337-
Немає потреби передавати `identifierPrefix`, якщо ви маєте тільки один React застосунок на сторінці.
336+
Немає потреби передавати `identifierPrefix`, якщо ви маєте тільки один React-застосунок на сторінці.

0 commit comments

Comments
 (0)