用户可以访问项目列表,并具有搜索、排序和更改页面的能力。API返回经过分页、排序和过滤的项。当一些参数改变时,新数据应该如何与当前状态合并?仅仅将它们合并在一起是行不通的,因为当用户输入搜索查询时,并不是所有的项都应该显示出来,例如
我的想法:
- 擦除所有内容并存储新数据。似乎效率低下,因为相同的项目将被加载多次。
- 有一个单独的减速器。这种方法会产生重复,使应用程序更加复杂。
这样做的一种方法是存储每个查询,page只是另一个查询参数:
{
//the key is the query sent to the api
// this could be an url query string or
// the query object to json
'page=1&sort-by=first&desc' : {
//status of the request (explains itself)
requested:true,
loading:false,
error:false,
result:[2,1]//ids in this page
},
//here are all the data items with their own status
data: {
"1":{
//request status (you may want to get)
// just one item by id
requested:true,
loading:false,
error:false,
//the actual entity
result: {
id: 1,
first:'z'
}
},
"2":{
//loading, requested ...
result: {
id:2,
first:"a"
}
}
}
}
当你执行crud操作时,你应该清除state中的所有数据,因为你正在服务器上进行排序和/或过滤,所以任何更新都可能改变任何页面集。您可以添加状态stale
和refreshing
,以便组件可以显示过时的数据,但在后台刷新它。通常情况下,你会在service worker中做缓存,但由于redux需要你的请求状态,你可以增加额外的工作量,并在(think) actions和selector中实现它。