Javascript React服务器端呈现呈现不正确的内容
我正在使用react、Redux和react路由器开发react web应用程序,并使用服务器端渲染(使用express) 我面临的问题有点难以解释。我将尝试在以下步骤中解释它Javascript React服务器端呈现呈现不正确的内容,javascript,reactjs,redux,react-router,server-side-rendering,Javascript,Reactjs,Redux,React Router,Server Side Rendering,我正在使用react、Redux和react路由器开发react web应用程序,并使用服务器端渲染(使用express) 我面临的问题有点难以解释。我将尝试在以下步骤中解释它 您首先从URL(如)输入应用程序。express服务器将发送正确的内容,其中包括正确的页面源和DOM(来自chrome元素面板)作为初始加载 然后,让我们导航到另一个页面,例如(导航不会导致页面刷新,因为它是一个单页应用程序,当您使用浏览器进行刷新或从浏览器地址栏中的URL输入页面时,它仅向服务器提供SSR内容)到目前为
require('babel-register');
const express = require('express');
const React = require('react');
const ReactDOMServer = require('react-dom/server');
const ReactRouter = require('react-router');
const ReactRedux = require('react-redux');
const Store = require('./src/store/configureStore').default;
const routes = require('./src/routes').default;
const compression = require('compression');
const morgan = require('morgan');
const store = Store();
const match = ReactRouter.match;
const RouterContext = ReactRouter.RouterContext;
const Provider = ReactRedux.Provider;
const port = process.env.PORT || 5050;
const ReactHelmet = require('react-helmet');
const Helmet = ReactHelmet.Helmet;
const app = express();
app.use('/dist', express.static('./dist'));
app.set('view engine', 'ejs');
app.use(compression());
app.use(morgan('combined'));
app.use((req, res) => {
// prettier-ignore
match(
{ routes, location: req.url },
(error, redirectLocation, renderProps) => {
if (error) {
res.status(500).send(error.message);
} else if (redirectLocation) {
res.redirect(302, redirectLocation.pathname + redirectLocation.search);
} else if (renderProps) {
console.log(renderProps);
const body = ReactDOMServer.renderToString(
React.createElement(
Provider,
{ store },
React.createElement(RouterContext, renderProps)
)
);
const meta = Helmet.renderStatic().meta.toString();
res.status(200).render('index', {body, meta});
} else {
res.status(404).send('Not found');
}
}
);
});
console.log('listening on port ' + port); // eslint-disable-line
app.listen(port);
我最终解决了这个问题 主要问题是我将异步数据获取调用放在
componentWillMount
生命周期方法中,而不是componentDidMount
我没有在我的应用程序中正确处理异步数据获取
我现在使用中提到的方法来处理异步数据获取问题
基本上,我正在做以下工作:
fetchData
fetchData
方法获取该组件所需的数据