我有一个应用程序,它使用同步API来获得其数据,并要求将所有数据存储在本地。数据集本身非常大,我不愿意将其存储在内存中,因为它可以包含数千条记录。由于我不认为实际的数据结构是相关的,让我们假设我正在构建一个需要离线访问的电子邮件客户端,并且我希望我的存储机制是IndexedDB (异步)。
我知道一个简单的解决方案是不将数据结构作为状态对象的一部分,只使用所需的数据填充状态(例如,在触发EMAIL_OPEN操作时将电子邮件内容存储在状态中)。这很简单,特别是使用redux-thunk。
然而,这意味着我需要折衷两件事:
关于如何将redux与非内存状态属性一起使用,有什么最佳实践吗?我发现最难理解的事情是redux依赖于同步API,所以我不能用异步状态对象替换我的状态对象(除非我完全删除redux并用我自己的异步实现和连接器替换它)。
我用谷歌找不到答案,但如果在这个主题上已经有很好的资源,我也很乐意被指出。
更新:问题已经回答,但我想更好地解释我是如何实现它的,以防有人遇到它:
其主要思想是使用redux reducers维护客户端和服务器的更改列表,并使用连接器侦听这些更改列表以更新IDB,并使用客户端更改更新服务器:
这种方法唯一的警告是,因为实际状态存储在IDB中,所以我们确实失去了拥有一个状态对象的一些价值(而且更难倒带/快进状态)
发布于 2015-12-01 22:33:43
我认为你的第一个预感是正确的。如果(!)你不能把所有东西都储存在商店里,你必须在商店里储存更少的东西。但我相信我可以让这个解决方案听起来更好:
IndexedDB只是成为另一个端点,就像您使用的任何服务器应用程序接口一样。当您从服务器获取数据时,您将其转发到IndexedDB,然后从那里填充您的存储。只要它不会变得太大或太陈旧,商店就会得到它需要的东西,并缓存它。
这真的与Facebook使用他们的API没有什么不同。商店里永远不会有一个用户的所有数据。引用是使用ID实现的,这些ID在需要时加载。
你可以把你所有的逻辑都放在redux中。只需像往常一样为用户操作和数据更改创建操作,获取所需的数据并对其进行处理。接口仍然完全由用户数据定义,因为在需要时,您始终在存储中有需要的信息,以获取其剩余部分。它只是有点压缩,也就是说,你只保存消息总数或邮箱的ID,直到用户导航到它。
https://stackoverflow.com/questions/33992812
复制