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/queueing-a-series-of-state-updates.md
+15-15Lines changed: 15 additions & 15 deletions
Original file line number
Diff line number
Diff line change
@@ -1,16 +1,16 @@
1
1
---
2
-
title: Xếp hàng đợi cho một chuỗi các cập nhật state
2
+
title: Xử lí hàng đợi cho một chuỗi các cập nhật state liên tiếp
3
3
---
4
4
5
5
<Intro>
6
6
7
-
Thiết lập một biến state sẽ đưa một lần render khác vào hàng đợi. Nhưng đôi khi bạn có thể muốn thực hiện nhiều thao tác trên giá trị đó trước khi đưa lần render tiếp theo vào hàng đợi. Để làm điều này, sẽ hữu ích khi hiểu cách React gom nhóm các cập nhật state.
7
+
Thiết lập một biến state sẽ đưa một lần render khác vào hàng đợi. Nhưng đôi khi bạn có thể muốn thực hiện nhiều thao tác trên giá trị đó trước khi đưa lần render tiếp theo vào hàng đợi. Để làm điều này, bạn nên hiểu cách React gom nhóm các cập nhật state.
8
8
9
9
</Intro>
10
10
11
11
<YouWillLearn>
12
12
13
-
* "Batching" là gì và React sử dụng nó như thế nào để xử lý nhiều cập nhật state
13
+
* "Batching" (gom nhóm) là gì và React sử dụng nó như thế nào để xử lý nhiều cập nhật state
14
14
* Cách áp dụng liên tiếp nhiều cập nhật cho cùng một biến state
Ở đây, `n => n + 1` được gọi là **updater function.** Khi bạn truyền nó cho một state setter:
102
+
Ở đây, `n => n + 1` được gọi là **updater (cập nhật) function.** Khi bạn truyền nó cho một state setter:
103
103
104
104
1. React đưa function này vào hàng đợi để được xử lý sau khi tất cả code khác trong event handler đã chạy.
105
105
2. Trong lần render tiếp theo, React duyệt qua hàng đợi và cung cấp cho bạn state cuối cùng đã cập nhật.
@@ -116,7 +116,7 @@ setNumber(n => n + 1);
116
116
1.`setNumber(n => n + 1)`: `n => n + 1` là một function. React thêm nó vào hàng đợi.
117
117
1.`setNumber(n => n + 1)`: `n => n + 1` là một function. React thêm nó vào hàng đợi.
118
118
119
-
Khi bạn gọi `useState` trong lần render tiếp theo, React duyệt qua hàng đợi. State `number` trước đó là `0`, vì vậy đó là những gì React truyền cho updater function đầu tiên làm tham số `n`. Sau đó React lấy giá trị trả về của updater function trước đó và truyền nó cho updater tiếp theo làm `n`, và cứ thế:
119
+
Khi bạn gọi `useState` trong lần render tiếp theo, React duyệt qua hàng đợi. State `number` trước đó là `0`, vì vậy đó là giá trị React truyền cho updater function đầu tiên làm tham số `n`. Sau đó React lấy giá trị trả về của updater function trước đó và truyền nó cho updater tiếp theo làm `n`, và cứ thế:
120
120
121
121
| cập nhật trong hàng đợi |`n`| trả về |
122
122
|--------------|---------|-----|
@@ -247,7 +247,7 @@ Sau đó React lưu trữ `42` là kết quả cuối cùng và trả về nó t
247
247
***Một updater function** (ví dụ `n => n + 1`) được thêm vào hàng đợi.
248
248
***Bất kỳ giá trị nào khác** (ví dụ số `5`) thêm "thay thế bằng `5`" vào hàng đợi, bỏ qua những gì đã có trong hàng đợi.
249
249
250
-
Sau khi event handler hoàn thành, React sẽ kích hoạt một lần render lại. Trong quá trình render lại, React sẽ xử lý hàng đợi. Các updater function chạy trong quá trình rendering, vì vậy **các updater function phải [thuần khiết](/learn/keeping-components-pure)** và chỉ *trả về* kết quả. Đừng cố gắng set state từ bên trong chúng hoặc chạy các side effect khác. Trong Strict Mode, React sẽ chạy mỗi updater function hai lần (nhưng bỏ qua kết quả lần thứ hai) để giúp bạn tìm ra lỗi.
250
+
Sau khi event handler hoàn thành, React sẽ kích hoạt một lần render lại. Trong quá trình render lại, React sẽ xử lý hàng đợi. Các updater function chạy trong quá trình rendering, vì vậy **các updater function phải [thuần khiết](/learn/keeping-components-pure)** và chỉ *trả về* kết quả. Đừng cố gắng set state từ bên trong chúng hoặc chạy các side effect (hiệu ứng ngoài lề) khác. Trong Strict Mode, React sẽ chạy mỗi updater function hai lần (nhưng bỏ qua kết quả lần thứ hai) để giúp bạn tìm ra lỗi.
251
251
252
252
### Quy ước đặt tên {/*naming-conventions*/}
253
253
@@ -263,7 +263,7 @@ Nếu bạn thích code chi tiết hơn, một quy ước phổ biến khác là
263
263
264
264
<Recap>
265
265
266
-
* Thiết lập state không thay đổi biến trong lần render hiện tại, nhưng nó yêu cầu một lần render mới.
266
+
* Thiết lập state không thay đổi biến trong lần render hiện tại, nhưng nó kích hoạt một lần render mới.
267
267
* React xử lý các cập nhật state sau khi các event handler đã chạy xong. Điều này được gọi là batching.
268
268
* Để cập nhật một số state nhiều lần trong một sự kiện, bạn có thể sử dụng updater function `setNumber(n => n + 1)`.
269
269
@@ -275,9 +275,9 @@ Nếu bạn thích code chi tiết hơn, một quy ước phổ biến khác là
275
275
276
276
#### Sửa bộ đếm yêu cầu {/*fix-a-request-counter*/}
277
277
278
-
Bạn đang làm việc trên một ứng dụng thị trường nghệ thuật cho phép người dùng gửi nhiều đơn hàng cho một tác phẩm nghệ thuật cùng một lúc. Mỗi khi người dùng nhấn nút "Buy", bộ đếm "Pending" sẽ tăng lên một. Sau ba giây, bộ đếm "Pending" sẽ giảm xuống, và bộ đếm "Completed" sẽ tăng lên.
278
+
Bạn đang xây dựng một ứng dụng thị trường để buôn bán nghệ thuật mà cho phép người dùng gửi nhiều đơn hàng cho một tác phẩm nghệ thuật cùng một lúc. Mỗi khi người dùng nhấn nút "Buy (Mua hàng)", bộ đếm "Pending (Đang xử lí)" sẽ tăng lên một. Sau ba giây, bộ đếm "Pending" sẽ giảm xuống, và bộ đếm "Completed (Hoàn tất)" sẽ tăng lên.
279
279
280
-
Tuy nhiên, bộ đếm "Pending" không hoạt động như dự định. Khi bạn nhấn "Buy", nó giảm xuống `-1` (điều này không thể xảy ra!). Và nếu bạn nhấp nhanh hai lần, cả hai bộ đếm dường như hoạt động không thể đoán trước.
280
+
Tuy nhiên, bộ đếm "Pending" không hoạt động như dự định. Khi bạn nhấn "Buy", nó giảm xuống `-1` (điều này không nên xảy ra!). Và nếu bạn nhấp nhanh hai lần, cả hai bộ đếm dường như hoạt động một cách khó đoán.
281
281
282
282
Tại sao điều này xảy ra? Hãy sửa cả hai bộ đếm.
283
283
@@ -323,7 +323,7 @@ function delay(ms) {
323
323
324
324
<Solution>
325
325
326
-
Bên trong event handler `handleClick`, các giá trị của `pending` và `completed` tương ứng với những gì chúng có tại thời điểm sự kiện click. Đối với lần render đầu tiên, `pending` là `0`, vì vậy `setPending(pending - 1)` trở thành `setPending(-1)`, điều này sai. Vì bạn muốn *tăng* hoặc *giảm* các bộ đếm, thay vì set chúng thành một giá trị cụ thể được xác định trong lúc click, bạn có thể truyền các updater function thay thế:
326
+
Bên trong event handler `handleClick`, các giá trị của `pending` và `completed` tương ứng với những gì chúng có tại thời điểm sự kiện click xảy ra. Đối với lần render đầu tiên, `pending` là `0`, vì vậy `setPending(pending - 1)` trở thành `setPending(-1)`, điều này sai. Vì bạn muốn *tăng* hoặc *giảm* các bộ đếm, thay vì gán chúng thành một giá trị cụ thể được xác định trong lúc click, bạn có thể truyền các updater function thay thế:
327
327
328
328
<Sandpack>
329
329
@@ -365,23 +365,23 @@ function delay(ms) {
365
365
366
366
</Sandpack>
367
367
368
-
Điều này đảm bảo rằng khi bạn tăng hoặc giảm một bộ đếm, bạn làm điều đó liên quan đến state *mới nhất* của nó thay vì state tại thời điểm click.
368
+
Điều này đảm bảo rằng khi bạn tăng hoặc giảm một bộ đếm, bạn thực hiện nó dựa trên state *mới nhất* của bộ đếm thay vì state tại thời điểm click.
369
369
370
370
</Solution>
371
371
372
372
#### Tự triển khai hàng đợi state {/*implement-the-state-queue-yourself*/}
373
373
374
-
Trong thử thách này, bạn sẽ tự triển khai một phần nhỏ của React từ đầu! Nó không khó như nghe có vẻ.
374
+
Trong thử thách này, bạn sẽ tự triển khai một phần nhỏ của React từ đầu! Nó không khó như bạn nghĩ.
375
375
376
-
Cuộn qua bản xem trước sandbox. Lưu ý rằng nó hiển thị **bốn test case.** Chúng tương ứng với các ví dụ bạn đã thấy trước đó trên trang này. Nhiệm vụ của bạn là triển khai function `getFinalState` để nó trả về kết quả chính xác cho mỗi trường hợp đó. Nếu bạn triển khai chính xác, tất cả bốn bài test sẽ pass.
376
+
Hãy xem qua sandbox ở dưới. Lưu ý rằng nó hiển thị **bốn bài test.** Chúng tương ứng với các ví dụ bạn đã thấy trước đó trên trang này. Nhiệm vụ của bạn là triển khai function `getFinalState` để nó trả về kết quả chính xác cho mỗi trường hợp đó. Nếu bạn triển khai chính xác, bạn sẽ vượt qua bốn bài test.
377
377
378
378
Bạn sẽ nhận được hai tham số: `baseState` là state ban đầu (như `0`), và `queue` là một mảng chứa hỗn hợp các số (như `5`) và các updater function (như `n => n + 1`) theo thứ tự chúng được thêm vào.
379
379
380
380
Nhiệm vụ của bạn là trả về state cuối cùng, giống như các bảng trên trang này hiển thị!
381
381
382
382
<Hint>
383
383
384
-
Nếu bạn cảm thấy bế tắc, hãy bắt đầu với cấu trúc code này:
384
+
Nếu bạn không có ý tưởng, hãy bắt đầu với cấu trúc code này:
385
385
386
386
```js
387
387
exportfunctiongetFinalState(baseState, queue) {
@@ -597,7 +597,7 @@ function TestCase({
597
597
598
598
</Sandpack>
599
599
600
-
Bây giờ bạn đã biết cách phần này của React hoạt động!
600
+
Bây giờ bạn đã biết cách React hoạt động như thế nào trong phần này!
0 commit comments