Next.js 服务器渲染组件窗口对象

Posted

技术标签:

【中文标题】Next.js 服务器渲染组件窗口对象【英文标题】:Next.js server rendered component window object 【发布时间】:2018-03-23 19:41:37 【问题描述】:

我有一个组件通过 js google api 库处理 google 登录。

export default class Index extends React.Component 
  componentDidMount() 
    window.onGoogleLoginSuccess = this.onGoogleLoginSuccess.bind(this)
  

  render() 
    return (
      <div
          className="g-signin2"
          data-onsuccess="onGoogleLoginSuccess"
          data-theme="dark"
      />
  
 

由于我使用 express 作为我的服务器,因此组件正在服务器中呈现。

我放了一些日志,发现服务器中正在调用渲染方法,并且从未调用过componentDidMount。

当 next.js 在服务器中渲染组件时,是否有任何回调可以放置一些将在客户端执行的代码?我可以在哪里访问窗口对象。

【问题讨论】:

从未调用过 (componentDidMount)?根据 next.js 文档“此生命周期方法将仅在客户端上执行。”。您是否检查过组件是否实际安装在客户端? @PieroDivasto 它永远不会被调用。由于在服务器端调用了 render 方法,我认为该组件正在安装在服务器端。我的问题是,当组件安装在服务器端时,是否有任何回调方法可以放置在客户端执行的代码。 【参考方案1】:

onComponentDidMount 是访问window 的正确位置,因为组件安装在客户端(但渲染发生在客户端和服务器上)。

也许这不是完整的组件,但在您的示例中似乎不存在 this.onGoogleLoginSuccess 的任何内容,因为 this 将引用该上下文中的反应实例。

【讨论】:

我没有提供实现,因为示例不需要,但我已经实现了方法。我的代码正在运行,但我添加了一个快速服务器以在路由中进行一些验证,现在不再调用 onComponentDidMount。 我发现问题是由我的js文件中的错误引起的,由于Chrome无法解析文件,它停止执行并且从未执行过onComponentDidMount。我会接受你的回答,因为正是因为她,我才确定问题不在 next.js 流程中。感谢您的帮助。

以上是关于Next.js 服务器渲染组件窗口对象的主要内容,如果未能解决你的问题,请参考以下文章

在页面加载时将道具传递给子组件 - 与 next.js 做出反应

next.js的框架

react-html5video 是不是与服务器端渲染兼容? (使用 next.js)

使用 next.js 调整窗口大小时无法居中我的图像

next js 中基于路由的条件组件渲染

服务器端渲染不适用于生产构建 Next.js