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`: The`element`argument must be a valid React element. For example, it could be a JSX node like `<Something />`, the result of calling [`createElement`](/reference/react/createElement), or the result of another `cloneElement`call.
50
+
*`element`: Argumen`element`harus merupakan elemen React yang valid. Misalnya, dapat berupa simpul JSX seperti `<Something />`, hasil dari pemanggilan [`createElement`](/reference/react/createElement), atau hasil dari pemanggilan `cloneElement`lainnya.
51
51
52
-
*`props`: The`props`argument must either be an object or `null`. If you pass`null`, the cloned element will retain all of the original `element.props`. Otherwise, for every prop in the`props` object, the returned element will "prefer" the value from `props`over the value from `element.props`. The rest of the props will be filled from the original `element.props`. If you pass`props.key`or`props.ref`, they will replace the original ones.
52
+
*`props`: Argumen`props`harus berupa objek atau `null`. Jika Anda mengoper`null`, elemen yang di-kloning akan mempertahankan semua `element.props` yang orisinal. Sebaliknya, untuk setiap *prop* di objek`props`, elemen yang dikembalikan akan "memilih" nilai dari `props`daripada nilai dari `element.props`. Sisa *props* lainnya akan diisi dari `element.props` yang orisinal. Jika Anda mengoper`props.key`atau`props.ref`, mereka akan menggantikan yang orisinal.
53
53
54
-
***optional**`...children`: Zero or more child nodes. They can be any React nodes, including React elements, strings, numbers, [portals](/reference/react-dom/createPortal), empty nodes (`null`, `undefined`, `true`, and`false`), and arrays of React nodes. If you don't pass any`...children`arguments, the original `element.props.children`will be preserved.
54
+
***opsional**`...children`: Nol atau lebih simpul anak. Bisa dari simpul React apa pun, termasuk elemen React, *string*, dan *number*. [*portal*](/reference/react-dom/createPortal), simpul kosong (`null`, `undefined`, `true`, dan`false`), dan senarai dari simpul-simpul React. Jika Anda tidak mengoper argumen`...children`apa pun, `element.props.children`yang orisinal akan tetap dipertahankan.
55
55
56
-
#### Returns {/*returns*/}
56
+
#### Kembalian {/*returns*/}
57
57
58
-
`cloneElement`returns a React element object with a few properties:
58
+
`cloneElement`mengembalikan objek elemen React dengan beberapa properti:
59
59
60
-
*`type`: Same as`element.type`.
61
-
*`props`: The result of shallowly merging`element.props`with the overriding `props`you have passed.
62
-
*`ref`: The original `element.ref`, unless it was overridden by`props.ref`.
63
-
*`key`: The original `element.key`, unless it was overridden by`props.key`.
60
+
*`type`: Sama seperti`element.type`.
61
+
*`props`: Hasil dari penggabungan dangkal antara`element.props`dengan `props`yang Anda oper untuk menimpanya.
62
+
*`ref`: `element.ref` yang orisinal, kecuali telah ditimpa oleh`props.ref`.
63
+
*`key`: `element.key`, yang orisinal, kecuali telah ditimpa oleh`props.key`.
64
64
65
-
Usually, you'll return the element from your component or make it a child of another element. Although you may read the element's properties, it's best to treat every element as opaque after it's created, and only render it.
65
+
Biasanya, Anda akan mengembalikan elemen dari sebuah komponen atau membuatnya sebagai anak dari elemen lain. Meskipun Anda mungkin membaca properti elemen tersebut, sebaiknya Anda memperlakukan setiap elemen sebagai objek tersembunyi setelah dibuat, dan hanya me-*render*-nya.
66
66
67
-
#### Caveats {/*caveats*/}
67
+
#### Catatan penting {/*caveats*/}
68
68
69
-
*Cloning an element**does not modify the original element.**
69
+
*Mengkloning sebuah elemen**tidak mengubah elemen yang orisinal**.
70
70
71
-
*You should only**pass children as multiple arguments to`cloneElement`if they are all statically known,**like`cloneElement(element, null, child1, child2, child3)`. If your children are dynamic, pass the entire array as the third argument: `cloneElement(element, null, listItems)`. This ensures that React will [warn you about missing `key`s](/learn/rendering-lists#keeping-list-items-in-order-with-key)for any dynamic lists. For static lists this is not necessary because they never reorder.
71
+
*Sebaiknya Anda hanya**mengoper *children* sebagai beberapa argumen ke`cloneElement`jika semuanya diketahui secara statis,**seperti`cloneElement(element, null, child1, child2, child3)`. Jika *children* Anda dinamis, oper seluruh senarai sebagai argumen ketiga: `cloneElement(element, null, listItems)`. Ini memastikan bahwa React akan [memperingatkan Anda tentang `key` yang hilang](/learn/rendering-lists#keeping-list-items-in-order-with-key)untuk setiap *list* dinamis. Untuk *list* statis hal tersebut tidak diperlukan karena tidak pernah diurutkan ulang.
72
72
73
-
*`cloneElement`makes it harder to trace the data flow, so**try the [alternatives](#alternatives)instead.**
73
+
*`cloneElement`membuat pelacakan aliran data lebih sulit, jadi**cobalah beberapa [alternatif](#alternatives)sebagai gantinya.**
74
74
75
75
---
76
76
77
-
## Usage {/*usage*/}
77
+
## Penggunaan {/*usage*/}
78
78
79
-
### Overriding props of an element {/*overriding-props-of-an-element*/}
79
+
### Menimpa props dari suatu elemen {/*overriding-props-of-an-element*/}
80
80
81
-
To override the props of some <CodeStepstep={1}>React element</CodeStep>, pass it to `cloneElement`with the <CodeStepstep={2}>props you want to override</CodeStep>:
81
+
Untuk menimpa *prop* dari beberapa <CodeStepstep={1}>elemen React</CodeStep>, oper ke `cloneElement`dengan <CodeStepstep={2}>*props* yang ingin Anda timpa</CodeStep>:
Here, the resulting <CodeStepstep={3}>cloned element</CodeStep> will be`<Row title="Cabbage" isHighlighted={true} />`.
93
+
Hasil dari <CodeStepstep={3}>elemen yang dikloning</CodeStep> akan menjadi`<Row title="Cabbage" isHighlighted={true} />`.
94
94
95
-
**Let's walk through an example to see when it's useful.**
95
+
**Mari telusuri contoh untuk melihat kapan hal tersebut berguna.**
96
96
97
-
Imagine a`List`component that renders its [`children`](/learn/passing-props-to-a-component#passing-jsx-as-children) as a list of selectable rows with a "Next" button that changes which row is selected. The`List`component needs to render the selected `Row`differently, so it clones every`<Row>`child that it has received, and adds an extra `isHighlighted: true`or`isHighlighted: false` prop:
97
+
Bayangkan komponen`List`yang me-*render*[`children`](/learn/passing-props-to-a-component#passing-jsx-as-children)nya sebagai daftar baris yang dapat dipilih dengan tombol "Next" yang dapat merubah baris mana yang dipilih. Komponen`List`perlu me-*render*`Row`yang dipilih secara terpisah, lalu mengkloning setiap anak`<Row>`yang telah diterima, dan menambahkan *prop*`isHighlighted: true`atau`isHighlighted: false`:
98
98
99
99
```js {6-8}
100
100
exportdefaultfunctionList({ children }) {
@@ -108,7 +108,7 @@ export default function List({ children }) {
108
108
)}
109
109
```
110
110
111
-
Let's say the original JSX received by `List`looks like this:
111
+
Katakanlah JSX asli yang diterima oleh `List`terlihat seperti ini:
112
112
113
113
```js {2-4}
114
114
<List>
@@ -118,7 +118,7 @@ Let's say the original JSX received by `List` looks like this:
118
118
</List>
119
119
```
120
120
121
-
By cloning its children, the `List`can pass extra information to every`Row`inside. The result looks like this:
121
+
Dengan mengkloning anaknya, `List`dapat meneruskan informasi tambahan ke setiap`Row`di dalamnya. Hasilnya terlihat seperti ini:
122
122
123
123
```js {4,8,12}
124
124
<List>
@@ -137,7 +137,7 @@ By cloning its children, the `List` can pass extra information to every `Row` in
137
137
</List>
138
138
```
139
139
140
-
Notice how pressing "Next" updates the state of the `List`, and highlights a different row:
140
+
Perhatikan saat menekan "Next" akan memperbarui *state* dari `List`, dan menyorot baris yang berbeda:
141
141
142
142
<Sandpack>
143
143
@@ -232,21 +232,21 @@ button {
232
232
233
233
</Sandpack>
234
234
235
-
To summarize, the `List`cloned the`<Row />`elements it received and added an extra prop to them.
235
+
Ringkasnya, `List`mengkloning elemen`<Row />`yang diterimanya dan menambahkan *prop* tambahan ke dalamnya.
236
236
237
237
<Pitfall>
238
238
239
-
Cloning children makes it hard to tell how the data flows through your app. Try one of the [alternatives.](#alternatives)
239
+
Mengkloning *children* mempersulit untuk mengetahui bagaimana aliran data di aplikasi Anda. Coba salah satu [alternatif.](#alternatives)
240
240
241
241
</Pitfall>
242
242
243
243
---
244
244
245
-
## Alternatives {/*alternatives*/}
245
+
## Alternatif {/*alternatives*/}
246
246
247
-
### Passing data with a render prop {/*passing-data-with-a-render-prop*/}
247
+
### Mengoper data dengan render prop {/*passing-data-with-a-render-prop*/}
248
248
249
-
Instead of using `cloneElement`, consider accepting a *render prop* like`renderItem`. Here, `List`receives`renderItem`as a prop. `List`calls`renderItem`for every item and passes`isHighlighted`as an argument:
249
+
Daripada menggunakan `cloneElement`, pertimbangkan untuk menerima *render prop* seperti`renderItem`. Di sini, `List`menerima`renderItem`sebagai *prop*. `List`memanggil`renderItem`untuk setiap item dan mengoper`isHighlighted`sebagai argumen:
The`renderItem`prop is called a "render prop" because it's a prop that specifies how to render something. For example, you can pass a `renderItem`implementation that renders a `<Row>`with the given `isHighlighted`value:
262
+
*Prop*`renderItem`disebut "render prop" karena merupakan *prop* yang menentukan cara me-*render* sesuatu. Misalnya, Anda dapat mengoper `renderItem`yang me-*render* `<Row>`dengan nilai `isHighlighted`yang diberikan:
263
263
264
264
```js {3,7}
265
265
<List
@@ -274,7 +274,7 @@ The `renderItem` prop is called a "render prop" because it's a prop that specifi
274
274
/>
275
275
```
276
276
277
-
The end result is the same as with`cloneElement`:
277
+
Hasil akhirnya sama dengan`cloneElement`:
278
278
279
279
```js {4,8,12}
280
280
<List>
@@ -293,7 +293,7 @@ The end result is the same as with `cloneElement`:
293
293
</List>
294
294
```
295
295
296
-
However, you can clearly trace where the `isHighlighted`value is coming from.
296
+
Namun, Anda dapat dengan mudah melacak dari mana nilai `isHighlighted`berasal.
297
297
298
298
<Sandpack>
299
299
@@ -389,22 +389,21 @@ button {
389
389
390
390
</Sandpack>
391
391
392
-
This pattern is preferred to`cloneElement`because it is more explicit.
392
+
Pola ini lebih anjurkan daripada`cloneElement`karena lebih eksplisit.
393
393
394
394
---
395
395
396
-
### Passing data through context {/*passing-data-through-context*/}
396
+
### Mengoper data melalui context {/*passing-data-through-context*/}
397
397
398
-
Another alternative to`cloneElement`is to [pass data through context.](/learn/passing-data-deeply-with-context)
398
+
Alternatif lain untuk`cloneElement`adalah [mengoper data melalui *context*.](/learn/passing-data-deeply-with-context)
399
399
400
-
401
-
For example, you can call [`createContext`](/reference/react/createContext) to define a `HighlightContext`:
400
+
Sebagai contoh, Anda dapat memanggil [`createContext`](/reference/react/createContext) untuk mendefinisikan `HighlightContext`:
402
401
403
402
```js
404
403
exportconstHighlightContext=createContext(false);
405
404
```
406
405
407
-
Your`List`component can wrap every item it renders into a `HighlightContext` provider:
406
+
Komponen`List`dapat menggabungkan setiap item yang di-*render* ke dalam *provider* `HighlightContext`:
With this approach, `Row`does not need to receive an `isHighlighted`prop at all. Instead, it reads the context:
423
+
Dengan pendekatan ini, `Row`tidak perlu menerima *prop* `isHighlighted`sama sekali. Sebaliknya, dengan membaca *context*-nya:
425
424
426
425
```js Row.js {2}
427
426
exportdefaultfunctionRow({ title }) {
428
427
constisHighlighted=useContext(HighlightContext);
429
428
// ...
430
429
```
431
430
432
-
This allows the calling component to not know or worry about passing`isHighlighted`to`<Row>`:
431
+
Hal ini memungkinkan komponen pemanggil untuk tidak mengetahui atau peduli tentang pengoperan`isHighlighted`ke`<Row>`:
433
432
434
433
```js {4}
435
434
<List
@@ -440,7 +439,7 @@ This allows the calling component to not know or worry about passing `isHighligh
440
439
/>
441
440
```
442
441
443
-
Instead, `List`and`Row`coordinate the highlighting logic through context.
442
+
Sebagai gantinya, `List`dan`Row`mengoordinasikan logika penyorotan melalui *context*.
444
443
445
444
<Sandpack>
446
445
@@ -550,13 +549,13 @@ button {
550
549
551
550
</Sandpack>
552
551
553
-
[Learn more about passing data through context.](/reference/react/useContext#passing-data-deeply-into-the-tree)
552
+
[Pelajari lebih lanjut tentang mengoper data melalui *context*.](/reference/react/useContext#passing-data-deeply-into-the-tree)
554
553
555
554
---
556
555
557
-
### Extracting logic into a custom Hook {/*extracting-logic-into-a-custom-hook*/}
556
+
### Mengekstraksi logika ke dalam Hook kustom {/*extracting-logic-into-a-custom-hook*/}
558
557
559
-
Another approach you can try is to extract the "non-visual" logic into your own Hook, and use the information returned by your Hook to decide what to render. For example, you could write a `useList`custom Hook like this:
558
+
Pendekatan lain yang dapat Anda coba adalah mengekstrak logika "non-visual" ke dalam Hook Anda sendiri, dan menggunakan informasi yang dikembalikan oleh Hook Anda untuk memutuskan apa yang akan di-*render*. Misalnya, Anda dapat menulis Hook kustom `useList`seperti ini:
560
559
561
560
```js
562
561
import { useState } from'react';
@@ -575,7 +574,7 @@ export default function useList(items) {
575
574
}
576
575
```
577
576
578
-
Then you could use it like this:
577
+
Lalu Anda dapat menggunakannya seperti ini:
579
578
580
579
```js {2,9,13}
581
580
exportdefaultfunctionApp() {
@@ -598,7 +597,7 @@ export default function App() {
598
597
}
599
598
```
600
599
601
-
The data flow is explicit, but the state is inside the `useList`custom Hook that you can use from any component:
600
+
Aliran datanya eksplisit, tetapi *state* ada di dalam Hook kustom `useList`yang dapat Anda gunakan dari komponen apa pun:
602
601
603
602
<Sandpack>
604
603
@@ -691,4 +690,4 @@ button {
691
690
692
691
</Sandpack>
693
692
694
-
This approach is particularly useful if you want to reuse this logic between different components.
693
+
Pendekatan ini sangat berguna jika Anda ingin menggunakan kembali logika ini di komponen yang berbeda.
0 commit comments