如何为具有列表/详细信息视图和分页的应用程序selectRedux状态形状?
想象一下,我的数据库中有很多条目(比如用户)。 我也有两条路线,一条是列表,另一条是细节(在哪里可以编辑条目)。 现在我正在努力如何处理数据结构。
我正在考虑两种方法,两种方法的组合。
共享数据集
- 我导航到
/list
,我所有的用户都是从api下载的,存储在redux存储中,在关键users
,我还添加了一些users_offset
和users_limit
来只呈现列表的一部分 - 然后我导航到
/detail/<id>
,并存储与<id>
作为val …这意味着我将能够得到我的用户数据像这样users.find(res => res.id === currently_selected_user)
- 因为我正在处理一个数据集和指向它的详细信息,所以更新也会很好,也很容易
- 添加一个新的用户也很容易,再次只是与相同的用户列表
现在我使用这种方法的问题是,当用户列表变得很大(比如数百万)时,下载可能需要一段时间。 而且,当我直接导航到/detail/<id>
,我还没有下载所有的用户,所以要获取我需要的数据,我必须先下载整个数据。 数百万用户只需编辑一个。
分离的数据集
- 我导航到
/list
,而不是从api下载所有的用户,我只下载其中的几个,这取决于我的users_per_page
和users_current_page
将被设置为,我可能将数据存储为users_currently_visible
- 然后导航到
/detail/<id>
,将/detail/<id>
存储为users_currently_visible
作为val …,而不是通过users_currently_visible
进行search,只需从api下载用户的数据。 - 在更新,我不会以任何方式更新
users_currently_visible
- 我也不会加上
我所看到的可能的问题是我必须在访问/list
再次从api下载数据,因为它可能与数据库中的数据不同步,我也可能不必要地下载用户数据,因为他们可能已经在我的users_currently_visible
某种frankenstein-y shenanigans
- 我详细说明,我在分离的数据集中做同样的事情,但不是直接从api下载用户的数据,我首先检查:
- 我有任何
users_currently_visible
- 如果是这样,有一个用户与我之间的身份证? 如果两者都是真实的,那么我将其用作我的用户数据,否则我会进行api调用
- 我有任何
- 同样发生在更新,我检查如果我的用户存在
users_currently_visible
如果是这样,我也更新该列表,如果不是我什么都不做
这可能会起作用,但并不真的觉得这是正确的方式。 我也可能还需要下载访问/list
users_currently_visible
新鲜/list
,因为我可能已经添加了一个新的..
是否有任何粉丝喜欢这样做的方式?我敢肯定,每个用户都必须遇到同样的事情。
谢谢!
请参阅Redux回购“真实世界”的例子 。
它显示了这个问题的解决scheme。
你的状态应该是这样的:
{ entities: { users: { 1: { id: 1, name: 'Dan' }, 42: { id: 42, name: 'Mary' } } }, visibleUsers: { ids: [1, 42], isFetching: false, offset: 0 } }
注意我分别存储entities
(ID – >对象映射)和visibleUsers
(描述当前可见用户的分页状态和ID)。
这似乎与您的“共享数据集”方法类似。 但是,我不认为你列出的缺点是这种方法固有的真正的问题。 让我们来看看他们。
现在我用这种方法的问题是,当用户名单变得巨大(比如说数百万)时,下载可能需要一段时间
你不需要全部下载! 将所有下载的实体合并到entities
并不意味着您应该查询所有这些entities
。 entities
应该包含迄今为止已经下载的所有实体 – 不是世界上所有的实体。 相反,您只能根据分页信息下载当前显示的内容。
当我直接导航到/ detail /时,我还没有下载所有的用户,所以为了获取数据,我将不得不下载它们。 数百万用户只需编辑一个。
不,你只要求其中一个。 响应动作会触发,而负责entities
会将这个单个实体合并到现有状态中。 只是因为state.entities.users
可能包含多个用户并不意味着你需要下载所有的用户。 将entities
视为不需要填充的caching。
最后,我会再次引导你回到Redux回购的“真实世界”例子 。 它显示了如何为分页信息和实体caching编写reducer,以及如何使用normalizr对API响应中的JSON进行normalizr
以便Reducer可以轻松地以统一的方式从服务器操作中提取信息。