如何在 Next.js 中使用门户获取直接父容器之外的子元素?

Posted

技术标签:

【中文标题】如何在 Next.js 中使用门户获取直接父容器之外的子元素?【英文标题】:How to use portals in Next.js in getting the child element outside the immediate parent container? 【发布时间】:2020-07-28 05:34:38 【问题描述】:

当前实施

容器

export const FormContainer = () => 
    return (<Form/>);
  

组件

export const Form = () => 
    return ReactDOM.createPortal(
      <aside>
        <div>"I am a component"<div/>
      </aside>,
      document.body
    );
  

错误

ReferenceError: 文档未定义

期待

我希望表单脱离 FormContainer DOM 层次结构。

【问题讨论】:

嗨,您是在下一个 js 终端(您的 ide 终端)还是在浏览器控制台中收到此错误? @Pierfrancesco 在浏览器上收到此错误 【参考方案1】:

ReferenceError: 文档未定义

ReactDOM.createPortal 更像是一个“仅限浏览器端”组件,因为它需要document,而在服务器端渲染中,它是未定义的。

我希望表单脱离 FormContainer DOM 层次结构。

最简单的解决方案: 设置条件以检查 createPortal 组件的 BrowserOnly 渲染:

根据saimeunt answer,类似

export const FormContainer = () => 
    return (
        process.browser?
            <Form/>:null
        
    );

会成功的。

另一种方法是使用 nextJs dynamic import 并在模块上禁用 s-s-r

import dynamic from "next/dynamic";
const Form = dynamic(() => import("path/to/FormModule"),  s-s-r: false );


export const FormContainer = () => 
    return (<Form/>);
  

【讨论】:

以上是关于如何在 Next.js 中使用门户获取直接父容器之外的子元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 next.js 中获取图像宽度/高度?

在Next.js中使用React Portals创建弹窗

vue 自定义组件之父子组件

在 getServerSideProps() 中直接导入 next.js API 端点

当父组件在 Next.js 应用程序中更新其道具时重新渲染 React 子组件

如何使用 next.js 获取客户端 cookie?