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/learn/scaling-up-with-reducer-and-context.md
+55-55Lines changed: 55 additions & 55 deletions
Original file line number
Diff line number
Diff line change
@@ -1,24 +1,24 @@
1
1
---
2
-
title: Scaling Up with Reducer and Context
2
+
title: Peningkatan Skala dengan Reducer dan Context
3
3
---
4
4
5
5
<Intro>
6
6
7
-
Reducers let you consolidate a component's state update logic. Context lets you pass information deep down to other components. You can combine reducers and context together to manage state of a complex screen.
7
+
Reducer memungkinkan Anda untuk mengonsolidasi logika pembaruan *state* komponen. *Context* memungkinkan Anda untuk mengirim informasi ke komponen lain yang lebih dalam. Anda dapat menggabungkan *reducer* dan *context* bersama-sama untuk mengelola *state* layar yang kompleks.
8
8
9
9
</Intro>
10
10
11
11
<YouWillLearn>
12
12
13
-
*How to combine a reducer with context
14
-
*How to avoid passing state and dispatch through props
15
-
*How to keep context and state logic in a separate file
13
+
*Bagaimana menggabungkan *reducer* dengan *context*
14
+
*Bagaimana menghindari mengoper *state* dan *dispatch* melalui *props*
15
+
*Bagaimana menjaga konteks dan logika *state* pada *file* terpisah
16
16
17
17
</YouWillLearn>
18
18
19
-
## Combining a reducer with context {/*combining-a-reducer-with-context*/}
19
+
## Menggabungkan *reducer* dengan *context* {/*combining-a-reducer-with-context*/}
20
20
21
-
In this example from [the introduction to reducers](/learn/extracting-state-logic-into-a-reducer), the state is managed by a reducer. The reducer function contains all of the state update logic and is declared at the bottom of this file:
21
+
Pada contoh dari [pengenalan *reducer*](/learn/extracting-state-logic-into-a-reducer), *state* dikelola oleh *reducer*. Fungsi *reducer* berisi semua logika pembaruan *state* dan dinyatakan di bagian bawah *file* ini:
A reducer helps keep the event handlers short and concise. However, as your app grows, you might run into another difficulty. **Currently, the `tasks`state and the `dispatch`function are only available in the top-level `TaskApp`component.** To let other components read the list of tasks or change it, you have to explicitly [pass down](/learn/passing-props-to-a-component)the current state and the event handlers that change it as props.
210
+
*Reducer* membantu menjaga event handlers menjadi singkat dan ringkas. Namun, ketika aplikasi Anda berkembang, Anda mungkin akan menemukan kesulitan lain. Saat ini, *state*`tasks`dan fungsi `dispatch`hanya tersedia di komponen `TaskApp`level atas. Untuk memungkinkan komponen lain membaca daftar tugas atau mengubahnya, Anda harus secara eksplisit [meneruskan](/learn/passing-props-to-a-component)*state* saat ini dan event handlers yang mengubahnya sebagai props.
211
211
212
-
For example, `TaskApp`passes a list of tasks and the event handlers to`TaskList`:
212
+
Misalnya, `TaskApp`meneruskan daftar tugas dan *event handlers* ke`TaskList`:
213
213
214
214
```js
215
215
<TaskList
@@ -219,7 +219,7 @@ For example, `TaskApp` passes a list of tasks and the event handlers to `TaskLis
219
219
/>
220
220
```
221
221
222
-
And`TaskList`passes the event handlers to`Task`:
222
+
Dan`TaskList`mengoper *event handlers* ke`Task`:
223
223
224
224
```js
225
225
<Task
@@ -229,30 +229,30 @@ And `TaskList` passes the event handlers to `Task`:
229
229
/>
230
230
```
231
231
232
-
In a small example like this, this works well, but if you have tens or hundreds of components in the middle, passing down all state and functions can be quite frustrating!
232
+
Dalam contoh kecil seperti ini, cara ini dapat berfungsi dengan baik, namun jika Anda memiliki puluhan atau ratusan komponen di tengah, meneruskan semua *state* dan fungsi dapat sangat menjengkelkan!
233
233
234
-
This is why, as an alternative to passing them through props, you might want to put both the `tasks` state and the `dispatch`function [into context.](/learn/passing-data-deeply-with-context)**This way, any component below `TaskApp`in the tree can read the tasks and dispatch actions without the repetitive "prop drilling".**
234
+
Inilah mengapa, sebagai alternatif untuk melewatkan melalui props, Anda mungkin ingin menempatkan baik *state*`tugas` maupun fungsi `dispatch`[ke dalam *context*](/learn/passing-data-deeply-with-context). **Dengan cara ini, komponen apa pun di bawah `TaskApp`dalam pohon (*tree*) dapat membaca tugas dan melakukan aksi *dispatch* tanpa “*prop drilling*” yang berulang.**
235
235
236
-
Here is how you can combine a reducer with context:
236
+
Berikut adalah cara menggabungkan *reducer* dengan conteks:
237
237
238
-
1.**Create**the context.
239
-
2.**Put** state and dispatch into context.
240
-
3.**Use** context anywhere in the tree.
238
+
1.**Buatlah***context*.
239
+
2.**Letakkan***state* dan *dispatch* ke dalam *context*.
240
+
3.**Gunakan***context* di mana saja dalam *tree*.
241
241
242
-
### Step 1: Create the context {/*step-1-create-the-context*/}
242
+
### Langkah 1: Buat context {/*step-1-create-the-context*/}
243
243
244
-
The`useReducer`Hook returns the current `tasks`and the `dispatch`function that lets you update them:
244
+
Hook`useReducer`mengembalikan `tasks`saat ini dan fungsi `dispatch`yang memungkinkan Anda memperbaruinya:
Here, you're passing`null`as the default value to both contexts. The actual values will be provided by the `TaskApp` component.
451
+
Di sini, Anda meneruskan`null`sebagai nilai *default* ke kedua *context*. Nilai aktual akan disediakan oleh komponen `TaskApp`.
452
452
453
-
### Step 2: Put state and dispatch into context {/*step-2-put-state-and-dispatch-into-context*/}
453
+
### Langkah 2: Letakkan *state* dan *dispatch* ke dalam *context* {/*step-2-put-state-and-dispatch-into-context*/}
454
454
455
-
Now you can import both contexts in your`TaskApp`component. Take the `tasks`and`dispatch`returned by `useReducer()`and [provide them](/learn/passing-data-deeply-with-context#step-3-provide-the-context)to the entire tree below:
455
+
Sekarang Anda dapat mengimpor kedua *context* di komponen`TaskApp`Anda. Ambil `tasks`dan`dispatch`yang dikembalikan oleh `useReducer()`dan [sediakan mereka](/learn/passing-data-deeply-with-context#step-3-provide-the-context)kepada seluruh pohon (*tree*) di bawahnya:
Pada langkah selanjutnya, Anda akan menghapus pengoperan *prop*.
673
673
674
-
### Step 3: Use context anywhere in the tree {/*step-3-use-context-anywhere-in-the-tree*/}
674
+
### Langkah 3: Gunakan *context* di mana saja dalam pohon {/*step-3-use-context-anywhere-in-the-tree*/}
675
675
676
-
Now you don't need to pass the list of tasks or the event handlers down the tree:
676
+
Sekarang Anda tidak perlu lagi meneruskan daftar tugas atau *event handler* ke bawah pohon:
677
677
678
678
```js {4-5}
679
679
<TasksContext.Provider value={tasks}>
@@ -685,15 +685,15 @@ Now you don't need to pass the list of tasks or the event handlers down the tree
685
685
</TasksContext.Provider>
686
686
```
687
687
688
-
Instead, any component that needs the task list can read it from the`TaskContext`:
688
+
Sebaliknya, komponen mana pun yang memerlukan daftar tugas dapat membacanya dari`TaskContext`:
689
689
690
690
```js {2}
691
691
exportdefaultfunctionTaskList() {
692
692
consttasks=useContext(TasksContext);
693
693
// ...
694
694
```
695
695
696
-
To update the task list, any component can read the `dispatch`function from context and call it:
696
+
Untuk memperbarui daftar tugas, komponen mana pun dapat membaca fungsi `dispatch`dari *context* dan memanggilnya:
697
697
698
698
```js {3,9-13}
699
699
exportdefaultfunctionAddTask() {
@@ -713,7 +713,7 @@ export default function AddTask() {
713
713
// ...
714
714
```
715
715
716
-
**The`TaskApp`component does not pass any event handlers down, and the `TaskList`does not pass any event handlers to the`Task` component either.** Each component reads the context that it needs:
716
+
**Komponen`TaskApp`tidak meneruskan *event handler* ke bawah, dan `TaskList`juga tidak meneruskan event handler ke komponen`Task`.** Setiap komponen membaca *context* yang dibutuhkannya:
**The state still "lives" in the top-level`TaskApp`component, managed with`useReducer`.** But its`tasks`and `dispatch`are now available to every component below in the tree by importing and using these contexts.
900
+
***State* masih "berada" di dalam komponen`TaskApp`level atas, dikelola dengan`useReducer`.** Tetapi daftar`tasks`dan fungsi `dispatch`sekarang tersedia untuk setiap komponen di bawah pohon tersebut dengan mengimpor dan menggunakan *context* tersebut.
901
901
902
-
## Moving all wiring into a single file {/*moving-all-wiring-into-a-single-file*/}
902
+
## Memindahkan semua penghubung ke satu file {/*moving-all-wiring-into-a-single-file*/}
903
903
904
-
You don't have to do this, but you could further declutter the components by moving both reducer and context into a single file. Currently, `TasksContext.js`contains only two context declarations:
904
+
Anda tidak harus melakukannya, tetapi Anda dapat membersihkan komponen dengan memindahkan *reducer* dan *context* ke dalam satu file. Saat ini, `TasksContext.js`hanya berisi dua deklarasi *context*:
This file is about to get crowded! You'll move the reducer into that same file. Then you'll declare a new`TasksProvider`component in the same file. This component will tie all the pieces together:
913
+
*File* ini akan semakin ramai! Anda akan memindahkan *reducer* ke dalam *file* yang sama. Kemudian Anda akan mendeklarasikan komponen`TasksProvider`baru dalam *file* yang sama. Komponen ini akan mengikat semua bagian bersama-sama:
914
914
915
-
1. It will manage the state with a reducer.
916
-
2. It will provide both contexts to components below.
917
-
3. It will [take `children` as a prop](/learn/passing-props-to-a-component#passing-jsx-as-children) so you can pass JSX to it.
915
+
1. Ia akan mengelola *state* dengan *reducer*.
916
+
2. Ia akan menyediakan kedua *context* ke komponen di bawahnya.
917
+
3. Ia akan [mengambil *children* sebagai prop](/learn/passing-props-to-a-component#passing-jsx-as-children) sehingga Anda dapat mengoper JSX kepadanya.
918
918
919
919
```js
920
920
exportfunctionTasksProvider({ children }) {
@@ -930,7 +930,7 @@ export function TasksProvider({ children }) {
930
930
}
931
931
```
932
932
933
-
**This removes all the complexity and wiring from your `TaskApp`component:**
933
+
**Ini menghilangkan semua kompleksitas dan penghubung dari komponen `TaskApp`Anda:**
You can also export functions that _use_ the context from`TasksContext.js`:
1124
+
Anda juga dapat mengekspor fungsi-fungsi yang *menggunakan* *context* dari`TasksContext.js`:
1125
1125
1126
1126
```js
1127
1127
exportfunctionuseTasks() {
@@ -1133,14 +1133,14 @@ export function useTasksDispatch() {
1133
1133
}
1134
1134
```
1135
1135
1136
-
When a component needs to read context, it can do it through these functions:
1136
+
Ketika sebuah komponen perlu membaca *context*, dapat dilakukan melalui fungsi-fungsi ini:
1137
1137
1138
1138
```js
1139
1139
consttasks=useTasks();
1140
1140
constdispatch=useTasksDispatch();
1141
1141
```
1142
1142
1143
-
This doesn't change the behavior in any way, but it lets you later split these contexts further or add some logic to these functions. **Now all of the context and reducer wiring is in `TasksContext.js`. This keeps the components clean and uncluttered, focused on what they display rather than where they get the data:**
1143
+
Hal ini tidak mengubah perilaku secara apa pun, tetapi memungkinkan Anda untuk memisahkan *context* ini lebih lanjut atau menambahkan beberapa logika ke fungsi-fungsi ini. **Sekarang semua pengaturan *context* dan *reducer* ada di `TasksContext.js`. Ini menjaga komponen tetap bersih dan tidak berantakan, fokus pada apa yang mereka tampilkan daripada dari mana mereka mendapatkan data:**
You can think of `TasksProvider`as a part of the screen that knows how to deal with tasks, `useTasks`as a way to read them, and`useTasksDispatch`as a way to update them from any component below in the tree.
1343
+
Anda dapat memandang `TasksProvider`sebagai bagian dari layar yang tahu cara menangani tugas, `useTasks`sebagai cara untuk membacanya, dan`useTasksDispatch`sebagai cara untuk memperbaruinya dari komponen mana pun di bawah pohon.
1344
1344
1345
1345
<Note>
1346
1346
1347
-
Functions like`useTasks`and`useTasksDispatch`are called *[Custom Hooks.](/learn/reusing-logic-with-custom-hooks)* Your function is considered a custom Hook if its name starts with `use`. This lets you use other Hooks, like`useContext`, inside it.
1347
+
Fungsi-fungsi seperti`useTasks`dan`useTasksDispatch`disebut dengan *[Hook Custom](/learn/reusing-logic-with-custom-hooks)*. Fungsi Anda dianggap sebagai *Hook custom* jika namanya dimulai dengan `use`. Ini memungkinkan Anda menggunakan Hooks lain, seperti`useContext`, di dalamnya.
1348
1348
1349
1349
</Note>
1350
1350
1351
-
As your app grows, you may have many context-reducer pairs like this. This is a powerful way to scale your app and [lift state up](/learn/sharing-state-between-components) without too much work whenever you want to access the data deep in the tree.
1351
+
Seiring dengan pertumbuhan aplikasi Anda, mungkin Anda akan memiliki banyak pasangan *context-reducer* seperti ini. Ini adalah cara yang kuat untuk meningkatkan aplikasi Anda dan [mengangkat *state* ke atas](/learn/sharing-state-between-components) tanpa terlalu banyak pekerjaan setiap kali Anda ingin mengakses data yang dalam di dalam pohon (*tree*).
1352
1352
1353
1353
<Recap>
1354
1354
1355
-
- You can combine reducer with context to let any component read and update state above it.
1356
-
- To provide state and the dispatch function to components below:
1357
-
1. Create two contexts (for state and for dispatch functions).
1358
-
2. Provide both contexts from the component that uses the reducer.
1359
-
3. Use either context from components that need to read them.
1360
-
- You can further declutter the components by moving all wiring into one file.
1361
-
- You can export a component like `TasksProvider`that provides context.
1362
-
- You can also export custom Hooks like `useTasks`and`useTasksDispatch`to read it.
1363
-
- You can have many context-reducer pairs like this in your app.
1355
+
- Anda dapat menggabungkan *reducer* dengan *context* untuk memungkinkan komponen mana pun membaca dan memperbarui *state* di atasnya.
1356
+
- Untuk menyediakan *state* dan fungsi *dispatch* ke komponen di bawah:
1357
+
1. Buat dua *context* (untuk *state* dan untuk fungsi *dispatch*).
1358
+
2. Sediakan kedua *context* dari komponen yang menggunakan *reducer*.
1359
+
3. Gunakan salah satu *context* dari komponen yang perlu membacanya.
1360
+
- Anda dapat memindahkan seluruh penghubung ke satu *file* untuk memperjelas komponen.
1361
+
- Anda dapat mengekspor komponen seperti `TasksProvider`yang menyediakan *context*.
1362
+
- Anda juga dapat mengekspor *Hooks Custom* seperti `useTasks`dan`useTasksDispatch`untuk membacanya.
1363
+
- Anda dapat memiliki banyak pasangan *context-reducer* seperti ini di aplikasi Anda.
0 commit comments