服务器端渲染中未定义的反应上下文
React Context undefined in Server Side Render
我正在尝试在一个简单应用程序的服务器端渲染期间传入数据。
我在服务器和客户端都有这个数据提供者,我使用一个全局变量将初始状态注入客户端:
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__
。相反,您还应该在客户端渲染 <SsrDataProvider>
的任何地方传入 data
道具。
export default class SsrDataProvider extends React.Component {
constructor(props) {
super(props);
this.state = {
data: props.data // || window.__INITIAL_STATE__
}
}
}
我正在尝试在一个简单应用程序的服务器端渲染期间传入数据。
我在服务器和客户端都有这个数据提供者,我使用一个全局变量将初始状态注入客户端:
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__
。相反,您还应该在客户端渲染 <SsrDataProvider>
的任何地方传入 data
道具。
export default class SsrDataProvider extends React.Component {
constructor(props) {
super(props);
this.state = {
data: props.data // || window.__INITIAL_STATE__
}
}
}