1. portal

Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案。

ReactDOM.createPortal(child, container)

1.1. createPortal 的基本使用

弹窗组件蒙层问题:注意关闭弹窗的时候将弹窗节点在生命周期 componentWillUnmount 中删除

// components/Dialog.js
import React, { Component } from 'react'
import {createPortal} from 'react-dom'

export default class Dialog extends Component {
  constructor(props) {
    super(props)
    this.node = document.createElement("div");
    document.body.appendChild(this.node);
  }
  componentWillUnmount() {
    document.body.removeChild(this.node);
  }
  render() {
    return createPortal(
      <div className="dialog">
        <h3>Dialog</h3>
        {this.props.children}
      </div>,
      this.node
    )
  }
}
// 弹窗组件的使用
import React, { Component } from 'react'
import Dialog from '../components/Dialog'

export default class DialogDemo extends Component {
  constructor(props) {
    super(props)
    this.state = {
      showDialog: false
    }
  }
  handleDialogToggle = () => {
    this.setState({
      showDialog: !this.state.showDialog
    })
  }
  render() {
    const {showDialog} = this.state
    return (
      <div>
        <button onClick={this.handleDialogToggle}>Dialog-Toggle</button>
        {showDialog && <Dialog>
          <p>this is dialog content</p>
        </Dialog>}
      </div>
    )
  }
}
Copyright © tomgou 2022 all right reserved,powered by Gitbook该文章修订时间: 2023-08-28 17:33:23

results matching ""

    No results matching ""