【发布时间】:2021-05-23 21:00:59
【问题描述】:
简介
一点警告:我确实使用 Redux Toolkit
我有一堆列表,其中一个应该是活动的。并且根据某些上下文,active 列表应该有所不同。 例如我有 3 个列表(A、B、C),让我们看看以下模式:
-
列表 B 处于活动状态,我决定创建一个新列表。创建 list D 后,list D 应该处于活动状态:
- 列表 D - 有效
- 列表 C
- 列表 B
- 列表 A
- 列表 B 处于活动状态,我决定更改页面。当我回来时,列表 B 应该像更改页面之前一样处于活动状态。
问题
当我从一开始就启动 setListsAction 时,它总是监听 firestore 并在我每次操作存储(添加、删除、更新)时被调用,然后将所有数据传递给减速器。因此,我无法控制实际执行了哪个操作。对于我的 setListsReducer 中的这种情况,我检查是否已经有一个活动列表,如果有,我不会更改它(在 examples 部分中涵盖我的第二个模式)。但是,使用这样的逻辑,我无法将 newly created list 设置为活动的,因为总会有一个活动的列表,这就是为什么在我的 createListAction 中我传递了一个新创建的列表到有效负载并在 createListReducer 我将有效负载设置为活动列表。但是,这种方法的警告是 setListsAction 和 createListAction 都会被触发,因此 redux 状态会连续更新两次,因此我的组件不需要重新渲染。 循环是这样的:
- 在 createListAction 我将列表添加到 firestore
- firestore 已更新,因此 setListsAction 被触发
- createListAction 调度已完成的操作。
我的代码
动作
setListsAction
export const subscribeListsAction = () => {
return async (dispatch) => {
dispatch(fetchLoadingActions.pending());
const collection = await db.collection('lists');
const unsubscribe = collection
.onSnapshot((querySnapshot) => {
const lists = querySnapshot.docs.map((doc) => {
const list = { ...doc.data(), id: doc.id };
return list;
});
dispatch(
fetchLoadingActions.fulfilled({
lists,
})
);
});
};
};
createListAction
export const createListActionAsync = (list) => {
return async (dispatch: Dispatch<PayloadAction<any>>) => {
dispatch(listsLoadingActions.pending());
const docList = await db.collection('lists').add(list);
const fbList = { ...list, id: docList.id };
dispatch(listsLoadingActions.fulfilled(fbList));
};
};
减速器
setListsReducer
builder.addCase(fetchLoadingActions.fulfilled, (state, { payload }) => {
state.lists = payload.lists;
const activeList = state.activeList
? payload.lists.find((l) => l.id === state.activeList.id)
: payload.lists[0];
state.activeList = activeList;
});
createListReducer
builder.addCase(listsLoadingActions.fulfilled, (state, { payload }) => {
state.activeList = payload;
});
总和
所以我希望你提出一个更好的方法来处理我的问题。我尝试在 docChanges 上使用更改类型来解决它,但是当我初始化 setListsAction 时,所有文档的更改都是 added 类型,解决方法可能会损坏应用程序的进一步实现.可能,我需要放弃实时数据库,改用get方法。
【问题讨论】:
标签: reactjs firebase redux google-cloud-firestore