javascript - 服务器端渲染中未定义 React Context

标签 javascript reactjs react-router server-side-rendering

我正在尝试在服务器端渲染期间传递一个简单应用程序的数据。

我在服务器和客户端都有这个数据提供程序,并且我使用全局变量将初始状态注入(inject)客户端:

import React, { Component } from 'react';

export default class SsrDataProvider extends Component {
  constructor(props) {
    super(props);
    this.state = { data: window.__INITIAL_STATE__ };
  }

  getChildContext() {
    return { data: this.state.data };
  }

  render() {
    return this.props.children;
  }
}

SsrDataProvider.propTypes = {
  children: React.PropTypes.object,
};

SsrDataProvider.childContextTypes = {
  data: React.PropTypes.object,
};

在服务器中,window.INITIAL_STATE 被替换为通过 prop 传入的实际数据:

renderToString(<SsrDataProvider {...renderProps} data={data} />)

并且数据提供者呈现路由器上下文而不是子项...

render() {
  return <RouterContext {...this.props} />;
}

问题在于服务器渲染期间未定义上下文。就好像它根本没有被传入一样。然后,当 javascript 包到达客户端时,它使用 window.INITIAL_STATE 变量并从服务器中断的地方继续。它有效,但我最好不进行任何服务器端渲染。我有什么遗漏的吗?或者 renderToString() 可能不支持上下文?

最佳答案

您应该根据 props.data 设置初始状态如果已定义。

实际上,您甚至不应该包含 window.__INITIAL_STATE__组件内部。相反,您还应该传递 data prop 无论您在何处渲染 <SsrDataProvider>在客户端。

export default class SsrDataProvider extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: props.data // || window.__INITIAL_STATE__
    }
  }
}

关于javascript - 服务器端渲染中未定义 React Context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41463616/

相关文章:

reactjs - 我如何使用导航将 Prop 传递到下一个屏幕

javascript - 渲染 subview ,维护历史记录而不重新渲染整个 View 。这可能吗?

reactjs - 在 componentDidMount() 之后停止渲染组件

javascript - 访问变量的值

javascript - 突出显示窗体边框不起作用

javascript - 在 Cypress 中通过 HTML 查找元素

javascript - 如何动态访问嵌套错误/触及 formik 字段

javascript - Flask-assets - 如何防止特定应用程序的静态 js 文件被另一个应用程序使用

javascript - 使用 three.js 在场景中只显示一个粒子

android - 在 android 设备中改变方向时不显示布局的立即变化 react native