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

时间:2017-01-04 12:15:48

标签: javascript reactjs react-router serverside-rendering

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

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

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,
};

在服务器中,窗口。 INITIAL_STATE 被替换为通过道具传入的实际数据:

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

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

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

问题是在服务器渲染期间没有定义上下文。它从来没有传过来。然后,当javascript包到达客户端时,它使用窗口。 INITIAL_STATE 变量并选择服务器停止的位置。它可以工作,但我不想做任何服务器端渲染。有什么我想念的吗?或者renderToString()不支持上下文?

1 个答案:

答案 0 :(得分:1)

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

但实际上,您甚至不应该在组件中包含window.__INITIAL_STATE__。相反,你也应该在data道具中传递你在客户端渲染<SsrDataProvider>的任何地方。

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