[英]React server side rendering with backend requests
我有一个React应用程序,通过Express进行服务器端渲染。 我有简单的App组件:
import React, { Component } from 'react';
export default class App extends Component {
constructor(props) {
super(props)
this.state = {
data: []
};
fetch('http://backend', {
mode: 'cors',
})
.then(res => res.json())
.then(data => this.state.data);
}
render() {
return (
<ul>
{this.state.data.map(item => (
<li key={item}>{item}</li>
))}
</ul>
);
}
};
问题(或更可能的功能)是fetch工作异步。 因此浏览器获取包含空数据的页面。
有没有办法从加载数据的服务器页面获取? 假设我想从带有加载帖子或其他内容的服务器页面获取。
或者我有什么不对劲?
您没有正确设置state
。 使用setState()
设置新状态,因为如果不使用setState()
方法就无法更新状态: https : //facebook.github.io/react/docs/react-component.html#setstate
fetch('http://backend', {
mode: 'cors',
})
.then(res => res.json())
.then(data => this.setState({data: data}));
此外,您添加的代码不是使用React的服务器端呈现。 您使用ReactDOMServer.renderToString()
方法进行服务器端呈现: https : ReactDOMServer.renderToString()
是的,即使你修复了setState()问题,你仍然会在获取之前渲染组件。 问题确实是fetch是异步的。
为了能够进行服务器端渲染后端调用,您需要等待所有后端调用,为所有组件设置props和state,然后将其渲染出去。
两个可以帮助您搞清楚事情何时完成的库是Redial( https://github.com/markdalgleish/redial )和redux-promise-counter( https://github.com/bitgenics/redux-promise-counter )如果您使用的是Redux。 更多关于以下内容。
您要解决的下一个问题是将数据传输到客户端并从中初始化组件,因此您不必再次在客户端上重做(全部)请求。
你可以手动完成所有这些工作,但如果你认真对待SSR,你应该选择像Redux这样的东西。 一种将所有应用程序状态存储在一个商店中的方法。 使结果更容易存储,将结果发送到客户端并从JSON初始化商店。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.