React Portal 不在功能组件中生成子项

React Portal not generating children in functional component

我有简单的 React 门户组件。首先,我在 class 组件中编写了它,并且一切正常。但我决定将其重写为功能组件。在此门户之后,仅在 div#portal 内生成 div,但内部没有子级。不知道哪里错了

// Functional Component

import React, { useEffect } from 'react';
import { createPortal } from 'react-dom';

const Lightbox = ({ children }) => {
  const portalRoot = document.getElementById('portal');
  const el = document.createElement('div');

  useEffect(() => {
    portalRoot.appendChild(el);

    return () => portalRoot.removeChild(el);
  }, []);

  return createPortal(children, el);
};

export default Lightbox;

// Class component

// import { Component } from 'react';
// import ReactDOM from 'react-dom';

// const portalRoot = document.getElementById('portal');

// export default class Lightbox extends Component {
//   constructor() {
//     super();
//     this.el = document.createElement('div');
//   }

//   componentDidMount = () => {
//     portalRoot.appendChild(this.el);
//   };

//   componentWillUnmount = () => {
//     portalRoot.removeChild(this.el);
//   };
//   render() {
//     const { children } = this.props;
//     return ReactDOM.createPortal(children, this.el);
//   }
// }

您在每次更新时都创建了 const el = document.createElement('div');(因为它在主函数中),这是错误的。在 Class 组件中,你只在 constructor() 中创建了一次,所以每次它都在同一个 div 中,但在你的功能组件中,它在每个 render/update 上都会发生变化.

您可以将 eluseRef() 保持一致,例如:

const el = useRef(document.createElement('div')); 并将其用作 el.current