上一章ReactJS实战教程请查看:React实现Redux实例全解
【React Portal(插槽)用法全解 –
ReactJS实战教程】React 16.0版于2017年9月推出Reac portal,React portal提供了一种在其组件层次结构之外呈现元素的方法,即在一个单独的组件中。
在React 16.0版本之前,很难在父组件层次结构之外呈现子组件。如果我们这样做,它将打破组件需要作为新元素呈现的约定,并遵循父-子层次结构。在React中,父组件总是希望到达其子组件所在的位置。这就是React portal概念出现的原因。
语法
ReactDOM.createPortal(child, container)
这里,第一个参数(子参数)是组件,它可以是元素、字符串或片段,第二个参数(容器)是DOM元素。
React v16之前的示例通常,当你想要从组件的呈现方法中返回一个元素时,它会作为一个新的div挂载到DOM中,并呈现最近的父组件的子元素。
render() {
// React将一个新div加载到DOM中,并将子元素呈现到其中
return (
<
div>
{this.props.children}
<
/div>
);
}
使用portal的例子但是,有时我们希望将子组件插入DOM中的不同位置,这意味着React不想创建新div,我们可以通过创建React portal来实现这一点。
render() {
return ReactDOM.createPortal(
this.props.children,
myNode,
);
}
react portal的特点
- 它使用React版本16及其官方API创建portal。
- 它有React版本15的备份。
- 它将其子组件传输到一个新的React portal,该portal默认情况下附加到document.body。
- 它还可以针对用户指定的DOM元素。
- 它支持服务器端呈现
- 它支持返回数组(不需要包装器div)
- 它使用< Portal />和< PortalWithState />,因此灵活性和方便性之间没有折衷。
- 它不会产生任何DOM混乱。
- 它没有依赖,简约。
- modal模态框
- 工具提示
- 浮动菜单
- 小部件
$ npm install react-portal --save
React portal解释使用以下命令创建一个新的React项目。
$ npx create-react-app reactapp
打开App.js文件并插入以下代码片段。
App.js
import React, {Component} from 'react';
import './App.css'
import PortalDemo from './PortalDemo.js';
class App extends Component {
render () {
return (
<
div className='App'>
<
PortalDemo />
<
/div>
);
}
}
export default App;
下一步是创建portal组件并将其导入App.js文件。
PortalDemo.js
import React from 'react'
import ReactDOM from 'react-dom'function PortalDemo(){
return ReactDOM.createPortal(
<
h1>Portals Demo<
/h1>,
document.getElementById('portal-root')
)
}
export default PortalDemo
现在,打开Index.html文件并添加一个< div id=” portal-root” > < /div> 元素来访问根节点之外的子组件。
index . html
<
!DOCTYPE html>
<
html>
<
head>
<
meta charset="utf-8" />
<
link rel="shortcut icon" href="http://www.srcmini.com/%PUBLIC_URL%/favicon.ico" />
<
meta name="viewport" content="width=device-width, initial-scale=1" />
<
meta name="theme-color" content="#000000" />
<
link rel="manifest" href="http://www.srcmini.com/%PUBLIC_URL%/manifest.json" />
<
title>React App<
/title>
<
/head>
<
body>
<
noscript>需要启用JavaScript才能运行此应用程序.<
/noscript>
<
div id="root"><
/div>
<
div id="portal-root"><
/div>
<
/body>
<
/html>
使用react start运行以上的react程序,然后,打开Inspect (ctrl + shift + I),在这个窗口中,选择Elements部分,然后单击< div id=” portal-root” >< /div>组件。在这里,我们可以看到每个标记都位于“portal-root”DOM节点之下,而不是“root”DOM节点之下。因此,我们可以看到how React Portal提供了跳出根DOM树的能力。
推荐阅读
- React使用错误边界处理错误 – ReactJS实战教程
- React实现Redux实例全解 – ReactJS实战教程
- React Redux架构基本概念解释 – ReactJS实战教程
- React Flux架构和MVC架构的区别 – ReactJS实战教程
- React Flux架构基本概念解析 – ReactJS实战教程
- React钩子函数用法详解 – ReactJS实战教程
- React使用上下文 – ReactJS实战教程
- React使用代码分离 – ReactJS实战教程
- React高阶组件用法 – ReactJS实战教程