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
*`element`: Аргумент `element` должен быть допустимым React-элементом. Например, это может быть JSX-узел, такой как`<Something />`, результат вызова [`createElement`](/reference/react/createElement) или результат другого вызова `cloneElement`.
49
+
*`element`: Аргумент `element` должен быть валидным React-элементом. Например, это может быть JSX-узел вроде`<Something />`, результат вызова [`createElement`](/reference/react/createElement) или результат другого вызова `cloneElement`.
51
50
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`, они заменят оригинальные.
53
52
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`.
55
54
56
-
#### Возвращает {/*returns*/}
55
+
#### Возвращаемое значение {/*returns*/}
57
56
58
57
`cloneElement` возвращает объект React-элемента с несколькими свойствами:
59
58
60
59
*`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`.
64
63
65
-
Обычно вы возвращаете элемент из своего компонента или делаете его дочерним элементом другого элемента. Хотя вы можете читать свойства элемента, лучше всего относиться к каждому элементу как к непрозрачному после его создания и только рендерить его.
64
+
Обычно вы возвращаете элемент из своего компонента или делаете его дочерним элементом другого элемента. Хотя вы можете читать свойства элемента, лучше всего рассматривать каждый элемент как непрозрачный после его создания и только рендерить его.
*Вам следует**передавать дочерние элементы в качестве нескольких аргументов в `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) для любых динамических списков. Для статических списков это не требуется, так как они никогда не меняют порядок.
72
71
73
-
*`cloneElement`усложняет отслеживание потока данных, поэтому **попробуйте [альтернативы](#alternatives) вместо этого.**
72
+
*`cloneElement`затрудняет отслеживание потока данных, поэтому **попробуйте [альтернативы](#alternatives) вместо этого.**
**Давайте рассмотрим пример, чтобы увидеть, когда это полезно.**
96
95
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`:
98
97
99
98
```js {6-8}
100
99
exportdefaultfunctionList({ children }) {
@@ -108,7 +107,7 @@ export default function List({ children }) {
108
107
)}
109
108
```
110
109
111
-
Предположим, что исходный JSX, полученный `List`, выглядит так:
@@ -118,7 +117,7 @@ export default function List({ children }) {
118
117
</List>
119
118
```
120
119
121
-
Клонируя свои дочерние элементы, `List` может передавать дополнительную информацию каждому`Row` внутри. Результат выглядит так:
120
+
Клонируя свои дочерние элементы, `List` может передавать дополнительную информацию каждой`Row` внутри. Результат выглядит так:
122
121
123
122
```js {4,8,12}
124
123
<List>
@@ -137,7 +136,7 @@ export default function List({ children }) {
137
136
</List>
138
137
```
139
138
140
-
Обратите внимание, как нажатие «Далее» обновляет состояние `List` и выделяет другую строку:
139
+
Обратите внимание, как нажатие "Next" обновляет состояние `List` и выделяет другую строку:
141
140
142
141
<Sandpack>
143
142
@@ -232,11 +231,11 @@ button {
232
231
233
232
</Sandpack>
234
233
235
-
Подводя итог, `List` клонировал элементы `<Row />`, которые он получил, и добавил к ним дополнительный пропс.
234
+
Таким образом, `List` клонировал полученные элементы `<Row />` и добавил к ним дополнительный пропс.
236
235
237
236
<Pitfall>
238
237
239
-
Клонирование дочерних элементов затрудняет определение того, как данные проходят через ваше приложение. Попробуйте одну из [альтернатив.](#alternatives)
238
+
Клонирование дочерних элементов затрудняет отслеживание потока данных в вашем приложении. Попробуйте [альтернативы.](#alternatives)
240
239
241
240
</Pitfall>
242
241
@@ -246,7 +245,7 @@ button {
246
245
247
246
### Передача данных с помощью render prop {/*passing-data-with-a-render-prop*/}
248
247
249
-
Вместо использования `cloneElement` рассмотрите возможность принятия *render prop*, например `renderItem`. Здесь `List`получает`renderItem` в качестве пропса. `List` вызывает `renderItem` для каждого элемента и передает `isHighlighted` в качестве аргумента:
248
+
Вместо использования `cloneElement` рассмотрите возможность принятия *render prop*, такого как `renderItem`. Здесь `List`принимает`renderItem` в качестве пропса. `List` вызывает `renderItem` для каждого элемента и передает `isHighlighted` в качестве аргумента:
Пропс `renderItem` называется «render prop», потому что это пропс, который определяет, как что-то отображать. Например, вы можете передать реализацию `renderItem`, которая отображает`<Row>` с заданным значением `isHighlighted`:
261
+
Render prop `renderItem` называется так потому, что это пропс, который определяет, как что-то рендерить. Например, вы можете передать реализацию `renderItem`, которая рендерит`<Row>` с заданным значением `isHighlighted`:
При таком подходе `Row` вообще не нужно получать пропс `isHighlighted`. Вместо этого он считывает контекст:
422
+
При таком подходе `Row` вообще не нужно получать пропс `isHighlighted`. Вместо этого он читает контекст:
424
423
425
424
```js src/Row.js {2}
426
425
exportdefaultfunctionRow({ title }) {
@@ -553,9 +552,9 @@ button {
553
552
554
553
---
555
554
556
-
### Извлечение логики в пользовательский хук {/*extracting-logic-into-a-custom-hook*/}
555
+
### Выделение логики в пользовательский хук {/*extracting-logic-into-a-custom-hook*/}
557
556
558
-
Другой подход, который вы можете попробовать, — это извлечь «невизуальную» логику в свой собственный хук и использовать информацию, возвращаемую вашим хуком, чтобы решить, что отображать. Например, вы можете написать пользовательский хук `useList` следующим образом:
557
+
Другой подход, который вы можете попробовать, — это выделить "невизуальную" логику в собственный хук и использовать информацию, возвращаемую вашим хуком, для принятия решения о том, что рендерить. Например, вы можете написать пользовательский хук `useList` следующим образом:
559
558
560
559
```js
561
560
import { useState } from'react';
@@ -574,7 +573,7 @@ export default function useList(items) {
574
573
}
575
574
```
576
575
577
-
Тогда вы можете использовать его так:
576
+
Затем вы можете использовать его так:
578
577
579
578
```js {2,9,13}
580
579
exportdefaultfunctionApp() {
@@ -690,5 +689,4 @@ button {
690
689
691
690
</Sandpack>
692
691
693
-
Этот подход особенно полезен, если вы хотите повторно использовать эту логику между разными компонентами.
694
-
```
692
+
Этот подход особенно полезен, если вы хотите повторно использовать эту логику между различными компонентами.
0 commit comments