我们可以在 NEXT JS 中有一个门户吗

Arm*_*yan 11 portal reactjs next.js react-portal

我在 React 应用程序中使用 Next JS,但在门户中创建模态时遇到问题,它抛出错误“目标容器不是 DOM 元素”。,这是我的代码。

import React, { useEffect } from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import classes from './listModal.scss';

const EditorListModal = (props) => {
  let container;
  if (typeof window !== 'undefined') {
    const rootContainer = document.createElement('div');
    const parentElem = document.querySelector('#__next');
    parentElem.appendChild(rootContainer);
    container = rootContainer;
  }
  const isShown = props.show ? classes['editor-listModal--open'] : '';
  const element = (
    <div className={`${classes['editor-listModal']} ${isShown}`}>
      // Modal Content
    </div>
  );

  return ReactDOM.createPortal(element, container);
};

EditorListModal.propTypes = {
  show: PropTypes.bool
};

export default React.memo(EditorListModal);
Run Code Online (Sandbox Code Playgroud)

lik*_*rRr 12

接受的答案不是最好的选择。当服务器呈现的内容与客户端不同时,您可能会遇到很多呈现问题。主要思想是在SSR和水化过程中具有相同的内容。在您的情况下,使用选项动态加载模态会更准确{ ssr: false }

作为第二个选项,请注意下一个示例。他们总是null在服务器和客户端的初始渲染期间返回,这是正确的方法。


Evg*_*nko 10

它会在 ssr 期间中断,因为 ssrcontainer未初始化。当没有门户时,您可以尝试跳过渲染:

return container ? ReactDOM.createPortal(element, container) : null;
Run Code Online (Sandbox Code Playgroud)