From c75b988763fdf33999f69865b41824900f139d2e Mon Sep 17 00:00:00 2001 From: Kim Minh Thang Date: Wed, 11 Sep 2024 17:07:58 +0700 Subject: [PATCH] Translation: Choosing the State Structure --- .../learn/choosing-the-state-structure.md | 556 +++++++++--------- src/sidebarLearn.json | 12 +- 2 files changed, 288 insertions(+), 280 deletions(-) diff --git a/src/content/learn/choosing-the-state-structure.md b/src/content/learn/choosing-the-state-structure.md index 5be2b4d34..c34189da1 100644 --- a/src/content/learn/choosing-the-state-structure.md +++ b/src/content/learn/choosing-the-state-structure.md @@ -1,53 +1,54 @@ --- -title: Choosing the State Structure +title: Lựa chọn cấu trúc cho state --- -Structuring state well can make a difference between a component that is pleasant to modify and debug, and one that is a constant source of bugs. Here are some tips you should consider when structuring state. +Cấu trúc state tốt có thể tạo ra sự khác biệt giữa một component dễ chỉnh sửa và debug và một component bị lỗi liên tục. Sau đây là một số mẹo bạn nên cân nhắc khi cấu trúc state. -* When to use a single vs multiple state variables -* What to avoid when organizing state -* How to fix common issues with the state structure +* Khi nào nên sử dụng nhiều state hay một state duy nhất cho nhiều giá trị +* Những điều cần tránh khi tổ chức state +* Cách để fix những lỗi phổ biến khi cấu trúc state -## Principles for structuring state {/*principles-for-structuring-state*/} +## Nguyên tắc khi cấu trúc state {/*principles-for-structuring-state*/} -When you write a component that holds some state, you'll have to make choices about how many state variables to use and what the shape of their data should be. While it's possible to write correct programs even with a suboptimal state structure, there are a few principles that can guide you to make better choices: +Khi bạn viết một component có chứa một vài state, bạn sẽ phải đưa ra quyết định về việc có bao nhiêu state cần sử dụng và cấu trúccủa chúng. Mặc dù có thể viết chương trình đúng ngay cả khi cấu trúc state không tối ưu, nhưng có một vài nguyên tắc có thể giúp bạn đưa ra những lựa chọn tốt hơn: -1. **Group related state.** If you always update two or more state variables at the same time, consider merging them into a single state variable. -2. **Avoid contradictions in state.** When the state is structured in a way that several pieces of state may contradict and "disagree" with each other, you leave room for mistakes. Try to avoid this. -3. **Avoid redundant state.** If you can calculate some information from the component's props or its existing state variables during rendering, you should not put that information into that component's state. -4. **Avoid duplication in state.** When the same data is duplicated between multiple state variables, or within nested objects, it is difficult to keep them in sync. Reduce duplication when you can. -5. **Avoid deeply nested state.** Deeply hierarchical state is not very convenient to update. When possible, prefer to structure state in a flat way. +1. **Nhóm các state có liên quan.** Nếu bạn luôn phải cập nhật hai hoặc nhiều hơn state cùng một lúc, hãy nghĩ đến việc gộp chúng vào một state duy nhất. +2. **Tránh sự mâu thuẫn trong state.** Khi state được cấu trúc sao cho một số phần của state có thể mâu thuẫn và "không đồng ý" với nhau, bạn để lại cơ hội cho lỗi. Hãy cố gắng tránh điều này. +3. **Tránh dư thừa state.** Nếu bạn có thể tính toán một số thông tin từ props của component hoặc các state hiện tại của nó trong quá trình render, bạn không nên đặt thông tin đó vào state của component đó. +4. **Tránh trùng lặp trong state.** Khi cùng một data được lặp lại giữa nhiều state hoặc trong các object lồng nhau, rất khó để giữ cho chúng đồng bộ với nhau. Hạn chế sự trùng lặp này khi bạn có thể. +5. **Tránh lồng state quá sâu.** State có cấu trúc phân cấp sâu rất không thuận tiện để cập nhật. Khi có thể, hãy ưu tiên cấu trúc state theo cách phẳng. -The goal behind these principles is to *make state easy to update without introducing mistakes*. Removing redundant and duplicate data from state helps ensure that all its pieces stay in sync. This is similar to how a database engineer might want to ["normalize" the database structure](https://docs.microsoft.com/en-us/office/troubleshoot/access/database-normalization-description) to reduce the chance of bugs. To paraphrase Albert Einstein, **"Make your state as simple as it can be--but no simpler."** +Mục tiêu đằng sau các quy tắc này là *làm cho state dễ dàng cập nhật mà không gây ra lỗi*. Xoá data dư thừa và trùng lặp khỏi state giúp đảm bảo rằng tất cả các phần của nó luông đồng bộ. Điều này gần giống với cách một database engineer muốn ["chuẩn hoá" cấu trúc database](https://docs.microsoft.com/en-us/office/troubleshoot/access/database-normalization-description) để giảm khả năng xảy ra lỗi. Để dùng lời của Albert Einstein, **"Hãy làm cho state của bạn đơn giản nhất có thể--nhưng không đơn giản hơn."** -Now let's see how these principles apply in action. -## Group related state {/*group-related-state*/} +Giờ hãy xem cách các nguyên tắc này được áp dụng trong thực tế. -You might sometimes be unsure between using a single or multiple state variables. +## Nhóm các state liên quan {/*group-related-state*/} -Should you do this? +Đôi khi bạn có thể không chắc chắn giữa việc sử dụng nhiều state hay một state duy nhất cho nhiều giá trị. + +Bạn nên làm như thế này? ```js const [x, setX] = useState(0); const [y, setY] = useState(0); ``` -Or this? +Hay như thế này? ```js const [position, setPosition] = useState({ x: 0, y: 0 }); ``` -Technically, you can use either of these approaches. But **if some two state variables always change together, it might be a good idea to unify them into a single state variable.** Then you won't forget to always keep them in sync, like in this example where moving the cursor updates both coordinates of the red dot: +Về mặt kỹ thuật, bạn có thể sử dụng một trong hai cách trên. Nhưng **nếu hai state luôn thay đổi cùng nhau, việc gộp chúng lại với nhau có thể là một ý tưởng tốt.** Khi đó, bạn không cần phải lo lắng về việc giữ cho chúng đồng bộ, giống như trong ví dụ dưới đây khi di chuyển con trỏ sẽ cập nhật cả hai tọa độ của chấm đỏ: @@ -93,17 +94,17 @@ body { margin: 0; padding: 0; height: 250px; } -Another case where you'll group data into an object or an array is when you don't know how many pieces of state you'll need. For example, it's helpful when you have a form where the user can add custom fields. +Một trường hợp khác là bạn sẽ nhóm data vào một object hoặc một mảng khi bạn không biết bạn sẽ cần bao nhiêu state. Ví dụ, nó rất hữu ích khi bạn có một form mà người dùng có thể thêm các trường tùy chỉnh. -If your state variable is an object, remember that [you can't update only one field in it](/learn/updating-objects-in-state) without explicitly copying the other fields. For example, you can't do `setPosition({ x: 100 })` in the above example because it would not have the `y` property at all! Instead, if you wanted to set `x` alone, you would either do `setPosition({ ...position, x: 100 })`, or split them into two state variables and do `setX(100)`. +Nếu state của bạn là một object, hãy nhớ rằng [bạn không thể chỉ cập nhật một trường của nó](/learn/updating-objects-in-state) mà không phải sao chép các trường khác. Ví dụ, bạn không thể gọi `setPosition({ x: 100 })` trong ví dụ trên vì nó sẽ không có trường `y` nào cả! Thay vào đó, nếu bạn muốn chỉ cập nhật `x`, bạn sẽ phải gọi `setPosition({ ...position, x: 100 })`, hoặc chia chúng thành hai state và gọi `setX(100)`. -## Avoid contradictions in state {/*avoid-contradictions-in-state*/} +## Tránh mâu thuẫn trong state {/*avoid-contradictions-in-state*/} -Here is a hotel feedback form with `isSending` and `isSent` state variables: +Đây là một form phản hồi của khách sạn với state `isSending` và `isSent`: @@ -124,12 +125,13 @@ export default function FeedbackForm() { } if (isSent) { - return

Thanks for feedback!

+ return

Cảm ơn bạn đã phản hồi!

} return (
-

How was your stay at The Prancing Pony?

+

+

Bạn thấy kỳ nghỉ của mình tại The Prancing Pony thế nào?