我正在使用带有 react-router 和 Reflux 的 React 作为我的数据存储,但我不确定如何最好地处理持久性以允许页面刷新。
我的组件使用 Reflux.connect 连接到存储,但由于存储从后端获取数据,因此在组件首次初始化和渲染时它还不可用。
当用户从一开始就进入我的应用程序时,所有这些数据都会按顺序加载并在需要时可用,但如果进一步向下触发页面刷新,react 会尝试渲染依赖于非数据的组件还在那里。
我通过不断地在 LocalStorage 中保存数据副本并从 Reflux 存储 getInitialState() 提供数据来解决这个问题,以便所有组件在渲染之前获取数据。
我想知道这是否是正确的方法。当由于某种原因本地存储数据被清除或损坏时,界面变为空白,因为组件无法访问正确的数据。子结构和属性不存在并触发 javascript 错误。这似乎是一个混乱且不可靠的解决方案。
我很想知道用什么模式来解决这个问题。
------ 编辑 ----- 回答 WiredPrairie 的评论:
1) 为什么要用 getInitialState 中的数据初始化组件?
当我的组件使用 Reflux.connect 时,它们在第一次渲染时还没有处于其状态的数据,因为存储仍然需要获取其数据。我的观点目前不能很好地处理未定义的数据。通过在 getInitialState() 中从 Reflux 存储返回本地存储的缓存,所有连接的组件都将在第一次渲染调用之前获取该数据。
2) 导致页面刷新的原因是什么,为什么不能以与第一次相同的方式加载数据?
这主要是我必须围绕 livereload 构建的一种解决方法,当我进行编辑时刷新页面(稍后会考虑使用 react-hotloader 但还不是一个选项),但用户也可以在我的嵌套视图中的某个地方点击刷新那将具有相同的效果。当他们手动刷新时,他们并没有在开始时进入应用程序。
3)当组件连接到商店的更改事件时,为什么它们不更新呢?
他们确实更新了,但就像我说的那样,他们现在不处理空数据,在第一次渲染时他们会错过它,等待商店获取东西。我可以使用空数据使我的所有视图优雅地工作,但这会增加很多样板代码。
从到目前为止的回复中,我感觉我正在使用 localStorage 做的是常用的方法。在 localStorage 或 sessionStorage 或类似的东西中本地缓存内容,并在刷新后立即提供该数据。
我应该通过在 localStorage 无法正常工作的奇怪情况下优雅地处理空数据来使我的观点更加稳健。