我正在构建一个通用应用程序,React
它通过和Redux
在服务器端呈现。NodeJS
ExpressJS
一切正常,Express 处理程序调用{match} from 'react-router'
并且new store instance
每次都会创建一个。
我遇到的问题是:{renderToString} from 'react-dom/server'
只呈现pristine
商店的版本,如果有东西改变了商店(例如:通过 调度的动作componentWillMount
),商店将被更新,但在调用generated markup
新的之前不会改变。renderToString
- 我不知道减速器将如何(按请求)更改状态,因此,我无法在调用之前提供初始状态
renderToString
。 - 我想避免再
renderToString
打电话。
这是我的示例代码:
const store = createStore(
reducers,
// an object that provides the initial generic state
res.viewModel.__INITIAL_STATE__ || Object.create(null),
middlewares
);
// now the store is pristine and calling store.getState()
// I will retrieve an invalid version of the state
const markup = renderToString(
<Provider store={store}>
{<RouterContext {...renderProps} />}
</Provider>
);
// now the store is correctly computed and calling
// store.getState() gets the right version but the markup
// generated is still old. Only recalling `renderToString` will get
// the right markup
const markup2 = renderToString(
<Provider store={store}>
{<RouterContext {...renderProps} />}
</Provider>
);