【发布时间】:2015-11-23 06:21:36
【问题描述】:
我希望我的基于 React 的 SPA 在服务器端呈现(现在不是)。因此,我想将 React 与 react-router、redux 和一些构建层(如 isomorphic starterkit)结合起来。
有hapi universal redux 连接在一起,但我正在努力如何组织我的流程。我的数据来自 REST API 的多个端点。不同的组件有不同的数据需求,应该在客户端及时加载数据。相反,在服务器上,必须获取特定路由(组件集)的所有数据,并将必要的组件呈现为字符串。
在我的第一种方法中,我使用 redux 的中间件来创建异步操作,它加载数据、返回一个承诺,并在承诺解决时触发一个 SOME_DATA_ARRIVED 操作。 Reducers 然后更新我的商店,重新渲染组件,一切都很好。原则上,这是可行的。但后来我意识到,在路由开始发挥作用的那一刻,流程变得很尴尬。
列出许多数据记录的某些组件有多个链接来过滤记录。每个过滤后的数据集都应该可以通过它自己的 URL 访问,例如 /filter-by/:filter。所以我使用不同的<Link to={...}> 组件来更改点击时的 URL 并触发路由器。然后路由器应该根据当前 URL 表示的状态更新存储,这反过来会导致相关组件的重新渲染。
这并不容易实现。我首先尝试componentWillUpdate 触发一个操作,该操作异步加载我的数据、填充存储并导致我的组件再次重新渲染循环。但这在服务器上不起作用,因为只支持 3 种生命周期方法。
所以我正在寻找正确的方式来组织它。从用户角度更改应用程序状态的用户交互应更新 URL。 IMO 这应该使路由器以某种方式加载必要的数据,更新存储,并开始协调过程。
所以interaction -> URL change -> data fetching -> store update -> re-render。
这种方法也应该在服务器上工作,因为从请求的 URL 中应该能够确定要加载的数据,生成 initial state 并将该状态传递给 redux 的 store 生成。但我没有找到一种方法来正确地做到这一点。所以对我来说,出现了以下问题:
- 我的方法是否错误,因为有些东西我还不理解/不知道?
- 是否可以在 redux 的
store中保留从 REST API 加载的数据? - 将
state保留在redux 中的组件store和其他人自己管理state是不是有点尴尬? -
interaction -> URL change -> data fetching -> store update -> re-render的想法是否完全错误?
我愿意接受各种建议。
【问题讨论】:
标签: reactjs react-router isomorphic-javascript redux