【问题标题】:Can we have a portal in Next.js我们可以在 NEXT JS 中有一个门户吗
【发布时间】:2020-04-11 03:29:42
【问题描述】:

我在我的 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);

【问题讨论】:

标签: reactjs next.js portal react-portal


【解决方案1】:

因为container 没有初始化,它会在ssr 期间中断。没有传送门时可以尝试跳过渲染:

return container ? ReactDOM.createPortal(element, container) : null;

【讨论】:

    【解决方案2】:

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

    作为第二个选项,请在 next's example 上记笔记。他们总是在服务器和客户端的初始渲染期间返回null,这是正确的方法。

    【讨论】:

    • 我赞成。如果你在不同的渲染过程中扩展不同内容导致的渲染问题,我想这对遇到这个问题的人会很有帮助。
    • @EvgenyTimoshenko 我认为将link 用单引号放在这里就足够了:“您应该将不匹配视为错误并修复它们”
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多