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/portals.md
+37-37Lines changed: 37 additions & 37 deletions
Original file line number
Diff line number
Diff line change
@@ -4,21 +4,21 @@ title: Portals
4
4
permalink: docs/portals.html
5
5
---
6
6
7
-
Portals cung cấp một cách hạng nhất để kết xuất phần tử con thành một nút DOM tồn tại bên ngoài phân cấp DOM của thành phần cha.
7
+
Portals cung cấp một cách render các phần tử DOM bên ngoài phân cấp của DOM chính.
8
8
9
9
```js
10
10
ReactDOM.createPortal(child, container)
11
11
```
12
12
13
-
Đối số đầu tiên (`child`) là bất kỳ [phần tử con nào của React có thể kết xuất được](/docs/react-component.html#render), chẳng hạn như một phần tử, chuỗi, hoặc đoạn. Đối số thứ hai (`container`) là một phần tử DOM.
13
+
Tham số đầu tiên (`child`) là bất bỳ [thành phần có thể render của React](/docs/react-component.html#render), như là element, string, hoặc fragment. Tham số thứ hai (`container`) là một DOM element.
14
14
15
-
## Sử dụng {#usage}
15
+
## Cách dùng {#usage}
16
16
17
-
Thông thường, khi bạn trả về một phần tử từ phương thức kết xuất của một thành phần, nó sẽ được gắn vào DOM dưới dạng phần tử con của nút cha gần nhất:
17
+
Thông thường, khi bạn trả về một phần tử từ phương thức render của một component, nó sẽ được gắn vào DOM dưới dạng phần tử con của nút cha gần nhất:
18
18
19
19
```js{4,6}
20
20
render() {
21
-
// React mounts a new div and renders the children into it
21
+
// React tạo một thẻ div mới và render các phần tử con vào trong thẻ div đó:
22
22
return (
23
23
<div>
24
24
{this.props.children}
@@ -27,34 +27,34 @@ render() {
27
27
}
28
28
```
29
29
30
-
Tuy nhiên, đôi khi sẽ hữu ích nếu chèn một phần tử con vào một vị trí khác trong DOM:
30
+
Tuy nhiên, đôi khi sẽ thuận tiện hơn nếu chèn phần tử con đó vào một vị trí khác trong DOM:
31
31
32
32
```js{6}
33
33
render() {
34
-
// React does *not* create a new div. It renders the children into `domNode`.
35
-
// `domNode` is any valid DOM node, regardless of its location in the DOM.
34
+
// React *không* tạo mới thẻ div. Nó render phần tử con vào `domNode`.
35
+
// `domNode` là bất kỳ phần tử DOM hợp lệ nào, ở bất kỳ vị trí nào trong DOM.
36
36
return ReactDOM.createPortal(
37
37
this.props.children,
38
38
domNode
39
39
);
40
40
}
41
41
```
42
42
43
-
Một trường hợp điển hình sử dụng cho các portals là khi một thành phần cha có kiểu `overflow: hidden`or`z-index`, nhưng bạn cần thành phần con “thoát ra” khỏi vùng chứa của nó một cách trực quan. Ví dụ: hộp thoại, thẻ di chuột và chú giải công cụ.
43
+
Một trường hợp thuờng dùng Portals là khi một thành phần mẹ có thuộc tính `overflow: hidden`hoặc`z-index`, nhưng bạn muốn hiển thị nó một cách "độc lập" khỏi thành phần mẹ. Ví dụ, các hộp thoại (dialogs), hovercards, và tooltips.
44
44
45
-
> Chú ý:
45
+
> Lưu ý:
46
46
>
47
-
> Khi làm việc với các portals, hãy nhớ rằng việc [quản lý tiêu điểm bàn phím](/docs/accessibility.html#programmatically-managing-focus)trở nên rất quan trọng.
47
+
> Khi làm việc với Portals, hãy nhớ [quản lý các sự kiện focus từ bàn phím](/docs/accessibility.html#programmatically-managing-focus)là rất quan trọng.
48
48
>
49
-
> Đối với modal dialogs, hãy đảm bảo rằng mọi người đều có thể tương tác với chúng bằng cách tuân theo [WAI-ARIA Modal Authoring Practices](https://www.w3.org/TR/wai-aria-practices-1.1/#dialog_modal).
49
+
> Đối với hộp thoại, hãy đảm bảo rằng mọi người có thể tương tác với chúng bằng cách làm theo [WAI-ARIA Modal Authoring Practices](https://www.w3.org/TR/wai-aria-practices-1.1/#dialog_modal).
50
50
51
51
[**Try it on CodePen**](https://codepen.io/gaearon/pen/yzMaBd)
52
52
53
-
## Sự Kiện Bong Bóng qua Portals {#event-bubbling-through-portals}
53
+
## Xử lý sự kiện ở Portals {#event-bubbling-through-portals}
54
54
55
-
Mặc dù một portal có thể ở bất kỳ đâu trong DOM tree, nhưng theo mọi cách khác, nó hoạt động giống như một React con bình thường. Các tính năng như ngữ cảnh hoạt động giống hệt nhau bất kể thành phần con có phải là portal hay không, vì portal vẫn tồn tại trong *React tree* bất kể vị trí trong *DOM tree*.
55
+
Mặc dù Portals có thể ở bất kỳ đâu trong cây DOM, nhưng theo mọi cách khác, nó hoạt động giống như một React component bình thường. Các tính năng như context hoạt động giống hệt nhau bất kể component đó có phải là Portals hay không, vì Portals vẫn tồn tại trong *React tree* bất kể vị trí nào trong *DOM tree*.
56
56
57
-
Điều này bao gồm sự kiện bong bóng. Một sự kiện được kích hoạt từ bên trong portal sẽ truyền đến ancestors trong *React tree*có chứa, ngay cả khi những phần tử đó không phải là ancestors trong *DOM tree*. Giả sử cấu trúc HTML sau:
57
+
Bao gồm các event bubbling. Một sự kiện được kích hoạt từ bên trong Portals sẽ truyền đến tất node cha trong *React tree* chứa portals đó, ngay cả khi những phần tử đó không phải là node cha trong *DOM tree*. Giả sử với cấu trúc HTML sau:
58
58
59
59
```html
60
60
<html>
@@ -65,10 +65,10 @@ Mặc dù một portal có thể ở bất kỳ đâu trong DOM tree, nhưng the
65
65
</html>
66
66
```
67
67
68
-
Một thành phần `Parent` trong `#app-root` sẽ có thể bắt được một sự kiện bong bóng chưa được giải quyết từ nút anh chị em`#modal-root`.
68
+
Một thành phần `Parent` trong `#app-root` sẽ có thể bắt được một bubbling event chưa được bắt từ sibling node`#modal-root`.
@@ -79,14 +79,14 @@ class Modal extends React.Component {
79
79
}
80
80
81
81
componentDidMount() {
82
-
// The portal element is inserted in the DOM tree after
83
-
// the Modal's children are mounted, meaning that children
84
-
// will be mounted on a detached DOM node. If a child
85
-
// component requires to be attached to the DOM tree
86
-
// immediately when mounted, for example to measure a
87
-
// DOM node, or uses 'autoFocus' in a descendant, add
88
-
// state to Modal and only render the children when Modal
89
-
// is inserted in the DOM tree.
82
+
// Phần tử Portals được chèn vào cây DOM sau khi
83
+
// phần tử con của Modal được hiển thị, có nghĩa là những phần tử con đó
84
+
// sẽ được gắn trên một phần tử DOM tách rời độc lập. Nếu một phần tử con
85
+
// yêu cầu được gắn vào DOM tree ngay tức khắc khi 'mounted',
86
+
// ví dụ để đo lường thuộc tính DOM, hoặc sử dụng 'autoFocus'
87
+
// trong các phần tử con, thêm state vào Modal và
88
+
// chỉ render các phẩn tử con khi Modal
89
+
// được chèn vào DOM tree.
90
90
modalRoot.appendChild(this.el);
91
91
}
92
92
@@ -110,9 +110,9 @@ class Parent extends React.Component {
110
110
}
111
111
112
112
handleClick() {
113
-
// This will fire when the button in Child is clicked,
114
-
// updating Parent's state, even though button
115
-
// is not direct descendant in the DOM.
113
+
// Hàm này sẽ kích hoạt khi button tại Child được click,
114
+
// cập nhật Parent's state, mặc dù button
115
+
// không phải là phần tử con trực tiếp trong DOM.
116
116
this.setState(state => ({
117
117
clicks: state.clicks + 1
118
118
}));
@@ -121,12 +121,12 @@ class Parent extends React.Component {
121
121
render() {
122
122
return (
123
123
<div onClick={this.handleClick}>
124
-
<p>Number of clicks: {this.state.clicks}</p>
124
+
<p>Số lượng clicks: {this.state.clicks}</p>
125
125
<p>
126
-
Open up the browser DevTools
127
-
to observe that the button
128
-
is not a child of the div
129
-
with the onClick handler.
126
+
Mở DevTools của trình duyệt
127
+
để quan sát rằng button
128
+
không phải con của div
129
+
xử lý sự kiện onClick.
130
130
</p>
131
131
<Modal>
132
132
<Child />
@@ -137,8 +137,8 @@ class Parent extends React.Component {
137
137
}
138
138
139
139
function Child() {
140
-
// The click event on this button will bubble up to parent,
141
-
// because there is no 'onClick' attribute defined
140
+
// Sự kiện nhấp chuột vào nút này sẽ xuất hiện đối với phần tử cha chứa nó
141
+
// bởi vì không có thuộc tính 'onClick' được định nghĩa
142
142
return (
143
143
<div className="modal">
144
144
<button>Click</button>
@@ -149,6 +149,6 @@ function Child() {
149
149
ReactDOM.render(<Parent />, appRoot);
150
150
```
151
151
152
-
[**Try it on CodePen**](https://codepen.io/gaearon/pen/jGBWpE)
152
+
[**Thử trên CodePen**](https://codepen.io/gaearon/pen/jGBWpE)
153
153
154
-
Việc nắm bắt một sự kiện xảy ra từ một portal trong thành phần cha cho phép phát triển các tính năng trừu tượng linh hoạt hơn vốn không phụ thuộc vào các portal. Ví dụ: nếu bạn hiển thị một thành phần `<Modal />`, thành phần gốc có thể nắm bắt các sự kiện của nó bất kể nó có được triển khai bằng portal hay không.
154
+
Việc nắm bắt một sự kiện xảy ra từ một Portals trong một component cha cho phép phát triển các tính năng trừu tượng linh hoạt hơn vốn không phụ thuộc vào các Portals. Ví dụ, nếu bạn render một phần tử `<Modal />`, thành phần cha có thể nhận được các sự kiện của nó dù cho nó có được triển khai bằng portals hay không.
0 commit comments