【发布时间】:2015-02-04 20:41:46
【问题描述】:
使用同构应用程序设置应用程序初始状态的一般做法是什么?如果没有 Flux,我会简单地使用类似的东西:
var props = { }; // initial state
var html = React.renderToString(MyComponent(props);
然后通过express-handlebars 渲染该标记并通过{{{reactMarkup}} 显示。
在客户端设置初始状态我会做这样的事情:
if (typeof window !== 'undefined') {
var props = JSON.parse(document.getElementById('props').innerHTML);
React.render(MyComponent(props), document.getElementById('reactMarkup'));
}
所以是的,基本上你在服务器和客户端设置了两次状态,但是 React 会比较差异,并且在大多数情况下,它不会通过重新渲染来影响性能。
当您在 Flux 架构中有操作和存储时,该原则将如何工作?在我的组件中,我可以这样做:
getInitialState: function() {
return AppStore.getAppState();
}
但是现在我如何从服务器设置 AppStore 中的初始状态?如果我使用没有传递属性的React.renderToString,它将调用AppStore.getAppState(),因为我仍然不明白如何在服务器上的商店中设置状态?
2015 年 2 月 5 日更新
我仍在寻找不涉及使用第三方 Flux 实现(例如 Fluxible、Fluxxor、Reflux)的干净解决方案。
2016 年 8 月 19 日更新
使用Redux。
【问题讨论】:
-
嗨,您找到没有第三方助焊剂实现的解决方案了吗?
-
你不能只添加 AppStore.setAppState({...}) 方法在服务器上使用吗? Node.js 是单线程和 renderToString 同步方法,它应该可以正常工作。
-
只需在组件中添加一个静态 getStore 并在 Store 中添加一个加载方法并在渲染之前加载数据。您可能还想向商店添加一个 createStore,以便在每次请求中加载新数据之前调用它。
标签: javascript express reactjs flux isomorphic-javascript