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: content/docs/higher-order-components.md
+24-24Lines changed: 24 additions & 24 deletions
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ title: Higher-Order Components
4
4
permalink: docs/higher-order-components.html
5
5
---
6
6
7
-
Higher-order component (HOC) là một kĩ thuật nâng cao trong React để tái sử dụng logic của component. HOC không thuộc React API. Nó là một kiểu được sinh ra từ nền tảng cấu trúc của React.
7
+
Higher-order component (HOC) là một kĩ thuật nâng cao trong React để tái sử dụng logic của component. HOC không thuộc React API. Nó là một kiểu được sinh ra từ pattern của React.
8
8
9
9
Một cách cụ thể, **một higher-order component là một hàm nhận vào một component và trả về một component.**
10
10
@@ -26,7 +26,7 @@ Trong tài liệu này, chúng ta sẽ thảo luận tại sao higher-order comp
26
26
27
27
Components là những đơn vị cơ bản trong việc tái sử dụng code trong React. Tuy nhiên, bạn có thể thấy một số patterns không thực sự phù hợp cho những components truyền thống.
28
28
29
-
Ví dụ, bạn có component `CommentList` lấy dữ liệu từ bên ngoài và hiển thị một list các bình luận:
29
+
Ví dụ, bạn có component `CommentList` lấy dữ liệu từ nguồn bên ngoài và hiển thị một list các bình luận:
30
30
31
31
```js
32
32
classCommentListextendsReact.Component {
@@ -68,7 +68,7 @@ class CommentList extends React.Component {
68
68
}
69
69
```
70
70
71
-
Sau đó, bạn viết một component cho một bài blog, với những bước tương tự:
71
+
Sau đó, bạn viết một component cho một bài blog, với pattern tương tự:
72
72
73
73
```js
74
74
classBlogPostextendsReact.Component {
@@ -163,15 +163,15 @@ function withSubscription(WrappedComponent, selectData) {
163
163
}
164
164
```
165
165
166
-
Cần nhớ một điều là HOC không chỉnh sửa, làm khác đi component đầu vào mà nó chỉ kế thừa các hành vi của component đó. Một HOC *xào nấu* component gốc bằng cách gói nó vào một component. Một HOC là một hàm với 0 tác dụng phụ (side-effects).
166
+
Cần nhớ một điều là HOC không chỉnh sửa, làm thay đổi component đầu vào mà nó chỉ kế thừa các hành vi của component đó. Một HOC *xào nấu* component gốc bằng cách gói nó vào một component. Một HOC là một hàm không có tác dụng phụ (side-effects).
167
167
168
168
Và đó là tất cả! Component bên trong nhận tất cả các props của component bên ngoài, bên cạnh prop mới, `data`, cái mà được sử dụng để render. HOC không quan tâm dữ liệu được sử dụng như thế nào hoặc tại sao, và component bên trong cũng không quan tâm dữ liệu đến từ đâu.
169
169
170
170
Bởi vì `withSubscription` là một hàm bình thường, bạn có thể thêm vào bao nhiêu tham số bạn muốn. Ví dụ, bạn muốn tên của `data` có thể tùy biến, để cho HOC độc lập với component bên trong. Hoặc bạn có thể nhận một tham số mà có thể tùy chỉnh `shouldComponentUpdate`, và một cho thay đổi nguồn dữ liệu. Những điều đó đều có thể vì HOC kiểm soát hoàn toàn cách một component định nghĩa.
171
171
172
172
Giống như các components khác, mối quan hệ giữa `withSubscription` và component con hoàn toàn dựa vào props. Nó giúp cho việc đổi một HOC này với một HOC khác dễ dàng hơn, miễn là chúng cung cấp cùng props cho component con. Rất hữu ích nếu bạn thay đổi thư viện lấy dữ liệu.
173
173
174
-
## Đừng thay đổi (mutate) Component Gốc. Hãy soạn lại component (composition).{#dont-mutate-the-original-component-use-composition}
174
+
## Đừng thay đổi (mutate) Component Gốc. Hãy sử dụng Composition.{#dont-mutate-the-original-component-use-composition}
175
175
176
176
Kiểm soát ham muốn chỉnh sửa prototype của component (nói cách khác là mutate nó) bên trong một HOC.
177
177
@@ -202,30 +202,30 @@ function logProps(WrappedComponent) {
202
202
console.log('Previous props: ', prevProps);
203
203
}
204
204
render() {
205
-
//Gói component vào bên trong một component chứa, không mutate. Thật tuyệt!
205
+
//Thật tốt khi Input component được bọc bởi một container và nó không bị thay đổi (mutate)
206
206
return<WrappedComponent {...this.props} />;
207
207
}
208
208
}
209
209
}
210
210
```
211
211
212
-
HOC này có đầy đủ chức năng với bản được mutate mà tránh được nguy cơ xung đột. Nó hoạt động hiệu quả cả với class và function component. And bởi vì là một pure function, nó có thể được ghép với những HOC khác, hoặc kể cả chính nó.
212
+
HOC này có đầy đủ chức năng với bản được mutate mà tránh được nguy cơ xung đột. Nó hoạt động hiệu quả cả với class và function component. Vì nó là một pure function, nó có thể được ghép với những HOC khác, hoặc kể cả chính nó.
213
213
214
-
Bạn có thể nhận ra điểm chung giữa HOCs và một pattern gọi là **container components**. Container components là một phần của chiến lược trách nhiệm phân chia giữa các điều high-level và low-level. Containers quản lý những thứ như lắng nghe (subscriptions) và trạng thái (state), và truyền props đến components con để thực hiện các nhiệm vụ như render UI. HOCs sử dụng container như một thừa kế. Bạn có thể nghĩ đến HOC như là container components có tham số.
214
+
Bạn có thể nhận ra điểm chung giữa HOCs và một pattern gọi là **container components**. Container components là một phần của chiến lược trách nhiệm phân chia giữa các điều high-level và low-level. Containers quản lý những thứ như lắng nghe (subscriptions) và trạng thái (state), và truyền props đến components con để thực hiện các nhiệm vụ như render UI. HOCs sử dụng container như một thừa kế. Bạn có thể nghĩ đến HOC như là một container component có thể truyền tham số.
215
215
216
216
## Quy ước: Truyền những props không liên quan đến component con{#convention-pass-unrelated-props-through-to-the-wrapped-component}
217
217
218
218
219
-
HOC thêm vào những tính năng mới đến component. Chúng không nên thay đổi mạnh mẽ cấu trúc. Component trả về từ HOC nên có chung interface với component con.
219
+
HOC giúp bạn thêm các tính năng mới vào component. Chúng không nên thay đổi mạnh mẽ cấu trúc. Component trả về từ HOC nên có chung interface với component con.
220
220
221
-
Những HOC nên truyền qus các props mà không liên quan đến những quan tâm đặc thù. Hầu hết các HOC đều chứa một hàm render có dạng như sau:
221
+
Những HOC nên truyền qua các props mà không liên quan đến những quan tâm đặc thù. Hầu hết các HOC đều chứa một hàm render có dạng như sau:
222
222
223
223
```js
224
224
render() {
225
225
// Lọc những props mà chỉ liên quan đến HOC này mà không cần truyền xuống
Nói cách khác, `connect` là một higher-order function trả về một higher-order component!
273
273
274
-
Dạng này có thể gây nhầm lẫn hoặc không cần thiết nhưng lại rất hữu ích.Những HOC nhận môt tham số giống như được trả về từ `connect` có đặc điểm `Component => Component`. Những hàm mà output type giống như input type thì rất dễ để kết hợp với nhau.
274
+
Dạng này có thể gây nhầm lẫn hoặc không cần thiết nhưng lại rất hữu ích.Những HOC nhận môt tham số giống như được trả về từ `connect` có đặc điểm `Component => Component`. Những hàm mà output type giống như input type thì rất dễ để kết hợp với nhau.
The `compose` utility function is provided by many third-party libraries including lodash (as [`lodash.flowRight`](https://lodash.com/docs/#flowRight)), [Redux](https://redux.js.org/api/compose), and [Ramda](https://ramdajs.com/docs/#compose).
295
295
Hàm `compose` thì được cung cấp bở nhiều thư viện third-party bao gồm lodash ([`lodash.flowRight`](https://lodash.com/docs/#flowRight)) và [Ramda](https://ramdajs.com/docs/#compose).
296
296
297
-
## Quy tắc: Gói những tên thể hiện để tiện cho debug{#convention-wrap-the-display-name-for-easy-debugging}
297
+
## Quy tắc chung : Cách đặt tên HOC để tiện cho việc debug (tìm và gỡ lỗi){#convention-wrap-the-display-name-for-easy-debugging}
298
298
299
299
Những container component tạo bởi HOCs đều xuất hiện trong [React Developer Tools](https://github.com/facebook/react/tree/main/packages/react-devtools) như bao component khác. Để dễ debug, chọn tên sao cho nó thể hiện rằng nó được sinh ra từ HOC.
300
300
@@ -334,25 +334,25 @@ render() {
334
334
}
335
335
```
336
336
337
-
Vấn đề ở đây không chỉ là về hiệu năng - việc remount một component gây ra tình trạng cả trạng thái cũng nhưng những children đều bị mất.
337
+
Vấn đề ở đây không chỉ là về hiệu năng - việc remount một component gây ra tình trạng cả state cũng như những children đều bị mất.
338
338
339
339
Áp dụng HOC bên ngoài định nghĩa của component để component sẽ chỉ tạo ra một lần. Định danh của nó sẽ không thay đổi qua mỗi lần render.
340
340
341
341
Trong những trường hợp hiếm mà bạn cần phải dùng HOC một cách linh hoạt, bạn có thể dùng nó bên trong những hàm licycle hoặc constructor của component.
342
342
343
-
### Những hàm tĩnh phải được sao chép qua {#static-methods-must-be-copied-over}
343
+
### Những static methods phải được sao chép qua {#static-methods-must-be-copied-over}
344
344
345
-
Đôi khi sẽ rất hữu ích nếu tạo một hàm tĩnh trong React component. Ví dụ, Relay containers có một hàm tĩnh`getFragment` để đơn giản hóa việc kết hợp của GraphQL fragment.
345
+
Đôi khi sẽ rất hữu ích nếu tạo một static method trong React component. Ví dụ, Relay containers có một static method`getFragment` để đơn giản hóa việc kết hợp của GraphQL fragment.
346
346
347
-
Khi dùng HOC với một component, mặc dù component được wrap bởi container, nó không có nghĩa là component mới sẽ có những hàm tĩnh của component ban đầu.
347
+
Khi dùng HOC với một component, mặc dù component được bao bọc bởi container, nó không có nghĩa là component mới sẽ có những static methods của component ban đầu.
### Refs không được truyền xuống {#refs-arent-passed-through}
396
396
397
-
Mặc dù quy tắc của HOC là truyền tất cả props xuống component, nhưng điều này không áp dụng với refs. Bởi vì `ref` không hẳng là một prop - như `key`, nó được xử lý bởi React. Nếu bạn thêm 1 ref vào một element mà component là kết quả từ HOC, refs sẽ mặc nhiên là của container ngoài cùng nhất, không phải component được wrap.
397
+
Mặc dù quy tắc của HOC là truyền tất cả props xuống component, nhưng điều này không áp dụng với refs. Bởi vì `ref` không hẳng là một prop - như `key`, nó được xử lý bởi React. Nếu bạn thêm một ref vào một element mà component là kết quả từ HOC, refs sẽ mặc nhiên là của container ngoài cùng nhất, không phải component được bao bọc.
398
398
399
399
The solution for this problem is to use the `React.forwardRef` API (introduced with React 16.3). [Learn more about it in the forwarding refs section](/docs/forwarding-refs.html).
400
400
Giải pháp cho vấn đề này là dùng `React.forwardRef` API (được giới thiệu ở React 16.3). [Tìm hiểu thêm về forward ref tại đây](/docs/forwarding-refs.html).
0 commit comments