react 组件进阶之 Portals

简介: Portals 翻译为门户,但是感觉不对。作用类似插槽,但是不是vue 里面的插槽哦,有点像vue3 里面的 teleport,两者的作用都是将对于的虚拟dom 插入到真实dom的某个位置上。这里不讲两者的区别,只讲 Portals 的用法

含义


Portals 翻译为门户,但是感觉不对。作用类似插槽,但是不是vue 里面的插槽哦,有点像vue3 里面的 teleport,两者的作用都是将对于的虚拟dom 插入到真实dom的某个位置上。这里不讲两者的区别,只讲 Portals 的用法


语法


ReactDOM.createPortal(child, container)


第一个参数(child)是任何可渲染的 React 子元素,例如一个元素,字符串或 fragment。第二个参数(container)是一个 DOM 元素。


用法


import React, { PureComponent } from 'react'
import ReactDOM from 'react-dom'
function CompB() {
  return (
    <div>
      我是子组件B
    </div>
  )
}
function CompA() {
  return ReactDOM.createPortal(
    (<div>
      我是子组件A
      <CompB></CompB>
    </div>),
    document.querySelector('#modal') as Element
  )
}
export default class TestComPortals extends PureComponent {
  render() {
    return (
      <div>
        我是挂载在跟组件的
        <CompA></CompA>
      </div>
    )
  }
}


效果


20210314123425656.png


20210314123752181.png


使用注意:


1.使用 Portals 改变的是真实dom结构,虚拟的dom 树是不会有变化的


2.注意改变的事件冒泡, 由于react 中的事件是由react 包装过后的,所以他的真实事件冒泡是通过虚拟的dom 树里面来进行冒泡的。


20210314124507791.png


效果


20210314124404229.png

相关文章
|
6月前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
114 0
|
4月前
|
存储 前端开发 JavaScript
react hooks 学习进阶
【7月更文挑战第12天】 React Hooks(自16.8版起)让函数组件能处理状态和副作用。useState用于添加状态管理,useEffect处理副作用,useContext共享数据,useReducer处理复杂状态逻辑,useRef获取引用。进阶技巧涉及性能优化,如useMemo和useCallback,以及遵循规则避免在不适当位置调用Hooks。理解异步更新机制和结合Redux等库提升应用复杂性管理。持续学习新技巧是关键。
50 0
|
6月前
|
前端开发 中间件 数据安全/隐私保护
React路由进阶方法
React路由进阶方法
57 1
|
6月前
|
存储 前端开发 中间件
React组件间的通信
React组件间的通信
49 1
|
6月前
|
前端开发 JavaScript API
React组件生命周期
React组件生命周期
114 1
|
6月前
|
存储 前端开发 JavaScript
探索 React Hooks 的世界:如何构建出色的组件(下)
探索 React Hooks 的世界:如何构建出色的组件(下)
探索 React Hooks 的世界:如何构建出色的组件(下)
|
6月前
|
缓存 前端开发 API
探索 React Hooks 的世界:如何构建出色的组件(上)
探索 React Hooks 的世界:如何构建出色的组件(上)
探索 React Hooks 的世界:如何构建出色的组件(上)
|
6月前
|
前端开发 应用服务中间件 数据库
react服务端组件
react服务端组件
50 0
|
6月前
|
前端开发 JavaScript
快速上手React:从概述到组件与事件处理
快速上手React:从概述到组件与事件处理
|
6月前
|
资源调度 前端开发 JavaScript
React组件
React组件
61 0