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/state-and-lifecycle.md
+27-28Lines changed: 27 additions & 28 deletions
Original file line number
Diff line number
Diff line change
@@ -10,7 +10,7 @@ next: handling-events.html
10
10
11
11
Trang này giới thiếu khái niệm về state và lifecycle trong React component. Ban có thể tìm [thành phần tham chiếu API chi tiết tại đây](/docs/react-component.html).
12
12
13
-
Cân nhắc ví dụ đồng hồ đếm giây từ [một trong phần của chương trước](/docs/rendering-elements.html#updating-the-rendered-element). Trong [Rendering Elements](/docs/rendering-elements.html#rendering-an-element-into-the-dom), chúng ta chỉ học cách để update UI. chúng ta gọi `ReactDOM.render()` để thay đổi kết xuất đầu ra (rendered output):
13
+
Xem xem lại ví dụ đồng hồ tíc tắc [một phần của chương trước](/docs/rendering-elements.html#updating-the-rendered-element). Trong [Rendering Elements](/docs/rendering-elements.html#rendering-an-element-into-the-dom), chúng ta chỉ học cách để update UI. chúng ta gọi `ReactDOM.render()` để thay đổi đầu ra được kết xuất (rendered output):
14
14
15
15
```js{8-11}
16
16
function tick() {
@@ -31,7 +31,7 @@ setInterval(tick, 1000);
31
31
32
32
[**Thử trên Codepen**](https://codepen.io/gaearon/pen/gwoJZk?editors=0010)
33
33
34
-
Trong chương này, chúng ta sẽ học làm thế thế nào để tạo thành phần `Clock` có thể tái sử dụng và đóng gói. Nó sẽ tự đặt thời gian của mình và cập nhập mỗi giây
34
+
Trong chương này, chúng ta sẽ học làm thế thế nào để tạo thành phần `Clock` có thể tái sử dụng và đóng gói. Nó sẽ tự đặt bộ hẹn giờ của mình và tự cập nhập mỗi giây
35
35
36
36
Chúng ta có thể bắt đầu đóng gói và trông nó sẽ như thế này:
37
37
@@ -57,9 +57,9 @@ setInterval(tick, 1000);
57
57
58
58
[**Thử trên CodePen**](https://codepen.io/gaearon/pen/dpdoYR?editors=0010)
59
59
60
-
Tuy nhiên, nó thiếu một yêu cầu quan trọng: sự thật là`Clock` đặt thời gian và cập nhập lại UI mỗi giây nên là sự thực hiện đầy đủ của `Clock`
60
+
Tuy nhiên, nó thiếu một yêu cầu quan trọng: thực tế thì`Clock` đặt bộ hẹn giờ và cập nhập lại UI mỗi giây vi vậy `Clock` nên được làm chi tiết
61
61
62
-
Lý tưởng nhất là ta làm điều này một lần duy nhất và có một `Clock` tự cập nhập:
62
+
Lý tưởng nhất là ta viết một lần duy nhất và có một `Clock` tự cập nhập:
63
63
64
64
```js{2}
65
65
ReactDOM.render(
@@ -68,23 +68,23 @@ ReactDOM.render(
68
68
);
69
69
```
70
70
71
-
Để thực hiện điều này, ta cần thêm "state" vào thành phần`Clock`
71
+
Để thực hiện điều này, ta cần thêm "state" vào component`Clock`
72
72
73
73
State cũng tương tự như props, nhưng nó là của riêng component và được kiểm soát hoàn toàn bởi chúng
74
74
75
75
## Chyển đổi Function thành Class {#converting-a-function-to-a-class}
76
76
77
77
Bạn có thể chuyển đổi một function của thành phần như `Clock` thành class trong năm bước:
78
78
79
-
1. Tạo một [ES6 class](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes), cùng tên, cho nó extends`React.Component`.
79
+
1. Tạo một [ES6 class](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes), cùng tên, cho nó extends`React.Component`.
80
80
81
81
2. Thêm một phương thức rỗng được gọi là `render()`.
82
82
83
83
3. Di chuyển nội dung của function vào bên trong phương thức `render()`
84
84
85
-
4.Tha thế `props` thành `this.props` trong nội dung của `render()`.
85
+
4.Thay thế `props` thành `this.props` trong nội dung của `render()`.
86
86
87
-
5. Xóa khai báo rỗng còn lại của function .
87
+
5. Xóa khai function rỗng còn lại mà ta đã lấy nội dụng .
88
88
89
89
```js
90
90
classClockextendsReact.Component {
@@ -103,7 +103,7 @@ class Clock extends React.Component {
103
103
104
104
`Clock` giờ sẽ được định nghĩa là một class chứ không còn là một function.
105
105
106
-
Phương thức `render` sẽ được gọi mỗi khi sự cập nhập xảy ra, nhưng miễn là chúng ta render `<Clock/>` bên trong cùng DOM node, chỉ có duy nhất instance đơn lẻ của class `Clock` sẽ được sử dụng. Điều này làm ta có thể sử dụng thêm các features khác như local state và các phương thức lifecycle
106
+
Phương thức `render` sẽ được gọi mỗi khi sự cập nhập xảy ra, nhưng miễn là chúng ta render `<Clock/>` bên trong cùng DOM node, chỉ có duy nhất instance đơn lẻ của class `Clock` sẽ được sử dụng. Điều này làm ta có thể sử dụng thêm các feature khác như local state và các phương thức lifecycle
107
107
108
108
## Thêm Local State vào Class {#adding-local-state-to-a-class}
109
109
@@ -124,7 +124,7 @@ class Clock extends React.Component {
124
124
}
125
125
```
126
126
127
-
2) Thêm một [class constructor](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes#Constructor) gán `this.state`: ban đầu:
127
+
2) Thêm một [class constructor](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes#Constructor) gán `this.state` ban đầu:
128
128
129
129
```js{4}
130
130
class Clock extends React.Component {
@@ -153,7 +153,7 @@ Lưu ý cách ta truyền `props` vào base contructor
153
153
}
154
154
```
155
155
156
-
Thành phần Class nên luôn luôn goi đến base contructor với `props`
156
+
Thành phần Class nên luôn luôn gọi đến base contructor với `props`
157
157
158
158
3) Xóa prop `date` từ thành phần `<Clock />`:
159
159
@@ -164,7 +164,7 @@ ReactDOM.render(
164
164
);
165
165
```
166
166
167
-
Sau đó chúng ta sẽ truyền timer code trở về component đó.
167
+
Sau đó chúng ta sẽ truyền code của bộ hẹn giờ trở về component đó.
168
168
169
169
Kết quả sẽ trông như sau:
170
170
@@ -193,7 +193,7 @@ ReactDOM.render(
193
193
194
194
[**Thử trên CodePen**](https://codepen.io/gaearon/pen/KgQpJd?editors=0010)
195
195
196
-
Tiếp theo, chúng ta sẽ cho `Clock` bộ hẹn giờ và tự cập nhập mỗi giây.
196
+
Tiếp theo, chúng ta sẽ cho `Clock`một bộ hẹn giờ và tự cập nhập mỗi giây.
197
197
198
198
## Thêm phương thức Lifecycle vào Class {#adding-lifecycle-methods-to-a-class}
199
199
@@ -233,7 +233,7 @@ class Clock extends React.Component {
233
233
234
234
Những phương thức đặc biệt đó được gọi là "lifecycle methods".
235
235
236
-
Phương thức `componentDidMount()` chạy sau khi đầu ra component đã được render vào trong DOM. Đây là vị trị thuận lợi để đặt bộ hẹn giờ:
236
+
Phương thức `componentDidMount()` chạy sau khi đầu ra component đã được render vào trong DOM. Đây là vị trí thuận lợi để đặt bộ hẹn giờ:
237
237
238
238
```js{2-5}
239
239
componentDidMount() {
@@ -302,20 +302,19 @@ ReactDOM.render(
302
302
303
303
[**Thử trên Codepen**](https://codepen.io/gaearon/pen/amqdNA?editors=0010)
304
304
305
-
Giờ đồng hồ sẽ được 'tick' mỗi giây
305
+
Giờ đồng hồ sẽ được đếm mỗi giây
306
306
307
-
Hãy tóm tắt nhanh những gì đã diễn ra và thứ tự các mehthod được gọi:
307
+
Hãy tóm tắt nhanh những gì đã diễn ra và thứ tự các method được gọi:
308
308
309
-
1) Khi `<Clocl/>` được truyền vào `ReactDOM.render()`, React gọi đến contructor của component `Clock`. Kể từ khi `Clock` cần hiển thị thời gian hiện tại, nó khởi tọa`this.state` với một object bao gồm cả thời gian hiện tại. Chúng ta sẽ cập nhập trạng thái này sau đó
309
+
1) Khi `<Clock/>` được truyền vào `ReactDOM.render()`, React gọi đến contructor của component `Clock`. Kể từ khi `Clock` cần hiển thị thời gian hiện tại, nó khởi tạo`this.state` với một object bao gồm cả thời gian hiện tại. Chúng ta sẽ cập nhập trạng thái này sau đó
310
310
311
311
2) React sau đó gọi phương thức render() của component `Clock`. Đây là cách React học(đọc) những gì nên được hiện thị ra màn hình. React sau đó cập nhập DOM để trùng khớp với đầu ra kết xuất(render) của `Clock`
312
312
313
313
3) Khi đầu ra `Clock` được thêm vào DOM, React gọi đến phương thức lifecycle `componentDidMount`. Bên trong nó, component `Clock` hỏi trình duyệt để cài đặt bộ hẹn giờ để gọi đến phương thức `tick()` của component mỗi lần trong 1 giây
314
314
315
315
4) Mỗi giây trình duyệt gọi đến phương thức `tick()`. Bên trong nó, component `Clock` lên lịch trình để UI cập nhập bằng cách gọi `setState()` với một object chứa thời gian hiện tại. Nhờ vào `setState()`, React biết răng state đã được thay đổi, và phương thức `render()` được gọi là để học (đọc) cái gì sẽ được in ra màn hình. Thời điểm này, `this.state.date` bên trong phương thức `render()` sẽ khác, vì vậy kết xuất đầu ra sẽ bao gồm thời gian đã được cập nhập. React cập nhập DOM sao phù hợp
316
316
317
-
5) If the `Clock` component is ever removed from the DOM, React calls the `componentWillUnmount()` lifecycle method so the timer is stopped.
318
-
5) Nếu component `Clock` chưa bị xóa khỏi DOM, React gọi đến phương thức `componentWillUnmount()` lifecycle thì bộ hẹn giờ bị dừng lại
317
+
5) Nếu component `Clock` chưa bị xóa khỏi DOM, React gọi đến phương thức lifecycle `componentWillUnmount()` thì bộ hẹn giờ bị dừng lại
319
318
320
319
## Sử dụng state đúng cách {#using-state-correctly}
Nơi duy nhất mà bạn có thể gán `this.state` là contructor
341
340
342
-
### Cập nhập trạng thái có thể là bất đồng bộ {#state-updates-may-be-asynchronous}
341
+
### Cập nhập state có thể là bất đồng bộ {#state-updates-may-be-asynchronous}
343
342
344
-
React có thể call gộp nhiều lệnh gọi `setState()` vào một lần cập nhập để tăng hiệu năng
343
+
React có thể gộp nhiều lệnh gọi `setState()` vào một lần cập nhập để tăng hiệu năng
345
344
346
345
Bởi vì `this.props` và `this.state` có thể được cập nhập bất đồng bộ, bạn không nên dựa vào giá trị của chúng để tính toán state tiếp theo
347
346
348
-
Ví dụ, đoạn mã này có thể thất bại để cập nhập counter
347
+
Ví dụ, đoạn mã này có thể thất bại để cập nhập counter:
349
348
350
349
```js
351
350
// Wrong
@@ -354,7 +353,7 @@ this.setState({
354
353
});
355
354
```
356
355
357
-
Để sửa nó, sử dụng một dạng thứ hai của `setState()` nó nhận một funtion chứ không phải object. Funtion này sẽ nhận state trước đó làm tham số đầu tiên, và props tại thời điểm cập nhập được nhận làm tham sso thứ hai:
356
+
Để sửa nó, sử dụng một dạng thứ hai của `setState()` nó nhận một funtion chứ không phải object. Funtion này sẽ nhận state trước đó làm tham số đầu tiên, và props tại thời điểm cập nhập được nhận làm tham số thứ hai:
Ta đã sử dụng [arrow function](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions) ở trước, nhưng nó vẫn hoạt động với funtion truyền thống:
365
+
Ta đã sử dụng [arrow function](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions) ở đằng trước, nhưng nó vẫn hoạt động với funtion truyền thống:
### Cập nhập trạng thái được hợp nhất {#state-updates-are-merged}
376
+
### Cập nhập trạng thái được gộp lại {#state-updates-are-merged}
378
377
379
378
Khi mà bạn gọi `setState()`, React gộp object bạn cung cấp vào state hiện tại
380
379
@@ -408,11 +407,11 @@ Sau đó bạn có cập nhập chúng một cách độc lập bằng cách g
408
407
}
409
408
```
410
409
411
-
Sự hợp nhất là nông (shallow), nên `this.setState({comments})`chừa lại `this.state.posts` nguyên vẹn, còn `this.state.comments` sẽ hoàn toàn được thay thế bằng value mới.
410
+
Sự hợp nhất là nông (shallow), nên `this.setState({comments})`để lại `this.state.posts` nguyên vẹn, còn `this.state.comments` sẽ hoàn toàn được thay thế bằng value mới.
412
411
413
412
## Dữ liệu chảy từ trên xuống dưới {#the-data-flows-down}
414
413
415
-
Cả parent và child component, cả hai có thể không hiểu dù component có là stateful hoặc stateless, và chúng sẽ không quan tâm liệu rằng nó được định nghĩa là một function hoặc một class
414
+
Parent và child component, cả hai có thể không hiểu dù component có là stateful hoặc stateless, và chúng sẽ không quan tâm liệu rằng nó được định nghĩa là một function hoặc một class
416
415
417
416
Đó là lý do vì sao state thường xuyên được gọi cục bộ hoặc và được khép kín. Nó không truy cập đến bất cứ component khác ngoài cái mà đang sở hữu và đặt giá trị cho nó
418
417
@@ -439,7 +438,7 @@ function FormattedDate(props) {
439
438
440
439
[**Thử trên CodePen**](https://codepen.io/gaearon/pen/zKRqNB?editors=0010)
441
440
442
-
Đây được gọi chung là dòng chảy dữ liệu "top-down" hoặc "unidirectional". Bất kỳ state luôn được sở hữu bởi một vài component đặc biệt, và bất cứ dữ liệu hoặc nguồn gốc UI từ state đó có thế ảnh hưởng đến những component "phía dưới" chúng và trong "tree"
441
+
Đây được gọi chung là dòng chảy dữ liệu "top-down" hoặc "unidirectional". Bất kỳ state luôn được sở hữu bởi một vài component đặc biệt, và bất cứ dữ liệu hoặc nguồn gốc UI sinh ra từ state có thế ảnh hưởng đến những component "phía dưới" chúng và trong "tree"
443
442
444
443
Nếu bạn tưởng tượng một "component tree" như một thác nước của những props, mỗi state của component như bổ sung thêm nguồn nước tụ lại tại một điểm nhưng cuối cùng vẫn chảy xuống
0 commit comments