Skip to content

Commit 3c9b3a6

Browse files
committed
feat(i18n): src/content/learn/scaling-up-with-reducer-and-context.md from English to Vietnamese
1 parent 17c8494 commit 3c9b3a6

File tree

1 file changed

+55
-55
lines changed

1 file changed

+55
-55
lines changed

src/content/learn/scaling-up-with-reducer-and-context.md

Lines changed: 55 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
---
2-
title: Scaling Up with Reducer and Context
2+
title: Mở rộng quy mô với Reducer Context
33
---
44

55
<Intro>
66

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 cho phép bạn hợp nhất logic cập nhật state của component. Context cho phép bạn truyền thông tin xuống sâu tới các component khác. Bạn có thể kết hợp reducer và context lại với nhau để quản lý state của một màn hình phức tạp.
88

99
</Intro>
1010

1111
<YouWillLearn>
1212

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+
* Cách kết hợp reducer với context
14+
* Cách tránh truyền state dispatch qua props
15+
* Cách giữ logic context state trong một file riêng biệt
1616

1717
</YouWillLearn>
1818

19-
## Combining a reducer with context {/*combining-a-reducer-with-context*/}
19+
## Kết hợp reducer với context {/*combining-a-reducer-with-context*/}
2020

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+
Trong ví dụ này từ [phần giới thiệu về reducer](/learn/extracting-state-logic-into-a-reducer), state được quản lý bởi một reducer. Function reducer chứa tất cả logic cập nhật state và được khai báo ở cuối file này:
2222

2323
<Sandpack>
2424

@@ -207,9 +207,9 @@ ul, li { margin: 0; padding: 0; }
207207

208208
</Sandpack>
209209

210-
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+
Một reducer giúp các event handler ngắn gọn và súc tích. Tuy nhiên, khi ứng dụng của bạn phát triển, bạn có thể gặp phải một khó khăn khác. **Hiện tại, `tasks` state và function `dispatch` chỉ có sẵn trong component cấp cao nhất `TaskApp`.** Để cho phép các component khác đọc danh sách task hoặc thay đổi nó, bạn phải một cách rõ ràng [truyền xuống](/learn/passing-props-to-a-component) state hiện tại và các event handler thay đổi nó dưới dạng props.
211211

212-
For example, `TaskApp` passes a list of tasks and the event handlers to `TaskList`:
212+
Ví dụ, `TaskApp` truyền danh sách task và các event handler tới `TaskList`:
213213

214214
```js
215215
<TaskList
@@ -219,7 +219,7 @@ For example, `TaskApp` passes a list of tasks and the event handlers to `TaskLis
219219
/>
220220
```
221221

222-
And `TaskList` passes the event handlers to `Task`:
222+
`TaskList` truyền các event handler tới `Task`:
223223

224224
```js
225225
<Task
@@ -229,30 +229,30 @@ And `TaskList` passes the event handlers to `Task`:
229229
/>
230230
```
231231

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+
Trong một ví dụ nhỏ như thế này, điều này hoạt động tốt, nhưng nếu bạn có hàng chục hoặc hàng trăm component ở giữa, việc truyền xuống tất cả state và function có thể khá bực bội!
233233

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+
Đây là lý do tại sao, như một giải pháp thay thế cho việc truyền chúng qua props, bạn có thể muốn đặt cả `tasks` state và function `dispatch` [vào context.](/learn/passing-data-deeply-with-context) **Bằng cách này, bất kỳ component nào bên dưới `TaskApp` trong cây có thể đọc task và dispatch action mà không cần "prop drilling" lặp đi lặp lại.**
235235

236-
Here is how you can combine a reducer with context:
236+
Đây là cách bạn có thể kết hợp reducer với context:
237237

238-
1. **Create** the context.
239-
2. **Put** state and dispatch into context.
240-
3. **Use** context anywhere in the tree.
238+
1. **Tạo** context.
239+
2. **Đặt** state dispatch vào context.
240+
3. **Use** context ở bất kỳ đâu trong cây.
241241

242-
### Step 1: Create the context {/*step-1-create-the-context*/}
242+
### Bước 1: Tạo context {/*step-1-create-the-context*/}
243243

244-
The `useReducer` Hook returns the current `tasks` and the `dispatch` function that lets you update them:
244+
Hook `useReducer` trả về `tasks` hiện tại và function `dispatch` cho phép bạn cập nhật chúng:
245245

246246
```js
247247
const [tasks, dispatch] = useReducer(tasksReducer, initialTasks);
248248
```
249249

250-
To pass them down the tree, you will [create](/learn/passing-data-deeply-with-context#step-2-use-the-context) two separate contexts:
250+
Để truyền chúng xuống cây, bạn sẽ [tạo](/learn/passing-data-deeply-with-context#step-2-use-the-context) hai context riêng biệt:
251251

252-
- `TasksContext` provides the current list of tasks.
253-
- `TasksDispatchContext` provides the function that lets components dispatch actions.
252+
* `TasksContext` cung cấp danh sách task hiện tại.
253+
* `TasksDispatchContext` cung cấp function cho phép các component dispatch action.
254254

255-
Export them from a separate file so that you can later import them from other files:
255+
Export chúng từ một file riêng biệt để sau này bạn có thể import chúng từ các file khác:
256256

257257
<Sandpack>
258258

@@ -448,11 +448,11 @@ ul, li { margin: 0; padding: 0; }
448448

449449
</Sandpack>
450450

451-
Here, you're passing `null` as the default value to both contexts. The actual values will be provided by the `TaskApp` component.
451+
Ở đây, bạn đang truyền `null` làm giá trị mặc định cho cả hai context. Các giá trị thực tế sẽ được cung cấp bởi component `TaskApp`.
452452

453-
### Step 2: Put state and dispatch into context {/*step-2-put-state-and-dispatch-into-context*/}
453+
### Bước 2: Đặt state dispatch vào context {/*step-2-put-state-and-dispatch-into-context*/}
454454

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+
Bây giờ bạn có thể import cả hai context trong component `TaskApp` của mình. Lấy `tasks` `dispatch` được trả về bởi `useReducer()` [cung cấp chúng](/learn/passing-data-deeply-with-context#step-3-provide-the-context) cho toàn bộ cây bên dưới:
456456

457457
```js {4,7-8}
458458
import { TasksContext, TasksDispatchContext } from './TasksContext.js';
@@ -470,7 +470,7 @@ export default function TaskApp() {
470470
}
471471
```
472472

473-
For now, you pass the information both via props and in context:
473+
Hiện tại, bạn truyền thông tin cả qua props và trong context:
474474

475475
<Sandpack>
476476

@@ -669,11 +669,11 @@ ul, li { margin: 0; padding: 0; }
669669

670670
</Sandpack>
671671

672-
In the next step, you will remove prop passing.
672+
Trong bước tiếp theo, bạn sẽ loại bỏ việc truyền props.
673673

674-
### Step 3: Use context anywhere in the tree {/*step-3-use-context-anywhere-in-the-tree*/}
674+
### Bước 3: Use context ở bất kỳ đâu trong cây {/*step-3-use-context-anywhere-in-the-tree*/}
675675

676-
Now you don't need to pass the list of tasks or the event handlers down the tree:
676+
Bây giờ bạn không cần truyền danh sách task hoặc các event handler xuống cây:
677677

678678
```js {4-5}
679679
<TasksContext value={tasks}>
@@ -685,15 +685,15 @@ Now you don't need to pass the list of tasks or the event handlers down the tree
685685
</TasksContext>
686686
```
687687

688-
Instead, any component that needs the task list can read it from the `TaskContext`:
688+
Thay vào đó, bất kỳ component nào cần danh sách task có thể đọc nó từ `TaskContext`:
689689

690690
```js {2}
691691
export default function TaskList() {
692692
const tasks = useContext(TasksContext);
693693
// ...
694694
```
695695
696-
To update the task list, any component can read the `dispatch` function from context and call it:
696+
Để cập nhật danh sách task, bất kỳ component nào có thể đọc function `dispatch` từ context và gọi nó:
697697
698698
```js {3,9-13}
699699
export default function AddTask() {
@@ -713,7 +713,7 @@ export default function AddTask() {
713713
// ...
714714
```
715715
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+
**Component `TaskApp` không truyền bất kỳ event handler nào xuống, và `TaskList` cũng không truyền bất kỳ event handler nào tới component `Task`.** Mỗi component đọc context mà nó cần:
717717
718718
<Sandpack>
719719
@@ -897,11 +897,11 @@ ul, li { margin: 0; padding: 0; }
897897
898898
</Sandpack>
899899
900-
**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 vẫn "sống" trong component cấp cao nhất `TaskApp`, được quản lý bằng `useReducer`.** Nhưng `tasks` `dispatch` của nó giờ đây có sẵn cho mọi component bên dưới trong cây bằng cách import và use những context này.
901901
902-
## Moving all wiring into a single file {/*moving-all-wiring-into-a-single-file*/}
902+
## Chuyển tất cả wiring vào một file duy nhất {/*moving-all-wiring-into-a-single-file*/}
903903
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+
Bạn không bắt buộc phải làm điều này, nhưng bạn có thể làm gọn gàng hơn các component bằng cách chuyển cả reducer context vào một file duy nhất. Hiện tại, `TasksContext.js` chỉ chứa hai khai báo context:
905905
906906
```js
907907
import { createContext } from 'react';
@@ -910,11 +910,11 @@ export const TasksContext = createContext(null);
910910
export const TasksDispatchContext = createContext(null);
911911
```
912912
913-
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 này sắp trở nên đông đúc! Bạn sẽ chuyển reducer vào cùng file đó. Sau đó bạn sẽ khai báo một component `TasksProvider` mới trong cùng file. Component này sẽ kết nối tất cả các phần lại với nhau:
914914
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. Nó sẽ quản lý state bằng reducer.
916+
2. Nó sẽ cung cấp cả hai context cho các component bên dưới.
917+
3. Nó sẽ [nhận `children` làm prop](/learn/passing-props-to-a-component#passing-jsx-as-children) để bạn có thể truyền JSX vào nó.
918918
919919
```js
920920
export function TasksProvider({ children }) {
@@ -930,7 +930,7 @@ export function TasksProvider({ children }) {
930930
}
931931
```
932932
933-
**This removes all the complexity and wiring from your `TaskApp` component:**
933+
**Điều này loại bỏ tất cả sự phức tạp và wiring khỏi component `TaskApp` của bạn:**
934934
935935
<Sandpack>
936936
@@ -1121,7 +1121,7 @@ ul, li { margin: 0; padding: 0; }
11211121
11221122
</Sandpack>
11231123
1124-
You can also export functions that _use_ the context from `TasksContext.js`:
1124+
Bạn cũng có thể export những function *use* context từ `TasksContext.js`:
11251125
11261126
```js
11271127
export function useTasks() {
@@ -1133,14 +1133,14 @@ export function useTasksDispatch() {
11331133
}
11341134
```
11351135
1136-
When a component needs to read context, it can do it through these functions:
1136+
Khi một component cần đọc context, nó có thể làm điều đó thông qua những function này:
11371137
11381138
```js
11391139
const tasks = useTasks();
11401140
const dispatch = useTasksDispatch();
11411141
```
11421142
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+
Điều này không thay đổi hành vi theo bất kỳ cách nào, nhưng nó cho phép bạn sau này tách những context này thêm hoặc thêm một số logic vào những function này. **Bây giờ tất cả wiring context reducer đều nằm trong `TasksContext.js`. Điều này giữ cho các component sạch sẽ và gọn gàng, tập trung vào những gì chúng hiển thị hơn là nơi chúng lấy dữ liệu:**
11441144
11451145
<Sandpack>
11461146
@@ -1340,26 +1340,26 @@ ul, li { margin: 0; padding: 0; }
13401340
13411341
</Sandpack>
13421342
1343-
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+
Bạn có thể nghĩ về `TasksProvider` như một phần của màn hình biết cách xử lý task, `useTasks` như một cách để đọc chúng, và `useTasksDispatch` như một cách để cập nhật chúng từ bất kỳ component nào bên dưới trong cây.
13441344
13451345
<Note>
13461346
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+
Những function như `useTasks` `useTasksDispatch` được gọi là *[Custom Hooks.](/learn/reusing-logic-with-custom-hooks)* Function của bạn được coi là Custom Hook nếu tên của nó bắt đầu bằng `use`. Điều này cho phép bạn use các Hook khác, như `useContext`, bên trong nó.
13481348
13491349
</Note>
13501350
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+
Khi ứng dụng của bạn phát triển, bạn có thể có nhiều cặp context-reducer như thế này. Đây là một cách mạnh mẽ để mở rộng quy mô ứng dụng của bạn và [nâng state lên](/learn/sharing-state-between-components) mà không cần quá nhiều công việc bất cứ khi nào bạn muốn truy cập dữ liệu sâu trong cây.
13521352
13531353
<Recap>
13541354
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+
* Bạn có thể kết hợp reducer với context để cho phép bất kỳ component nào đọc và cập nhật state phía trên nó.
1356+
* Để cung cấp state và function dispatch cho các component bên dưới:
1357+
1. Tạo hai context (cho state và cho dispatch function).
1358+
2. Cung cấp cả hai context từ component use reducer.
1359+
3. Use context từ các component cần đọc chúng.
1360+
* Bạn có thể làm gọn gàng hơn các component bằng cách chuyển tất cả wiring vào một file.
1361+
* Bạn có thể export một component như `TasksProvider` để cung cấp context.
1362+
* Bạn cũng có thể export các Custom Hook như `useTasks` `useTasksDispatch` để đọc nó.
1363+
* Bạn có thể có nhiều cặp context-reducer như thế này trong ứng dụng của mình.
13641364
13651365
</Recap>

0 commit comments

Comments
 (0)