Reac-Portals 使用及其原理
Galloping_Leo 2021-04-11 React
# 插槽 Portals
将组件渲染到父组件之外的其他组件的解决方案。比如在 A 组件中点击控制全局提示组件的显示和隐藏。主要通过 ReactDOM.createPortal(child, contanier)
来实现。它接收两个参数,参数一代表要渲染的组件,第二个参数是渲染组件的容器( HTML
节点)。如下例:

id
为 modal-root
的 div
,为全局提示组件的容器,在根组件 root
之外。
<body>
<div id="root"></div>
<div id="modal-root"></div>
</body>
1
2
3
4
2
3
4
import React, { Component } from "react";
import ReactDOM from "react-dom";
import styles from "./modal.module.css";
class Modal extends Component {
constructor(prop) {
super(prop);
}
render() {
return ReactDOM.createPortal(
this.props.children,
document.getElementById("modal-root")
); // chile, content 把子节点 渲染到 content 中
}
}
class App extends Component {
constructor(props) {
super(props);
this.state = {
isShow: false,
};
}
toggle = () => {
this.setState({
isShow: !this.state.isShow,
});
};
render() {
const { isShow } = this.state;
return (
<>
<button onClick={this.toggle}>Toggle Modal</button>
{isShow ? (
<Modal>
<div
className={[styles.outer].join(" ")}
onClick={this.toggle}
>
你的输入有误!
</div>
</Modal>
) : null}
</>
);
}
}
export default App;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49