【问题标题】:React Context undefined in Server Side Render在服务器端渲染中未定义反应上下文
【发布时间】:2017-01-04 12:15:47
【问题描述】:

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

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

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() 不支持上下文?

【问题讨论】:

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


    【解决方案1】:

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

    实际上,您甚至不应该在组件中包含window.__INITIAL_STATE__。相反,您还应该在客户端渲染 &lt;SsrDataProvider&gt; 的任何地方传递 data 属性。

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

    【讨论】:

    • 这就是我最终所做的。错误是使用数据的组件没有像这样将“上下文”传递给构造函数:constructor(props, context) 和 super(props, context)。
    猜你喜欢
    • 2019-10-18
    • 2017-01-14
    • 2017-05-06
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2020-06-27
    • 2016-07-16
    相关资源
    最近更新 更多