Skip to content

Commit 5b5aada

Browse files
docs: translate cloneElement.md to Русский
1 parent 7b5e06a commit 5b5aada

1 file changed

Lines changed: 32 additions & 34 deletions

File tree

src/content/reference/react/cloneElement.md

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
---
22
title: cloneElement
33
---
4-
```
54
<Pitfall>
65

7-
Использование `cloneElement` — нечастая практика, которая может привести к хрупкому коду. [См. распространенные альтернативы.](#alternatives)
6+
Использование `cloneElement` встречается редко и может привести к хрупкому коду. [См. альтернативы.](#alternatives)
87

98
</Pitfall>
109

1110
<Intro>
1211

13-
`cloneElement` позволяет создавать новый React-элемент, используя другой элемент в качестве отправной точки.
12+
`cloneElement` позволяет создать новый React-элемент, используя другой элемент в качестве отправной точки.
1413

1514
```js
1615
const clonedElement = cloneElement(element, props, ...children)
@@ -22,7 +21,7 @@ const clonedElement = cloneElement(element, props, ...children)
2221

2322
---
2423

25-
## Ссылка {/*reference*/}
24+
## Справочник {/*reference*/}
2625

2726
### `cloneElement(element, props, ...children)` {/*cloneelement*/}
2827

@@ -47,30 +46,30 @@ console.log(clonedElement); // <Row title="Cabbage" isHighlighted={true}>Goodbye
4746

4847
#### Параметры {/*parameters*/}
4948

50-
* `element`: Аргумент `element` должен быть допустимым React-элементом. Например, это может быть JSX-узел, такой как `<Something />`, результат вызова [`createElement`](/reference/react/createElement) или результат другого вызова `cloneElement`.
49+
* `element`: Аргумент `element` должен быть валидным React-элементом. Например, это может быть JSX-узел вроде `<Something />`, результат вызова [`createElement`](/reference/react/createElement) или результат другого вызова `cloneElement`.
5150

52-
* `props`: Аргумент `props` должен быть либо объектом, либо `null`. Если вы передаете `null`, клонированный элемент сохранит все исходные `element.props`. В противном случае, для каждого пропса в объекте `props` возвращаемый элемент будет «предпочитать» значение из `props` значению из `element.props`. Остальные пропсы будут заполнены из исходных `element.props`. Если вы передаете `props.key` или `props.ref`, они заменят исходные.
51+
* `props`: Аргумент `props` должен быть объектом или `null`. Если вы передадите `null`, клонированный элемент сохранит все оригинальные `element.props`. В противном случае, для каждого свойства в объекте `props`, возвращаемый элемент будет «предпочитать» значение из `props` значению из `element.props`. Остальные свойства будут взяты из оригинального `element.props`. Если вы передадите `props.key` или `props.ref`, они заменят оригинальные.
5352

54-
* **необязательный** `...children`: Ноль или более дочерних узлов. Они могут быть любыми React-узлами, включая React-элементы, строки, числа, [порталы](/reference/react-dom/createPortal), пустые узлы (`null`, `undefined`, `true` и `false`) и массивы React-узлов. Если вы не передаете никаких аргументов `...children`, исходный `element.props.children` будет сохранен.
53+
* **необязательный** `...children`: Ноль или более дочерних узлов. Это могут быть любые React-узлы, включая React-элементы, строки, числа, [порталы](/reference/react-dom/createPortal), пустые узлы (`null`, `undefined`, `true` и `false`) и массивы React-узлов. Если вы не передадите никаких аргументов `...children`, будут сохранены оригинальные `element.props.children`.
5554

56-
#### Возвращает {/*returns*/}
55+
#### Возвращаемое значение {/*returns*/}
5756

5857
`cloneElement` возвращает объект React-элемента с несколькими свойствами:
5958

6059
* `type`: То же, что и `element.type`.
61-
* `props`: Результат поверхностного слияния `element.props` с переопределяющими `props`, которые вы передали.
62-
* `ref`: Исходный `element.ref`, если он не был переопределен `props.ref`.
63-
* `key`: Исходный `element.key`, если он не был переопределен `props.key`.
60+
* `props`: Результат поверхностного слияния `element.props` с переданными вами переопределяющими `props`.
61+
* `ref`: Оригинальный `element.ref`, если он не был переопределен `props.ref`.
62+
* `key`: Оригинальный `element.key`, если он не был переопределен `props.key`.
6463

65-
Обычно вы возвращаете элемент из своего компонента или делаете его дочерним элементом другого элемента. Хотя вы можете читать свойства элемента, лучше всего относиться к каждому элементу как к непрозрачному после его создания и только рендерить его.
64+
Обычно вы возвращаете элемент из своего компонента или делаете его дочерним элементом другого элемента. Хотя вы можете читать свойства элемента, лучше всего рассматривать каждый элемент как непрозрачный после его создания и только рендерить его.
6665

67-
#### Предостережения {/*caveats*/}
66+
#### Ограничения {/*caveats*/}
6867

69-
* Клонирование элемента **не изменяет исходный элемент.**
68+
* Клонирование элемента **не изменяет оригинальный элемент.**
7069

71-
* Вам следует **передавать дочерние элементы в качестве нескольких аргументов в `cloneElement`, только если они все статически известны,** например `cloneElement(element, null, child1, child2, child3)`. Если ваши дочерние элементы динамические, передайте весь массив в качестве третьего аргумента: `cloneElement(element, null, listItems)`. Это гарантирует, что React [предупредит вас об отсутствующих `key`s](/learn/rendering-lists#keeping-list-items-in-order-with-key) для любых динамических списков. Для статических списков это не требуется, потому что они никогда не переупорядочиваются.
70+
* Вы должны **передавать дочерние элементы в качестве нескольких аргументов `cloneElement` только в том случае, если они все статически известны,** например `cloneElement(element, null, child1, child2, child3)`. Если ваши дочерние элементы динамические, передайте весь массив в качестве третьего аргумента: `cloneElement(element, null, listItems)`. Это гарантирует, что React [предупредит вас об отсутствующих `key`](/learn/rendering-lists#keeping-list-items-in-order-with-key) для любых динамических списков. Для статических списков это не требуется, так как они никогда не меняют порядок.
7271

73-
* `cloneElement` усложняет отслеживание потока данных, поэтому **попробуйте [альтернативы](#alternatives) вместо этого.**
72+
* `cloneElement` затрудняет отслеживание потока данных, поэтому **попробуйте [альтернативы](#alternatives) вместо этого.**
7473

7574
---
7675

@@ -94,7 +93,7 @@ const clonedElement = cloneElement(
9493

9594
**Давайте рассмотрим пример, чтобы увидеть, когда это полезно.**
9695

97-
Представьте себе компонент `List`, который отображает свои [`children`](/learn/passing-props-to-a-component#passing-jsx-as-children) в виде списка выбираемых строк с кнопкой «Далее», которая изменяет, какая строка выбрана. Компоненту `List` необходимо отображать выбранный `Row` по-другому, поэтому он клонирует каждый дочерний элемент `<Row>`, который он получил, и добавляет дополнительный пропс `isHighlighted: true` или `isHighlighted: false`:
96+
Представьте компонент `List`, который рендерит свои [`children`](/learn/passing-props-to-a-component#passing-jsx-as-children) в виде списка выбираемых строк с кнопкой "Next", которая изменяет выбранную строку. Компоненту `List` нужно отображать выбранную `Row` по-другому, поэтому он клонирует каждый дочерний элемент `<Row>`, который он получил, и добавляет дополнительный пропс `isHighlighted: true` или `isHighlighted: false`:
9897

9998
```js {6-8}
10099
export default function List({ children }) {
@@ -108,7 +107,7 @@ export default function List({ children }) {
108107
)}
109108
```
110109
111-
Предположим, что исходный JSX, полученный `List`, выглядит так:
110+
Допустим, оригинальный JSX, полученный `List`, выглядит так:
112111
113112
```js {2-4}
114113
<List>
@@ -118,7 +117,7 @@ export default function List({ children }) {
118117
</List>
119118
```
120119
121-
Клонируя свои дочерние элементы, `List` может передавать дополнительную информацию каждому `Row` внутри. Результат выглядит так:
120+
Клонируя свои дочерние элементы, `List` может передавать дополнительную информацию каждой `Row` внутри. Результат выглядит так:
122121
123122
```js {4,8,12}
124123
<List>
@@ -137,7 +136,7 @@ export default function List({ children }) {
137136
</List>
138137
```
139138
140-
Обратите внимание, как нажатие «Далее» обновляет состояние `List` и выделяет другую строку:
139+
Обратите внимание, как нажатие "Next" обновляет состояние `List` и выделяет другую строку:
141140
142141
<Sandpack>
143142
@@ -232,11 +231,11 @@ button {
232231
233232
</Sandpack>
234233
235-
Подводя итог, `List` клонировал элементы `<Row />`, которые он получил, и добавил к ним дополнительный пропс.
234+
Таким образом, `List` клонировал полученные элементы `<Row />` и добавил к ним дополнительный пропс.
236235
237236
<Pitfall>
238237
239-
Клонирование дочерних элементов затрудняет определение того, как данные проходят через ваше приложение. Попробуйте одну из [альтернатив.](#alternatives)
238+
Клонирование дочерних элементов затрудняет отслеживание потока данных в вашем приложении. Попробуйте [альтернативы.](#alternatives)
240239
241240
</Pitfall>
242241
@@ -246,7 +245,7 @@ button {
246245
247246
### Передача данных с помощью render prop {/*passing-data-with-a-render-prop*/}
248247
249-
Вместо использования `cloneElement` рассмотрите возможность принятия *render prop*, например `renderItem`. Здесь `List` получает `renderItem` в качестве пропса. `List` вызывает `renderItem` для каждого элемента и передает `isHighlighted` в качестве аргумента:
248+
Вместо использования `cloneElement` рассмотрите возможность принятия *render prop*, такого как `renderItem`. Здесь `List` принимает `renderItem` в качестве пропса. `List` вызывает `renderItem` для каждого элемента и передает `isHighlighted` в качестве аргумента:
250249
251250
```js {1,7}
252251
export default function List({ items, renderItem }) {
@@ -259,7 +258,7 @@ export default function List({ items, renderItem }) {
259258
})}
260259
```
261260
262-
Пропс `renderItem` называется «render prop», потому что это пропс, который определяет, как что-то отображать. Например, вы можете передать реализацию `renderItem`, которая отображает `<Row>` с заданным значением `isHighlighted`:
261+
Render prop `renderItem` называется так потому, что это пропс, который определяет, как что-то рендерить. Например, вы можете передать реализацию `renderItem`, которая рендерит `<Row>` с заданным значением `isHighlighted`:
263262
264263
```js {3,7}
265264
<List
@@ -274,7 +273,7 @@ export default function List({ items, renderItem }) {
274273
/>
275274
```
276275
277-
Конечный результат такой же, как и с `cloneElement`:
276+
Конечный результат тот же, что и с `cloneElement`:
278277
279278
```js {4,8,12}
280279
<List>
@@ -389,21 +388,21 @@ button {
389388
390389
</Sandpack>
391390
392-
Этот шаблон предпочтительнее `cloneElement`, потому что он более явный.
391+
Этот шаблон предпочтительнее `cloneElement`, так как он более явный.
393392
394393
---
395394
396395
### Передача данных через контекст {/*passing-data-through-context*/}
397396
398397
Другой альтернативой `cloneElement` является [передача данных через контекст.](/learn/passing-data-deeply-with-context)
399398
400-
Например, вы можете вызвать [`createContext`](/reference/react/createContext), чтобы определить `HighlightContext`:
399+
Например, вы можете вызвать [`createContext`](/reference/react/createContext) для определения `HighlightContext`:
401400
402401
```js
403402
export const HighlightContext = createContext(false);
404403
```
405404
406-
Ваш компонент `List` может обернуть каждый отображаемый им элемент в провайдер `HighlightContext`:
405+
Ваш компонент `List` может обернуть каждый элемент, который он рендерит, в провайдер `HighlightContext`:
407406
408407
```js {8,10}
409408
export default function List({ items, renderItem }) {
@@ -420,7 +419,7 @@ export default function List({ items, renderItem }) {
420419
})}
421420
```
422421
423-
При таком подходе `Row` вообще не нужно получать пропс `isHighlighted`. Вместо этого он считывает контекст:
422+
При таком подходе `Row` вообще не нужно получать пропс `isHighlighted`. Вместо этого он читает контекст:
424423
425424
```js src/Row.js {2}
426425
export default function Row({ title }) {
@@ -553,9 +552,9 @@ button {
553552
554553
---
555554
556-
### Извлечение логики в пользовательский хук {/*extracting-logic-into-a-custom-hook*/}
555+
### Выделение логики в пользовательский хук {/*extracting-logic-into-a-custom-hook*/}
557556
558-
Другой подход, который вы можете попробовать, — это извлечь «невизуальную» логику в свой собственный хук и использовать информацию, возвращаемую вашим хуком, чтобы решить, что отображать. Например, вы можете написать пользовательский хук `useList` следующим образом:
557+
Другой подход, который вы можете попробовать, — это выделить "невизуальную" логику в собственный хук и использовать информацию, возвращаемую вашим хуком, для принятия решения о том, что рендерить. Например, вы можете написать пользовательский хук `useList` следующим образом:
559558
560559
```js
561560
import { useState } from 'react';
@@ -574,7 +573,7 @@ export default function useList(items) {
574573
}
575574
```
576575
577-
Тогда вы можете использовать его так:
576+
Затем вы можете использовать его так:
578577
579578
```js {2,9,13}
580579
export default function App() {
@@ -690,5 +689,4 @@ button {
690689
691690
</Sandpack>
692691
693-
Этот подход особенно полезен, если вы хотите повторно использовать эту логику между разными компонентами.
694-
```
692+
Этот подход особенно полезен, если вы хотите повторно использовать эту логику между различными компонентами.

0 commit comments

Comments
 (0)