我找到了一个简单的解决办法。
但我相信还有其他的可能性和更好的解决方案。
将Todo项保留在两个单独的集合中:
{
todos: {
byId: {
"1": { id: "1", title: "foo" },
"2": { id: "2", title: "bar" }
},
allIds: ["2", "1"],
pendingItems: [
{ title: "baz" },
{ title: "42" }
]
}
}
现在我可以在商店里“参照”找到它们。
// handle 'ADD_TODO_REQUEST':
const newTodoEntry = { title: action.payload.title };
yield put({ type: 'ADD_TODO_PENDING', payload: newTodoEntry });
try {
const response = yield api.addTodoEntry(newTodoEntry);
yield put({ type: 'ADD_TODO_SUCCESS', payload: { id: response.id, ref: newTodoEntry } });
} catch(error) {
yield put({ type: 'ADD_TODO_ERROR', payload: newTodoEntry });
}
减速器将如下所示:
case 'ADD_TODO_PENDING':
return {
..state,
pendingItems: // add action.payload to this array
}
case 'ADD_TODO_SUCCESS':
const newTodoEntry = { ...action.payload.ref, id: action.payload.id };
return {
..state,
byId: // add newTodoEntry
allByIds: // add newTodoEntry.id
pendingItems: // remove action.payload.ref from this array
}
case 'ADD_TODO_ERROR':
return {
..state,
pendingItems: // remove action.payload.ref from this array
}
有两个问题:
-
减速器
必须
使用对象引用。不允许reducer从的操作负载创建自己的对象
ADD_TODO_PENDING
.
-
由于存在两个不同的集合,因此无法在存储区内轻松对Todo项进行排序。
有两个解决方法:
-
使用客户端生成
uuid
只存在于项目内的S
pending
国家。这样,客户可以很容易地跟踪一切。
二
-
a)添加某种
insertAtIndex
属性设置为挂起项。然后,React组件代码可以合并这两个集合,并以自定义顺序显示混合数据。
-
b)保持物品分开。例如,服务器数据库中已持久化项列表上方和下方的挂起项列表。