React.renderComponentToString()
是同步的,这使得无法加载任何异步数据,因为组件层次结构是在服务器上呈现的。假设我有一个通用的评论组件,我可以将它放在页面的任何位置。 它只有一个属性,某种标识符(例如下方文章的ID,在其中放置评论),其他所有内容都由组件本身处理(加载、添加、管理评论)。
我非常喜欢Flux架构,因为它使很多事情变得更容易,而它的stores非常适合在服务器和客户端之间共享状态。一旦我的包含评论的存储库被初始化,我可以将其序列化并从服务器发送到客户端,然后在客户端轻松恢复。
问题是什么是填充我的存储库的最佳方法。在过去的几天里,我已经搜索了很多,并且找到了几个策略,但没有一个看起来真正好,考虑到React的这个特性被“推广”了多少。
- 我认为,最简单的方法是在实际渲染开始之前填充所有我的存储库。那意味着在组件层次结构之外的某个地方(例如连接到我的路由器)。这种方法的问题是,我基本上必须两次定义页面结构。考虑一个更复杂的页面,例如带有许多不同组件的博客页面(实际博客文章、评论、相关文章、最新文章、Twitter流...)。我必须使用React组件设计页面结构,然后在其他地方,我必须定义填充用于此当前页面所需的每个存储库的过程。对我来说,那不像是一个好的解决方案。不幸的是,大多数等离子教程都是这样设计的(例如这个伟大的flux-tutorial)。
React-async。这种方法非常完美。它允许我在每个组件中简单地定义一个特殊函数,用于初始化状态(无论是同步还是异步都没问题),并在呈现到 HTML 时调用这些函数。它的工作方式是在状态完全初始化之前不呈现组件。问题在于它需要 Fibers,据我了解,它是一种更改标准 JavaScript 行为的 Node.js 扩展。虽然我非常喜欢结果,但我觉得与其找出解决方案,我们还不如改变游戏规则。我认为我们不应该被迫这样做才能使用 React.js 的核心功能。我也不确定这种解决方案的普遍支持性。能否在标准的 Node.js Web 主机上使用 Fiber?
我自己想了一下。我还没有仔细思考实现细节,但基本思路是我会类似于 React-async 中的方式扩展组件,然后重复调用 React.renderComponentToString() 在根组件上。在每次遍历过程中,我将收集扩展回调函数,然后在遍历结束时调用它们来填充存储器。我会重复这个步骤,直到当前组件层次结构所需的所有存储器都被填充。有许多问题需要解决,我特别不确定性能。
我错过了什么吗?还有其他方法/解决方案吗?现在我正在考虑使用 react-async/fibers 的方式,但像第二点中解释的那样,我并不完全确定。
GitHub 上的相关讨论。显然,没有官方的方法甚至解决方案。也许真正的问题是 React 组件的预期用法。像简单的视图层(几乎就是我的第一个建议)还是像真正独立的组件?